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

2024-04-25

我正在制作一个 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

为了解决您收到的错误,mysql_real_escape_string() http://php.net/mysql_real_escape_string需要通过以下方式打开连接mysql_connect()。因为您没有,所以它尝试连接但失败(使用用户名matthew,而您的 PDO 正在连接root)。此外,您不能(或者,不应该) 连连看mysql_real_escape_string() and PDO- 他们是不同的图书馆。

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

如果您有一个查询将接受任何类型的变量,无论是来自$_POST or $_GET,或者开发人员在查询之前创建的 10 行变量,您应该使用准备好的语句(或者至少转义它,查看PDO::报价 http://php.net/manual/en/pdo.quote.php).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

何时使用 PDO 准备好的查询。 mysql_real_escape 错误 的相关文章

随机推荐