我可以在MySQL查询中使用变量作为表名吗?

时间:2013-05-02 12:08:38

标签: php mysql

我想要一个带有变量的MySQL查询作为表。这是我正在寻找的:

mysql_query("SELECT * FROM $var WHERE $anothervar ='1'"))

我该怎么做?

8 个答案:

答案 0 :(得分:3)

首先,停止使用mysql_个功能。它们已被弃用。查看mysqliPDO

使用PHP查询数据库时,您可以根据需要构建整个查询。您可以键入完整查询或为更多动态查询添加变量。你所做的是正确的(除了右边的双括号)。

<?php
$query = "SELECT * FROM users WHERE id ='1'";

//the above will be the same as

$var = 'users';
$anothervar = 'id';
$query = "SELECT * FROM $var WHERE $anothervar ='1'";

//execute query.
?>

所以是的,你可以在PHP中构建查询时使用变量表名。您需要记住,您使用的所有变量都可能导致SQL注入。因此,如果要从用户输入获取表名和列名的值,请确保正确验证它们!

简单地使用mysql_real_escape_string()mysqli_real_escape_string()不会对表名和列名起作用,因为它们没有用引号括起来。如果您收到列/表的用户输入并且是连接查询,那么我的投票将用于白名单。 EG:

<?php
$allowed_tables = array("users", "articles", "messages");

if (!in_array($var, $allowed_tables)) {
  echo 'Invalid table';
  exit();
}
?>

另一个好的读物是how-to-prevent-sql-injection-in-php,它也会进入参数化查询,这基本上就是你想做的事情,但后来以更安全的方式连接字符串。

答案 1 :(得分:2)

将您的SQL查询编写为

mysql_query("SELECT * FROM $var WHERE anothervar ='1'");

你已经放置了没有分号的额外括号,我相信它肯定会工作。

答案 2 :(得分:1)

你会讨厌我的回答,但我真的相信它是正确的(如果不是直接的那个)。

如果可能的话,我会避免这种做法(或者至少要确保你消毒'输入')。在不知道这些变量来自何处的情况下,我会说你已经离开了自己的sql注入攻击。当然,通过参数化创建动态sql更加困难,但如果你能以任何其他方式解决这个问题,请这样做。

最好不得不编写更多的代码,或者拥有一个不那么优雅的解决方案,而不是拥有一个干净的代码库和一个开放的门,让好奇的人能够访问你的dbms。

另外作为一种做法,我会考虑使用存储过程来支持内联sql。从长远来看,它将使您的sql更易于维护并为您提供更好的灵活性。通过存储过程执行所需操作的方法是在过程中动态构建一个准备好的语句,但是这会打开与您现在尝试执行此操作的方式相同的SQL注入风险。 / p>

答案 3 :(得分:0)

您的查询看起来不错。只有一个额外的括号。请尝试使用以下代码。

mysql_query("SELECT * FROM $var WHERE $anothervar ='1'");

答案 4 :(得分:0)

mysql_query("SELECT * FROM $var WHERE $anothervar ='1'")); // TYPO ERR  ))


mysql_query("SELECT * FROM $var WHERE $anothervar ='1'");

IF $ var,$ anothervar已定义,并且GET ERROR ..TRY

mysql_query("SELECT * FROM `$var` WHERE `$anothervar` ='1'");

** mysqli is good

答案 5 :(得分:0)

除了其他答案所说的,如果$ var或$ anothervar可能是sql中的保留字,那么它们应该被反引号包围。

"SELECT * FROM $ var WHERE $ anothervar` ='1'“

我同意@Hugo你应该有$ var和$ anothervar允许值的白名单。

答案 6 :(得分:-2)

如果要在php中将array转换为string,请使用implode(sep,arr)函数。 如果您的$var是表名的array或类似名称,那么:

mysql_query("SELECT * FROM ". implode(',',$var) ." WHERE $anothervar ='1'")

注意:如果您的表名与mysql中的关键字相同,则此代码不起作用。 因此,为了防止这种情况,请更改以下代码:

mysql_query("SELECT * FROM `". implode('`,`',$var) ."` WHERE `$anothervar` ='1'")

答案 7 :(得分:-3)

你应该使用这样的东西:

mysql_query("SELECT * FROM " . $var . " WHERE " . $anothervar . " ='1'"))