简单的预处理语句中的MySQL语法错误?

时间:2014-05-30 15:46:02

标签: php mysql mysqli prepared-statement

过去两周我一直在使用准备好的陈述,没有任何问题。今天,我完全不知道我在这里做错了什么。我使用与我在这里使用的相同技术进行了一些复杂的查询。

这是我想要执行的查询:

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

成功

SELECT username FROM users WHERE password=?

因为应该只有一个用户表来从中选择密码。如果你反对,那么你必须开始上课。

答案 2 :(得分:0)

正如其他人所指出的,您可以在预准备语句中参数化数据库对象 - 数据库,表,列名等。我可以帮助我从高层次解释准备好的陈述的作用,其原因很清楚。

当准备好的陈述准备好时#34;数据库实际上为查询制定了查询执行计划,知道稍后一些实际数据将作为参数传入。这就是使预处理语句创建为防止SQL注入的原因,因为没有办法,只需传递" unsafe"查询的数据可以做除准备时计划之外的其他事情。

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