0

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

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

我怎样才能做到这一点?

4

8 回答 8

3

将您的 sql 查询写为

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

您在没有分号的情况下放置了额外的括号,我相信它肯定会起作用。

于 2013-05-15T03:24:48.127 回答
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()ormysqli_real_escape_string()不会对表名和列名起作用,因为它们没有用引号引起来。如果您收到用户对列/表的输入并且正在连接查询,我会投票支持白名单。例如:

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

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

另一个不错的读物是how-to-prevent-sql-injection-in-php,它也进入参数化查询,这基本上是您想要做的,但随后以更安全的方式连接字符串。

于 2013-05-14T11:19:18.647 回答
1

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

如果可能的话,我会避免这种方法(或者至少确保你清理你的“输入”)。在不知道这些变量来自哪里的情况下,我会说你已经让自己面临 sql 注入攻击。诚然,通过参数化创建动态 sql 更加困难,但如果您可以通过任何其他方式解决此问题,请这样做。

编写更多代码或拥有一个不太优雅的解决方案要比拥有一个干净整洁的代码库和一扇敞开的大门让好奇的头脑访问您的 dbms 要好得多。

作为一种实践,我会考虑使用存储过程来支持内联 sql。从长远来看,它将使您的 sql 更易于维护并为您提供更好的灵活性。通过存储过程做你想做的事情的方法是在过程中动态地构建一个准备好的语句,但这会让你面临与你现在尝试这样做的方式相同的 sql 注入风险。

于 2013-05-15T02:00:56.733 回答
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
于 2013-05-15T08:19:53.380 回答
0

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

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

我同意@Hugo 的观点,您应该有一个允许的 $var 和 $anothervar 值的白名单。

于 2013-05-15T09:17:57.477 回答
0

您的查询看起来没问题。只是多了一个括号。请尝试使用以下代码。

mysql_query("SELECT * FROM $var WHERE $anothervar ='1'");
于 2013-05-15T06:26:00.110 回答
-2

如果要转换arraystringphp,请使用implode(sep,arr)function. 如果您$vararray表名或类似名称,则:

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

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

mysql_query("SELECT * FROM `". implode('`,`',$var) ."` WHERE `$anothervar` ='1'")
于 2013-05-02T12:33:58.007 回答
-3

你应该使用这样的东西:

mysql_query("SELECT * FROM " . $var . " WHERE " . $anothervar . " ='1'"))
于 2013-05-02T12:22:43.787 回答