1

我有一个多选字段

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

提前致谢

4

6 回答 6

2

您遇到的两个问题是您尝试对可能不是数组的用户输入进行内爆,并且您的代码容易受到 SQL 注入的攻击。

要解决这些问题,您应该首先检查它是否是一个带有 的数组is_array(),然后检查它是否有任何带有 的元素count(),最后 implode 但用于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";
于 2012-12-06T07:45:14.820 回答
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 是否是一个数组。

于 2012-12-06T07:52:45.450 回答
0

如果不需要,只需删除 WHERE 条件

$sql = "SELECT * FROM tbl_courses";

if (count($months)>0)
    $sql .= " WHERE duration IN (".implode($months, ',').") ";

并更好地使用isset($_POST["x"]),而不仅仅是一个if.

于 2012-12-06T07:37:54.873 回答
0

所以让我们说$_POST['duration']null

$duration = array();
$duration = $_POST['duration'];

那么你就没有内爆的价值,因为你foreach不会被执行。一种解决方案是将您的代码if( $_POST['duration'] )分别放入if( count($months) )

于 2012-12-06T07:38:18.667 回答
0

选项之一是类型转换。

$duration = (array)$_POST['duration'];

由于您在查询中使用 $_POST['duration'] 的内容,请注意 SQL 注入技术。

于 2012-12-06T07:44:22.517 回答
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;
于 2012-12-06T07:49:22.943 回答