0

我通过 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!";

它仍然不起作用。我想我的一般问题是:是否可以在查询字符串中写入/获取变量的值,如果没有,是否有其他方法可以解决我的情况?任何帮助表示赞赏。谢谢!

4

4 回答 4

1

您不应该将未清理的$_POSTed 值放入 SQL 查询中。研究使用 参数化参数和 mysqli

您可以使用以下语法输出变量:

$myVar = 'toast';
$combined = "I like $myVar";

但是,这不会像您希望的那样用于数组。

对于数组,您需要先考虑使用 php 之类的implode()方法将数组转换为字符串。

于 2013-06-02T23:05:16.437 回答
1

首先,永远不要在循环中进行查询。

其次,永远不要直接使用 $_POST 或 $_GET 或任何传入查询的客户端,因为您可能会受到 sql 注入的伤害。wiki在 php 中清除 mysql 的数据

好的,应该怎么做(我只说第一个。第二个我不知道如何在没有 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
}
}?>
于 2013-06-02T23:22:16.477 回答
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;
}?>
于 2013-06-03T07:58:26.890 回答
0

您的 SQL 字符串中有一个额外的回显:

$query = "SELECT * FROM List foo WHERE foo.fooID = echo $vals[$i]";

它应该是:

$query = "SELECT * FROM List foo WHERE foo.fooID = $vals[$i]";

通常,从用户输入构造 SQL 字符串是一个坏主意。请改用准备好的语句。在此处查看有关准备好的语句的更多信息:

http://php.net/manual/en/pdo.prepared-statements.php

于 2013-06-02T23:03:24.883 回答