您好我是php的新手,我遇到了命名参数的困难。 我正在学习形式“Murach的php和sql book” 这是我的问题中的代码,
$query = 'SELECT productCode, productName, listPrice
FROM products
WHERE productID = :product_id';
$statement = $db->prepare($query);
$statement->bindValue(':product_id', $product_id);
$statement->execute();
$product = $statement->fetch();
$statement->closeCursor();
所以我的困惑在于“WHERE productID =:product_id';”这意味着什么?我不明白这一点。通常我们在那里制定条件,如WHERE productID< 100或类似的东西。那么它给出的所有productID值都小于100吗?那么这在这里如何运作?我的意思是我没有看到这个命名参数已经在其他任何地方分配了任何值。这是本书的一个例子。或者是在实际程序中我们为命名参数变量赋值,以便它提供适当的结果?如果听起来如此愚蠢,请帮助我,请原谅,因为我对此完全陌生。
答案 0 :(得分:2)
你正在过度思考命名参数。将其视为占位符。它本质上只是变量指向一旦它传递到服务器的参考。
使用预准备语句基本上通过分别传递查询和数据(绑定)来缓解SQL注入。
一旦解析到服务器,它将用:product_id
中的值替换$product_id
。
您最好阅读Prepared Statements,以便更好地了解实际情况。
答案 1 :(得分:1)
行$statement->bindValue(':product_id', $product_id);
将使用php变量:product_id
中的值替换SQL语句中的$product_id
。
它与说WHERE productID = 'somevalue'
相同,只是PHP会为你填写一些值。
这内置于PHP中,用于准备语句see here。由于PHP和数据库是两个不同的东西,他们为PHP构建了一种与数据库对象交互的方式,称为PDO(PHP数据对象),这基本上是一组从PHP内部与数据库交互的方法。 bindValue(上面链接)是MySQL PDO将变量添加到MySQL语句中的方法。
答案 2 :(得分:0)
发生的事情是数据库能够缓存和优化查询,它还用于防止SQL注入:
SELECT productCode, productName, listPrice FROM products WHERE productID = :product_id
如果您要传递这样的变量,那么由于$ product_id(因为它可能是一个变量号),必须解析并重新缓存该查询:
SELECT productCode, productName, listPrice FROM products WHERE productID = $product_id
如果$ product_id没有正确转义,有人可能会将$ product_id设置为123; DROP table products
,这会丢失你的表(不好)。
因此,发生绑定意味着在运行需要来自用户输入的值的查询时,可以提高效率和安全性。