简单的准备语句中的MySQL语法错误?

问题描述 投票:0回答:3

过去两周我一直在使用准备好的陈述,没有任何问题。今天,我对自己在这里做错的事完全感到困惑。我一直在使用与此处使用的相同技术来进行一些复杂的查询。

这是我要执行的查询:

'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哈希密码。

php mysql mysqli prepared-statement
3个回答
2
投票

制作

SELECT username FROM users WHERE password=?

因为应该只有one个用户表才能从中选择密码。如果您认为相反,那么您必须重新开始上课。


2
投票

您不能将表名绑定到变量。您只能绑定将在查询时替换的值。


0
投票

正如其他人指出的那样,您不能在准备好的语句中对数据库对象(数据库,表,列名等)进行参数化。这可能有助于我从较高的角度解释准备好的语句的作用,并且原因很清楚。

当“准备好准备好的语句”时,DB实际会为查询制定查询的执行计划,因为知道稍后某些实际数据将作为参数传递。这就是使准备好的语句创建为防止SQL注入的原因,因为这样就没有办法,仅通过传递“不安全”数据就可以使查询执行除准备时计划的操作之外的其他操作。

如果您不知道将在查询中执行的表,列等的名称,则无法进行此查询执行计划。

© www.soinside.com 2019 - 2024. All rights reserved.