过去两周我一直在使用准备好的陈述,没有任何问题。今天,我完全不知道我在这里做错了什么。我使用与我在这里使用的相同技术进行了一些复杂的查询。
这是我想要执行的查询:
'SELECT username FROM ? WHERE password=?'
在完成这项工作之后,我尝试将其煮熟并尝试使用最简单的版本来构建。然而,这仍然导致语法错误。
我当前的代码:
...
// mysqli object created and connection established
if (!($stmt = $mysqli->prepare('Select * FROM ?')))
{
// Prepared statement for retrieving a user failed
echo 'Prepare failed: (' . $mysqli->errno . ') ' . $mysqli->error;
exit;
}
// Prepared statement for inserting a new user created
if (!($stmt->bind_param('s', $table)))
{
// Paramater binding failed
echo 'Binding parameters failed: (' . $stmt->errno . ') ' . $stmt->error;
exit;
}
...
错误:
准备失败:(1064)您的SQL语法出错;查看与您的MySQL服务器版本对应的手册,以便在#"'附近使用正确的语法。在第1行
非常感谢任何帮助!此外,请不要因为任何安全问题而投票给我,这是针对学校项目的,所以如果您愿意,可以提出建议以使其更加安全。我使用phpass来哈希密码。
答案 0 :(得分:2)
您无法将表名绑定到变量。您只能绑定将在查询时替换的值。
答案 1 :(得分:2)
成功
SELECT username FROM users WHERE password=?
因为应该只有一个用户表来从中选择密码。如果你反对,那么你必须开始上课。
答案 2 :(得分:0)
正如其他人所指出的,您可以在预准备语句中参数化数据库对象 - 数据库,表,列名等。我可以帮助我从高层次解释准备好的陈述的作用,其原因很清楚。
当准备好的陈述准备好时#34;数据库实际上为查询制定了查询执行计划,知道稍后一些实际数据将作为参数传入。这就是使预处理语句创建为防止SQL注入的原因,因为没有办法,只需传递" unsafe"查询的数据可以做除准备时计划之外的其他事情。
如果您不知道将在查询中执行的表,列等的名称,则无法执行此查询执行计划。