";mysql_fetch_assoc()";mysql字段中的数据更改时出错


"mysql_fetch_assoc()" error when data in mysql field is changed

我有一个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=0.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),排序规则为utf8_general_ci。

如果我将条目更改回001并将URL更改为?a=0.001,它又正常工作了。

怎么了?

您没有在查询中进行任何错误检查,所以如果查询失败,它就会中断也就不足为奇了。mysql_query()手册或本参考问题中概述了如何添加正确的错误检查。

示例:

$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注入的攻击。使用库的适当卫生方法(如您正在使用的经典mysql库的mysql_real_escape_string()),或者切换到PDO和准备好的语句。

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

$URL_ID = $_GET["a"];

进行

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

*但是,如果您避免引号,mysql_real_escape_string()将不起作用,您需要手动检查参数是否真的是整数