【问题标题】:MySQLi & mysql_real_escape_string() ErrorsMySQLi & mysql_real_escape_string() 错误
【发布时间】:2011-07-02 03:27:48
【问题描述】:

我正在使用 OOP 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"',我会得到预期的结果。

标签: php mysql mysqli


【解决方案1】:

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']为空,查询会失败。
  • 是的,这行得通。谢谢ircmaxwell & Capsule,你也是对的。奇怪的是它在我的旧服务器上运行良好。
  • @Capsule:转换为 int 将始终生成一个 int。如果$_GET['id'] 为空,它将返回0。所以最好不要引用它,因为数据库需要进行类型修改而不是 PHP...
  • 对不起,我的错。我通常在将随机的东西转换为我真正需要的东西之前过滤值,只是为了避免无缘无故地查询数据库。无论如何,让 PHP 或 MySQL 的转换速度更快的替补会很有趣 ;-)
  • @Pacerier:简单。因为您如何转义取决于您当前用于 mysql 连接的设置。根据您设置的首选项和设置,它将以不同的方式转义字符串。例如,假设您将字符集设置为ISO-8859-1,它会将0xbf27 转义为0xbf5c27,但如果您将字符集设置为GBK,它将转义为0x5cbf5c27。因为一个会创建一个无效的字符流,另一个不会。检查this out...
猜你喜欢
  • 1970-01-01
  • 2013-01-24
  • 1970-01-01
  • 1970-01-01
  • 2011-12-19
  • 2019-07-29
  • 1970-01-01
  • 2011-02-25
  • 2019-01-21
相关资源
最近更新 更多