Php 带有命名参数的PDO prepare生成错误的查询

Php 带有命名参数的PDO prepare生成错误的查询,php,pdo,Php,Pdo,可能重复: 我正在写一个脚本,允许用户注册和登录我的网站。Im使用PDO prepare和execute来防止SQL注入 像这样手动生成查询确实有效: $a_query = "SELECT COUNT(*) FROM ". $login_table . " WHERE `username` = ". $my_username . " AND `password = " . $my_hash ; $result_1 = $db->prepare($a_query); $result_

可能重复:

我正在写一个脚本,允许用户注册和登录我的网站。Im使用PDO prepare和execute来防止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();
但当我尝试像这样正确使用prepare时,它不会:

$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之前神秘地切掉了查询的第一部分

有人能解释一下我为什么和如何解决这个问题吗

如您所见,prepare()在将查询发送到数据库之前神秘地将其第一部分切掉 mysql

事实并非如此。只是错误消息处理程序实际执行了此操作,试图只显示查询的相关部分。通常,这样的错误消息意味着“查看此部分前面的查询”。因此,它在查询中的
:表中指出

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

PDO和任何其他原始API一样,不足以进行任何实际查询。 开发人员应该在应用程序代码中使用数据库抽象库方法,而不是原始API方法

它将使生活变得更简单,代码也更短。例如,您的整个代码只能分成两行:

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

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

绑定参数只能表示值,而不能表示SQL中的标识符。和
:表
不能是字符串值。