implode()[function.implode]:在$ _POST ['duration'] == EMPTY时传递的参数无效

时间:2012-12-06 07:35:18

标签: php mysql

我有一个多选字段

<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, ',').") ";

提前致谢

6 个答案:

答案 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;