可能重复:
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之前神秘地切掉它。
任何人都可以向我解释为什么以及如何解决这个问题?
答案 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的整个屏幕长代码更安全。