简单的准备语句中的MySQL语法错误?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单的准备语句中的MySQL语法错误?相关的知识,希望对你有一定的参考价值。
过去两周我一直在使用准备好的陈述,没有任何问题。今天,我对自己在这里做错的事完全感到困惑。我一直在使用与此处使用的相同技术来进行一些复杂的查询。
这是我要执行的查询:
'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哈希密码。
答案
制作
SELECT username FROM users WHERE password=?
因为应该只有one个用户表才能从中选择密码。如果您认为相反,那么您必须重新开始上课。
另一答案
您不能将表名绑定到变量。您只能绑定将在查询时替换的值。
另一答案
正如其他人指出的那样,您不能在准备好的语句中对数据库对象(数据库,表,列名等)进行参数化。这可能有助于我从较高的角度解释准备好的语句的作用,并且原因很清楚。
当“准备好准备好的语句”时,DB实际会为查询制定查询的执行计划,因为知道稍后某些实际数据将作为参数传递。这就是使准备好的语句创建为防止SQL注入的原因,因为这样就没有办法,仅通过传递“不安全”数据就可以使查询执行除准备时计划的操作之外的其他操作。
如果您不知道将在查询中执行的表,列等的名称,则无法进行此查询执行计划。
以上是关于简单的准备语句中的MySQL语法错误?的主要内容,如果未能解决你的问题,请参考以下文章
在下面的代码片段中的剩余 ='passthrough' 处的代码中出现语法错误