更改mysql字段中的数据时出现“mysql_fetch_assoc()”错误

时间:2012-02-24 13:01:48

标签: php mysql

我有一个mySQL数据库,我从那里通过PHP获取一些数据。

这就是我所拥有的:

if ($db_found) {

    $URL_ID = $_GET["a"];

    $SQL = "SELECT * FROM tb_employees WHERE URL_ID = $URL_ID";
    $result = mysql_query($SQL);

    while ($db_field = mysql_fetch_assoc($result)) {
        $firstname = $db_field['firstname'];
        $surname = $db_field['surname'];
        $function = $db_field['function'];
        $email = $db_field['email'];
        $telnr = $db_field['telnr'];
    }

    mysql_close($db_handle);
}
else {
    print "Database not found... please try again later.";
    mysql_close($db_handle);
}

我的mySQL数据库中的URL_ID字段,例如,001.当我访问www.mydomain.com/index.php?a=001时,它获取所有数据,将其放入变量,我可以回答变量没有任何问题。

现在,我想更改URL_ID,并在mySQL数据库中将其更改为“62ac1175”。但是,当我进入www.mydomain.com/index.php?a=62ac1175时,我收到此错误消息:

  

警告:mysql_fetch_assoc()期望参数1是资源,   给出的布尔值   第17行的mydomain.com \ db_connect.php

mySQL中的字段的varchar(8)为type,utf8_general_ci为collat​​ion。

如果我将条目更改回001并将我的网址更改为?a = 001,则可以再次正常工作。

出了什么问题?

1 个答案:

答案 0 :(得分:1)

您没有在查询中进行任何错误检查,因此如果查询失败也难怪它会中断。 manual on mysql_query()或此reference question.

中概述了如何添加正确的错误检查

示例:

$result = mysql_query($SQL);

if (!$result)
 { trigger_error("mySQL error: ".mysql_error());
   die(); }

您的查询正在中断,因为您没有将输入包装在引号中。您可以避免仅针对整数的*引号(62ac1175不是)。尝试

$SQL = "SELECT * FROM tb_employees WHERE URL_ID = '$URL_ID'";

此外,您展示的代码容易受到SQL injection的攻击。使用库的适当卫生方法(如mysql_real_escape_string()用于您正在使用的经典mysql库),或切换到PDO和预处理语句。

在你的代码中,这看起来是这样的:而不是

$URL_ID = $_GET["a"];

DO

$URL_ID = mysql_real_escape_string($_GET["a"]);

*但是,如果你避免引用,mysql_real_escape_string()将无效,你需要手动检查参数是否实际上是一个整数。