0

可能重复:
PHP PDO 语句可以接受表名作为参数吗?

我正在编写一个脚本,允许用户注册并登录到我的网站。我使用 PDO 准备和执行来防止 SQL 注入。

像这样手动构建查询确实有效:

$a_query = "SELECT COUNT(*) FROM ". $login_table . " 
WHERE `username` = ". $my_username . "  
AND `password = " . $my_hash ;
$result_1 = $db->prepare($a_query);
$result_1->execute();

但是当我尝试像这样正确使用准备时,它不会:

$a_query = "SELECT COUNT(*) FROM :table 
WHERE `username` = :name
AND `password = :pass ;"
$result_1 = $db->prepare($a_query);
$result_1->bindParam(":table", $login_table);
$result_1->bindParam(":name", $my_username);
$result_1->bindParam(":pass", $my_hash);
$result_1->execute();

我从 $result_1->errorInfo[2] 收到的错误消息如下:

You have an error in your SQL syntax; check the manual that 
corresponds to your MySQL server version for the right syntax 
to use near ''customerlogin' WHERE `username` = 'guest' AND `password`
= 'qwerty' at line 1

如您所见,prepare() 在将查询发送到 mysql 之前神秘地切掉了查询的第一部分。

谁能向我解释为什么以及如何解决这个问题?

4

1 回答 1

0

如您所见,prepare() 在将查询发送到 mysql 之前神秘地切掉了查询的第一部分。

它不是。它只是实际执行此操作的错误消息处理程序,试图仅显示查询的相关部分。通常这样的错误消息意味着“查看此部分之前的查询”。:table所以 - 它在您的查询中指出。

您的查询不起作用,因为准备好的语句不支持标识符。

与任何其他原始 API 一样,PDO 不足以用于任何现实生活中的查询。开发人员应该在他们的应用程序代码中使用数据库抽象库方法,而不是原始 API 方法。

它将使生活更轻松,代码更短。例如,您的整个代码可以只写成 2 行:

$sql  = "SELECT COUNT(*) FROM ?n WHERE `username` = ?s AND `password = ?s";
$data = $db->getOne($sql, $login_table, $my_username, $my_hash);

它比使用原始 PDO 的整个屏幕长代码更安全。

于 2013-01-31T12:41:33.187 回答