我如何将mysql_real_escape_string()添加到此QUERY?

时间:2012-01-16 17:37:23

标签: php mysql get

我正在使用.Jquery autocomplete函数,我想知道可以放置mysql_real_escape_string()的位置。我尝试了一些不同的想法,但我不确定。我收到错误...

Warning: mysql_real_escape_string(): Access denied for user 'www-data'@'localhost'

当我使用$ac_term = mysql_real_escape_string("%".$_GET['term']."%");时,我甚至不确定这是否是使用它的正确方法。

这就是我所拥有的......

<?php
if (!isset($_SESSION)) {
  session_start();
} 


try {
  $conn = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass);
}
catch(PDOException $e) {
    echo $e->getMessage();
}

$return_arr = array();

if ($conn)
{
    $ac_term = "%".$_GET['term']."%"; 

    $query = "SELECT 

    CONCAT_WS('', '(',User_ID,') ', UserName, ' (',AccessLevel,')') AS DispName,
    User_ID, UserName, AccessLevel

    FROM Employees
    WHERE UserName LIKE :term
    OR User_ID LIKE :term
    OR AccessLevel LIKE :term

";

    $result = $conn->prepare($query);
    $result->bindValue(":term",$ac_term);
    $result->execute(); 

while ($row = $result->fetch(PDO::FETCH_ASSOC)) {

        $row_array['value'] = $row['DispName'];
        $row_array['User_ID'] = $row['User_ID'];    
        $row_array['UserName'] = $row['UserName'];
        $row_array['AccessLevel'] = $row['AccessLevel'];

        array_push($return_arr,$row_array);
    }

}
$conn = NULL;
echo json_encode($return_arr);
?>

有什么建议吗?

4 个答案:

答案 0 :(得分:4)

您根本不必将mysql_real_escape_string()添加到此查询中 只需保留您的代码即可。

答案 1 :(得分:1)

我认为mysql_real_escape_string不适合与PDO一起使用,以逃避目的使用PDO quote方法。

如文档中所述,prepareexecute语句不需要转义字符串:

  

为将使用不同参数值多次发出的语句调用PDO :: prepare()和PDOStatement :: execute()通过允许驱动程序协商客户端和/或服务器端缓存来优化应用程序的性能查询计划和元信息,并通过消除手动引用参数的需要,有助于防止SQL注入攻击。

答案 2 :(得分:0)

预备语句参数不需要转义;这是他们的主要原因之一。

某些PDO驱动程序目前不支持repeating a named parameter。根据安装的PHP版本,您可能需要为每个值创建一个单独的参数。

答案 3 :(得分:-1)

您需要先创建连接。 mysql_real_escape_string()依赖于活动的MySQL连接;它试图假设您的凭据将允许您最有可能连接到localhost。

在使用mysql_real_escape_string()之前创建一个有效的,经过身份验证的mysql连接,并且至少该错误消息应该消失。

此外,使用它的最佳方式是:

$ac_term = mysql_real_escape_string($_GET['term']);

您的查询看起来像

$query = "SELECT ... FROM ... WHERE column LIKE '%$ac_term%'";