我有一个多选字段
<select name="duration[]" id="duration" title="Duration" multiple="multiple" size="3">
<option value="1">1 Months</option>
<option value="2">2 Months</option>
<option value="3">3 Months</option>
</select>
我的php代码内存多个值,即123为1,2,3并将其插入数据库中。问题是该字段不是必填字段,当我将其留空时,它会给我错误(传递的参数无效)
我的PHP代码
$duration = array();
$duration = $_POST['duration'];
if($duration)
{
foreach($duration as $value)
{
$months[] = $value;
}
}
$sql = "SELECT * FROM tbl_courses WHERE duration IN (".implode($months, ',').") ";
提前致谢
答案 0 :(得分:2)
您遇到的两个问题是您试图破坏可能不是数组的用户输入,并且您的代码容易受到SQL注入攻击。
要解决这些问题,首先应检查它是否为is_array()
的数组,然后检查其是否包含count()
的元素,然后最终内爆,但使用array_map()
过滤值防止SQL注入。这不仅会阻止SQL注入,还会阻止查询中出现语法错误,因为必须在IN
子句中引用字符串。
function getInt($i) {
return (int)$i;
}
$inClause = '';
if(isset($_POST['duration']) && is_array($_POST['duration']) && count($_POST['duration']) > 0)
{
$inClause = 'WHERE ';
$inClause .= implode(', ', array_map('getInt', $_POST['duration']));
}
$sql = "SELECT * FROM tbl_courses $inClause";
答案 1 :(得分:1)
$duration = array();
$duration = $_POST['duration'];
$sql = FALSE;
if($duration&&is_array($duration))
{
foreach($duration as $value)
{
$months[] = $value;
}
$sql = "SELECT * FROM tbl_courses WHERE duration IN (".implode($months, ',').") ";
}
if($sql){
//do something with sql
}
使用is_array检查$ duration是否为数组。
答案 2 :(得分:0)
如果不需要,只需删除WHERE条件
$sql = "SELECT * FROM tbl_courses";
if (count($months)>0)
$sql .= " WHERE duration IN (".implode($months, ',').") ";
并且更好地使用isset($_POST["x"])
而不仅仅是if
。
答案 3 :(得分:0)
所以我要说$_POST['duration']
是null
。
$duration = array();
$duration = $_POST['duration'];
然后你没有内爆值,因为你的foreach
不会被执行。
一种解决方案是将代码分别放入if( $_POST['duration'] )
if( count($months) )
答案 4 :(得分:0)
其中一个选项是类型转换。
$duration = (array)$_POST['duration'];
由于您在查询中使用$ _POST ['duration']的内容,请注意SQL注入技术。
答案 5 :(得分:0)
检查$_POST['duration']
是否已设置并构建您的WHERE语句(如果不是),如果不是,请将其留空:
$where = !$_POST['duration'] ? '' : 'WHERE duration IN ('.implode($_POST['duration'],',').')';
$sql = 'SELECT * FROM tbl_courses '.$where;
我还删除了一些不必要的变量声明和循环$duration
。
请注意,您需要清理数据以防止SQL注入。在这种情况下,最简单的方法是遍历值并将它们转换为int
:
foreach($_POST['duration'] as $value) {
$months[] = (int)$value;
}
$where = !$months ? '' : 'WHERE duration IN ('.implode($months,',').')';
$sql = 'SELECT * FROM tbl_courses '.$where;