我在下面有这个代码,它应该从前一页传递$ 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报价?
答案 0 :(得分:2)
"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}");
永远不要将客户端的变量直接放入查询