我有多个值通过POST表单(从上一页的多个复选框)传递,我将它们存储到数组$ vals中。现在我想编写一个查询字符串(在while循环中),根据循环中的距离,生成稍微不同的查询。
<?php
$vals=($_POST['selectedIDs']);
$i=0;
while($vals[$i] != NULL){
$query = "SELECT * FROM List foo WHERE foo.fooID = echo $vals[$i]";
$result = mysqli_query($link, $query);
if($result) echo "YES IT WORKS!";
$i += 1;
}?>
但它似乎没有这种方式?我认为通过使用双引号进行查询,
echo $vals[$i]
会在$ vals [$ i]中生成当前索引的实际值而不是文字字符串吗?这是发生了什么?我可以在mysql服务器接受的查询字符串中没有php吗?
我只想说我的服务器表中的fooID为'12345'。即使我设置$ vals ='12345'并写:
$query = "SELECT * FROM List foo WHERE foo.fooID = $vals";
$result = mysqli_query($link, $query);
if($result) echo "YES IT WORKS!";
它仍然不起作用。我想我的一般问题是:是否有可能在查询字符串中写入/获取变量值,如果没有,是否还有另一种解决方案?任何帮助表示赞赏。谢谢!
答案 0 :(得分:1)
您不应将未经过清理的$_POST
ed值放入SQL查询中。请查看使用paramaterized arguments and mysqli。
您可以使用以下语法输出变量:
$myVar = 'toast';
$combined = "I like $myVar";
但是,这对于数组来说无法正常工作。
对于一个数组,你会想要使用像php implode()
之类的东西来首先将你的数组转换为字符串。
答案 1 :(得分:1)
首先永远不要在循环中进行查询。
其次,从不使用直接$ _POST或$ _GET或任何客户端传入查询,因为您可能会受到sql注入的伤害。wiki以及clearing data for mysql in php
好的,应该怎么做(我只说第一个。第二个我不知道怎么做没有oop)。
<?php
$vals=($_POST['selectedIDs']);
$vals = implode(',',$vals);
$query = "SELECT * FROM List foo WHERE foo.fooID IN ($vals)";
$result = mysqli_query($link, $query);
while ($row = mysqli_fetch_row($result)) {
echo "YES IT WORKS!";
var_dump($row); //you will see all the data in one row
}
}?>
答案 2 :(得分:0)
您的SQL字符串中有一个额外的回显:
$query = "SELECT * FROM List foo WHERE foo.fooID = echo $vals[$i]";
应该是:
$query = "SELECT * FROM List foo WHERE foo.fooID = $vals[$i]";
通常,从用户输入构造SQL字符串是一个不错的想法。请改用预备语句。点击此处查看有关准备好的陈述的更多信息:
答案 3 :(得分:0)
谢谢你们的建议,但事实证明,由于语法错误(以及额外的echo语句),我的代码无法正确执行。我原来的代码在$ vals [$ i]附近缺少引号。这是一个mysql语法错误,因为它不接受foo.fooID = 12345但是foo.fooID ='12345'。这是解决它的最终代码
<?php
$vals=($_POST['selectedIDs']);
$i=0;
while($vals[$i] != NULL){
$query = "SELECT * FROM List foo WHERE foo.fooID = '$vals[$i]'";
$result = mysqli_query($link, $query);
if($result) echo "YES IT WORKS!";
$i += 1;
}?>