PHP和MySql有问题

时间:2010-05-30 18:02:00

标签: php mysql

我在制作这个看似简单的MySql查询工作时遇到了麻烦。谁能发现问题?

<?php
include "config.php";

$offerid = $_POST["offerid"];
$ip = $_SERVER["REMOTE_ADDR"];

mysql_query("INSERT INTO voted (offerid,ip) VALUES (".$offerid.",".$ip.")");
?>

5 个答案:

答案 0 :(得分:5)

您可能需要一些单引号:

 "INSERT INTO voted (offerid,ip) VALUES ('" . $offerid . "','" . $ip . "')"

您还应该使用intvalmysql_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 statementsPEAR::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。同样,它所描述的模块已被取代,但我发现它仍然很有趣且信息丰富。