我真的很困惑这个。
我正在尝试将代码列表传递给MySql语句,但不能以正确的格式传递它。
我的列表来自名为“uniquecode”的表单textarea
文本区域中的示例代码(全部在新行上)将是:
fg3456 tg7844 de3902 .. etc
我尝试用以下内容爆炸并破坏列表:
$ar = $_POST['uniquecode']
$in = "'".implode("','", explode("\n", $ar))."'";
然后将$ in的结果传递给Mysql语句:
$sql = "SELECT code, size, price from stock WHERE code IN ($in)";
当我回显$ sql时,我得到以下内容:
SELECT housecode, name, cost, size, price FROM stock where code IN ('fg3456 ','tg7844 ', ','de3902')
正如您只能看到最后一项,'de3902'格式正确。请注意,列表中的第一项有一个空格,然后是单引号,然后是逗号:'fg3456',
由于这个问题,当我尝试从查询中循环遍历结果集时,只返回最后一项:
$result = $mysqli->query($sql);
if ($result = mysqli_query($mysqli, $sql)) {
while($row = $result->fetch_array()) {
$code = $row['code'];
$name = $row['name'];
$size = $row['size'];
$price = $row['price'];
}
echo $code; //returns last item in the list: de3902
所以我的问题是如何将列表爆炸/内爆为Mysql查询的IN子句的正确格式,以便它正确读取并返回所有代码???
SELECT code, name, size, price from stock WHERE code IN ('fg3456','tg7844','de3902')
亲切的问候
答案 0 :(得分:1)
为什么你在\n
爆炸,似乎你应该在空间(' ')
上爆炸。否则,内爆看起来很好。
或者,您可以使用preg_replace
替换任意数量的空格(引用逗号引号)。
$in = "'" . preg_replace('/\s+/',"','", $ar) . "'";
。
答案 1 :(得分:1)
正如评论中所提到的,我会遍历您的值并为每个值添加一个问号,然后在准备好语句后将值绑定到这些占位符。现在你有一个SQL注入问题。
但是,为了确保使用您似乎接收的输入获得所需的字符串,可以使用preg_split()
在多个空格,制表符或换行符上进行爆炸。
$st = trim(" \n fg3456 tg7844 \n \n de3902 \n ");
$ar = preg_split('#\s+#', $st);
var_dump($ar);
$in = "'".implode("','", $ar)."'";
var_dump($in);
结果:
array(3) {
[0]=>
string(6) "fg3456"
[1]=>
string(6) "tg7844"
[2]=>
string(6) "de3902"
}
string(26) "'fg3456','tg7844','de3902'"
您可以使用第一部分来准备声明:
$st = trim(" \n fg3456 tg7844 \n \n de3902 \n ");
$ar = preg_split('#\s+#', $st);
$in = trim(str_repeat('?,', count($ar)), ',');
$sql = "SELECT code, size, price from stock WHERE code IN ($in)";
var_dump($sql);
结果:
string(57) "SELECT code, size, price from stock WHERE code IN (?,?,?)"
顺便说一下,我个人会使用PDO,因为这会使绑定更容易。