简单的准备语句中的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语法错误?的主要内容,如果未能解决你的问题,请参考以下文章

使用 PDO 准备好的语句 MySQL 错误

在下面的代码片段中的剩余 ='passthrough' 处的代码中出现语法错误

在 sql 语法中出现错误,vb.net 中的 mysql update 语句

准备好的语句语法错误

MySQL存储过程语法错误:if else

纠正我在 mysql 触发器中的语法错误