我一直在制作一个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
答案 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();