2

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

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

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

连接到数据库:

$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
4

2 回答 2

4

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

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

如果您有一个查询将接受任何类型的变量,无论是来自$_POSTor的数据$_GET,还是开发人员在查询前 10 行创建的变量,您应该使用准备好的语句(或至少转义它,检查PDO::报价)。

于 2012-10-23T19:39:49.200 回答
4

如果您使用的是 PDO,则不应使用mysql_real_escape_string. PDO 库有一个非常健壮的SQL 占位符方法,可以做得更好。

$STH = $dbh->query("SELECT * FROM tblusers WHERE username = :username");
$STH->bindParam(':username', $username);
$STH->setFetchMode(PDO::FETCH_ASSOC);  
$result = $STH->fetch();
于 2012-10-23T19:44:42.640 回答