【问题标题】:PHP variable as table name mysqliPHP变量作为表名mysqli
【发布时间】:2013-08-15 10:02:27
【问题描述】:

我正在使用$variables 处理应该能够处理多个表的功能。

但是我得到一个语法错误..

有效的代码。

$query = "INSERT INTO table_com (tableID, komNAME, komDATE, komHTML, komSTATUS) 
VALUES ('$pID','$name','$time','$kom','$status')";
if(!$mysqli->query($query)) { die($mysqli->error); }    

以及没有的代码

$sID = 'table':
$query = "INSERT INTO '$sID'_com ('$sID'ID, komNAME, komDATE, komHTML, komSTATUS) 
VALUES ('$pID','$name','$time','$kom','$status')";
if(!$mysqli->query($query)) { die($mysqli->error); }

只有表和列$variables 不起作用.. 这是 mysql_error:

You have an error in your SQL syntax; check the manual that corresponds to your 
MySQL server version for the right syntax to use near ''diy'_com ('diy'ID, 
komNAME, komDATE, komHTML, komSTATUS) VALUES ('1','cjkm,','1' at line 1

有没有办法解决这个问题?

【问题讨论】:

  • 这确实是另一个话题,但很重要:请格外小心逃避那些 Var。如果可能,使用 PDO w/prepared statements 以避免 SQL 注入的危险。
  • @Fuselwurm mysqli 也可以prepare statements,如果他使用mysqli,则不必使用PDO。
  • 谢谢 Richard A - 你拯救了我的一天
  • @JonatanKnudsen 没问题。

标签: php mysqli


【解决方案1】:

改变

$query = "INSERT INTO '$sID'_com ('$sID'ID, komNAME, komDATE, komHTML, komSTATUS) 
VALUES ('$pID','$name','$time','$kom','$status')";

进入

$query = "INSERT INTO `{$sID}_com` ({$sID}ID, komNAME, komDATE, komHTML, komSTATUS) 
VALUES ('$pID','$name','$time','$kom','$status')";

这样$sID 将与_com 分开解析。

我做了一个例子here

代码:

$sID = 'something';
echo "INSERT INTO `{$sID}_com` ({$sID}ID, komNAME, komDATE, komHTML, komSTATUS) 
    VALUES ('pID','name','time','kom','status')";

结果:

INSERT INTO `something_com` (somethingID, komNAME, komDATE, komHTML, komSTATUS) VALUES ('pID','name','time','kom','status')

请注意,为了解析器,我删除了变量。

【讨论】:

  • 了解表名或列名也应该转义或必须进行清理很重要。它们允许更少的合法字符,并且没有 API 为它们提供的转义功能,所以在尝试创建这些类型的动态查询时,请务必谨慎行事!另请注意,准备好的语句在这里没有帮助,因为它们只允许传递数据 - 查询本身也必须动态构造,这就是可能发生 sql 注入的地方。
【解决方案2】:

您对数据库设计的想法是错误的。 $sID 应该是一个表中的一个字段,而不是表名。

请将您的多表设置重新设计为一个表,其中 $sID 用于标识特定类别。它会为您节省一天而不是数周的痛苦。

【讨论】:

  • 嗨。你能给我一个eksample吗?我对此很陌生,所以每个提示都很重要。
猜你喜欢
  • 1970-01-01
  • 2019-07-10
  • 1970-01-01
  • 2021-11-16
  • 2011-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多