我在制作这个看似简单的MySql查询工作时遇到了麻烦。谁能发现问题?
<?php
include "config.php";
$offerid = $_POST["offerid"];
$ip = $_SERVER["REMOTE_ADDR"];
mysql_query("INSERT INTO voted (offerid,ip) VALUES (".$offerid.",".$ip.")");
?>
答案 0 :(得分:5)
您可能需要一些单引号:
"INSERT INTO voted (offerid,ip) VALUES ('" . $offerid . "','" . $ip . "')"
您还应该使用intval
和mysql_real_escape_string
来避免SQL注入漏洞:
$sql = "INSERT INTO voted (offerid,ip) VALUES (" .
intval($offerid). ", '" .
mysql_real_escape_string($ip) . "')";
另一种可能更容易理解的选择是使用sprintf
:
$sql = sprintf("INSERT INTO voted (offerid, ip) VALUES (%d, '%s')",
$offerid, mysql_real_escape_string($ip));
答案 1 :(得分:1)
要将字符串值放入查询中,您必须对其执行2个操作:
将其括在引号
并转义特殊字符。
所以,查询必须是这样的:
INSERT INTO voted (text) VALUES ('I\'m a programmer')
有了这些知识,您可以轻松编写代码以进行有效查询:
$offerid = mysql_real_escape_string($_POST["offerid"]);
$ip = mysql_real_escape_string($_SERVER["REMOTE_ADDR"]);
$sql = "INSERT INTO voted (offerid,ip) VALUES ('$offerid','$ip')"
mysql_query($sql) or trigger_error(mysql_error().$sql);
请注意trigger_error
部分
它将为您提供有关任何错误的全面信息
答案 2 :(得分:0)
我的猜测是引用
mysql_query("INSERT INTO voted (offerid,ip) VALUES (\"".$offerid."\",\"".$ip."\")");
答案 3 :(得分:0)
<?php
include "config.php";
$offerid = $_POST["offerid"];
$ip = $_SERVER["REMOTE_ADDR"];
mysql_query("INSERT INTO voted (offerid,ip) VALUES ('".mysql_real_escape_string ($offerid)."','".mysql_real_escape_string ($ip)."')");
?>
这会在您插入的字符串周围添加单引号 - 以及mysql_real_escape_string php函数,它将逃脱(在前面添加反斜杠)任何安全风险字符。
答案 4 :(得分:0)
除了使用intval(...)
和mysql_real_escape_string(...)
之外,您还可以使用parameterized statements或PEAR::DB使用PEAR::MDB2(或占位符):
$dsn = "mysqli://testuser:testpass@localhost/test";
$conn =& DB::connect ($dsn); // using PEAR::DB, though it's been superseded
if (DB::isError ($conn)) {
die ("Cannot connect: " . $conn->getMessage () . "\n");
}
$result =& $conn->query ("INSERT INTO voted (offerid,ip) VALUES (?,?)", array($_POST["offerid"], $_SERVER["REMOTE_ADDR"]));
if (DB::isError ($result)) {
die ("INSERT failed: " . $result->getMessage () . "\n");
}
在PHP以外的平台上使用占位符和参数非常常见,所以理解它们背后的基本前提并不是一个坏主意。
如果您对使用这些数据库模块感兴趣,我建议您查看Paul DuBois的Writing Scripts with PHP's PEAR DB Module。同样,它所描述的模块已被取代,但我发现它仍然很有趣且信息丰富。