MySQLi和mysql_real_escape_string()错误

8

我正在使用面向对象的MySQLi连接我的数据库。我已经检查了我的凭据,一切都准备就绪。

    $mysqli = new mysqli(MYSQL_HOST, MYSQL_USER, MYSQL_PASS, MYSQL_DB) or die('There was a problem connecting to the database.');

    if (mysqli_connect_errno()) { 
       printf("Can't connect to MySQL Server. Errorcode: %s\n", mysqli_connect_error()); 
       exit; 
    }

    if ($result = $mysqli->query('SELECT * FROM places WHERE place_id=' . mysql_real_escape_string($_GET['id']))) { 
        while( $row = $result->fetch_assoc() ){ 
            printf("%s (%s)\n", $row['name'], $row['place_id']); 
        } 
        $result->close(); 
    } 

    $mysqli->close();

这段代码出现了一个错误:

Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access
denied for user '-removed-'@'localhost' (using password: NO) in
/var/www/vhosts/communr.com/httpdocs/pbd/places.php on line 396

Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to
the server could not be established in
/var/www/vhosts/communr.com/httpdocs/pbd/places.php on line 396

我无法弄清楚为什么会出现这些错误。最近我更换了服务器,查询之前我正在建立SQL连接。

你们认为我的新服务器可能出现了一些设置问题吗?

谢谢!


对我来说奇怪的是,如果我执行 'SELECT * FROM places WHERE place_id="' . mysql_real_escape_string(1354) . '"' 就会出错,但如果我执行 'SELECT * FROM places WHERE place_id="1354"' 就能得到预期的结果。 - ATLChris
1个回答

15

mysql_real_escape_string需要通过mysql_connect建立连接才能工作。$mysqli->real_escape_string需要一个mysqli对象才能工作。所以,

请使用MySQli::real_escape_string代替:

'SELECT * FROM places WHERE place_id='.$mysqli->real_escape_string($_GET['id']); 

但请注意,为了安全起见,您需要引用它。
'SELECT * FROM places WHERE place_id=\''.$mysqli->real_escape_string($_GET['id']).'\''; 

然而,由于它看起来像一个整数,你应该将其强制转换为整数,而不是转义它。
'SELECT * FROM places WHERE place_id='.(int) $_GET['id']; 

最好加上引号,因为如果$_GET['id']为空,查询将失败。 - Capsule
@Capsule:将其转换为int类型将始终生成int类型。如果 $_GET['id'] 为空,则会返回 0。因此最好不要引用它,否则DB需要进行类型转换而不是PHP... - ircmaxell
@ircmaxell,顺便问一下,为什么我们需要使用与MySQL的连接来清理一些输入?为什么不直接使用“离线”函数来清理输入? - Pacerier
1
@Pacerier:很简单。因为如何转义取决于您当前用于mysql连接的设置上下文。根据您设置的首选项和设置,它将以不同的方式转义字符串。例如,假设您将字符集设置为“ISO-8859-1”,它将把0xbf27转义为0xbf5c27,但如果您将字符集设置为“GBK”,它将把它转义为0x5cbf5c27。因为一个会创建无效的字符流,而另一个则不会。查看这个... - ircmaxell
MySQli::real_escape_string:非静态方法mysqli::real_escape_string()无法静态调用... - Mir-Ismaili
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接