使用命名参数准备PDO会生成错误的查询

时间:2013-01-31 12:35:47

标签: php pdo

  

可能重复:
  Can PHP PDO Statements accept the table name as parameter?

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

像这样的DOES工作手动构建查询:

$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之前神秘地切掉它。

任何人都可以向我解释为什么以及如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

  

正如您所看到的,prepare()在发送之前神秘地切掉查询的第一部分   MySQL的。

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

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

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

它将使生活更轻松,代码更短。例如,您的整个代码只能分为两行:

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

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