何时使用PDO准备的查询。 mysql_real_escape错误

时间:2012-10-23 19:33:45

标签: php mysql pdo

我一直在制作一个php网站,在我的本地机器上进行开发。真的很新,所以这是我尝试过的第一件事。当我搬到我的主机时,我收到以下错误:

 Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied             for user 'matthew'@'localhost' (using password: NO)  on line 11

我在这里搜索了一下,我很确定它,因为我需要“准备”我的查询。我不确定的是准备什么时候是正确的,什么时候不准备。我在下面添加了一些问题来详细解释:

与db的连接:

$hostname = "localhost";
$username = "root";
$password = "root";

try {
    $dbh = new PDO("mysql:host=$hostname;dbname=wmpt", $username, $password);
//echo "Connected to database"; // check for connection
    }
catch(PDOException $e)
    {
    echo $e->getMessage();
    }

以下是一个示例查询:

$username = mysql_real_escape_string($_POST['run']);


$STH = $dbh->query("SELECT * FROM tblusers WHERE username = '$username' ");
$STH->setFetchMode(PDO::FETCH_ASSOC);  
$result = $STH->fetch();

我的问题是,如果我使用用户提交的数据查询/插入/更新数据库,我是否只需要“准备”查询?

以上查询是不好的做法?如果它不包含用户提交的数据,即我想查询

,该怎么办?
 $STH = $dbh->query("SELECT * FROM tblusers WHERE username LIKE '%hotmail%' ");

这可能是一个糟糕的例子,但我正在说明开发人员定义的查询。

这是我得到的原因,以及我如何避免:

Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for     user 'matthew'@'localhost' (using password: NO)  on line 11

2 个答案:

答案 0 :(得分:4)

要解决您收到的错误,mysql_real_escape_string()需要通过mysql_connect()打开连接。因为您没有,所以它尝试连接和失败(使用用户名matthew,而您的PDO正在与root连接)。此外,您不能(或不应该)混合搭配mysql_real_escape_string()PDO - 它们是不同的库。

关于“何时”使用预准备语句,一般的经验法则是每当值不是硬编码时。您LIKE '%hotmail%'的示例不需要准备,它是硬编码的,永远不会改变(当然,除非您手动更新它)。

如果您的查询将接收任何类型的变量,来自$_POST$_GET的be-it数据,或者开发人员在查询之前生成10行的变量,则应该使用准备好的陈述(或至少逃避它,检查PDO::quote)。

答案 1 :(得分:4)

如果您使用的是PDO,则不应使用mysql_real_escape_string。 PDO库具有非常强大的SQL placeholder method,可以做得更好。

$STH = $dbh->query("SELECT * FROM tblusers WHERE username = :username");
$STH->bindParam(':username', $username);
$STH->setFetchMode(PDO::FETCH_ASSOC);  
$result = $STH->fetch();