SELECT查询中的php变量

时间:2014-09-07 23:54:07

标签: php

我在下面有这个代码,它应该从前一页传递$ ID,并将其构建到SELECT查询中:

$id = $_GET['id'];
echo $id; //THIS RETURNS THE CORRECT ID OF 1
$result = mysqli_query($con,"SELECT * FROM list_$id");

但是,SELECT代码实际上完全转换为:“SELECT * FROM list_ $ id”而不是正确的语法:“SELECT * FROM list_1”

我也尝试这样做:SELECT * FROM list _ {$ id}“并得到了相同的错误语法。如何正确地将$ id引入SELECT报价?

3 个答案:

答案 0 :(得分:2)

尝试string concatenation

"SELECT * FROM list_".$id

答案 1 :(得分:0)

tldr; 显示的测试用例和报告的结果不正确,并且无法准确表示问题。正常double-quote interpolation在这里可以正常工作(但是,为了防止在类似情况下可能的SQL注入,应该使用白名单)。

真正的问题可能是使用单引号,它们不受变量插值(或各种字符转义)的影响。以下real demo code显示了不同的表达式和实际的结果。

$world = "world!";

echo "Hello_$world\n";         // Hello_world!   (simple interpolation)
echo "Hello_{$world}\n";       // Hello_world!   (if $world can be word-continued)
echo "Hello_" . $world . "\n"; // Hello_world!   (concatenation)
echo 'Hello_$world\n';         // Hello_$world\n (single quotes, no interpolation)

答案 2 :(得分:0)

如果您真的要在真实网站上使用它,那么安全的方法是

$tables = array('list_1', 'list_2', 'list_3',) // And any other possible table names
$id = $_GET['id'];
$tableName = 'list_' . $id;
if (!in_array($tableName, $tables))
{
    // Its not a valid table so quit execution
}
$result = mysqli_query($con,"SELECT * FROM {$tableName}");

永远不要将客户端的变量直接放入查询