我正在使用.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);
?>
有什么建议吗?
答案 0 :(得分:4)
您根本不必将mysql_real_escape_string()添加到此查询中 只需保留您的代码即可。
答案 1 :(得分:1)
我认为mysql_real_escape_string
不适合与PDO一起使用,以逃避目的使用PDO quote
方法。
如文档中所述,prepare
和execute
语句不需要转义字符串:
为将使用不同参数值多次发出的语句调用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%'";