我有一个名为mycode的文本区域,它接收一个代码列表:
1234
3456
7654
3456
等...
我的php process.php
脚本接受代码:
$codes = $_POST['mycode'];
然后我尝试将$ code分解为名为$arr
的变量:
$arr = explode("\n", $codes);
接下来,我尝试将$arr
数组传入我的MySQL SELECT语句:
$sql = "SELECT code, name, FROM rawcodes where code IN ($arr)";
$rs=$conn->query($sql);
我从数据库中获取数据,但是它的记录没有代码但是有一个名称,因此很明显是创建了一个空数组,因此传递给了mysql语句。
我也尝试过:
$arr = explode(",", $codes);
这也会返回错误。
修改
我也尝试过:
implode('","',$arr)
所以我需要数据实际存在于数组中吗?
任何帮助表示感谢。
干杯
答案 0 :(得分:1)
可以尝试使用此
$in = "'".implode("','", array_filter(explode(" ", $codes))) . "'";
$sql = "SELECT code, name FROM rawcodes where code IN ($in)";
答案 1 :(得分:1)
在sql
中的,
后面有一个不需要的name
$sql = "SELECT code, name, FROM rawcodes where code IN ($arr)";
要
$sql = "SELECT code, name FROM rawcodes where code IN ($arr)";
答案 2 :(得分:1)
如果$_POST['mycode']
确实是带有空格分隔符的1234 3456 7654 3456
字符串,则会在“”上爆炸。您将帖子更改为换行符,因此我进行了相应更改。
此外,我建议跳过一些额外的箍来绑定每个部分作为参数,以防止注入攻击。 (实际上,你应该验证每个部分以确保它只包含数字!!)
棘手的部分是mysqli不允许您将参数数组绑定到一组标记。使用PDO可以更轻松地在SQL中使用':param'之类的'命名标签'。使用mysqli,您必须使用call_user_func_array来获取可变数量的参数。
// removed extra comma after 'name'
$values = explode("\n", $_POST['mycode']);
$placeholders = "";
$bindTypes = str_repeat("s", count($values));
$params = array(&$bindTypes);
for($i = 0, $len = count($values), $i < $len, $i++) {
// validate $values[$i] here!
if(strlen($placeholders)) $placeholders .= ", ";
$placeholders .= "p".$i;
$params[] = &$values[$i];
}
$sql = "SELECT code, name FROM rawcodes where code IN ($placeholders)";
$statement = $conn->prepare($sql);
// make params array act like a comma-separated argument list
call_user_func_array(array($stmt, 'bindparams'), $params);
$rs=$statement->execute();
// check return code, process results here