处理来自多个选择字段的数据

时间:2011-11-05 11:44:36

标签: php mysql arrays forms multi-select

我有一个多选字段,设计如下:

<select name="deductions[]" multiple="multiple">
<option>Option 1</option>
<option>Option 2</option>
<option>.......</option>
</select>

我想使用php post从上面的select字段中获取值到db。这就是我的方法

<?php
$deds=$_POST['deductions'];
$deds_joined=join(',',$deds);
$sql=mysql_query("insert into mytable(deduction) values($deds_joined)");
/*code continues*/

我的兴趣是将演绎值输入数组并以这种方式将其存储在db中: 值1,值2,值3。 不幸的是,我无法实现这一目标。相反,只获得了预期数组的单个值。 非常感谢您的协助。谢谢。

3 个答案:

答案 0 :(得分:3)

我在这里写了一个新答案,因为之前的答案本质上是错误的。我将在下面留下原始答案用于历史目的,但不要使用它。

首先是:

  

Please, don't use mysql_* functions in new code。它们不再被维护and are officially deprecated。请参阅red box?转而了解prepared statements,并使用PDOMySQLi - this article将帮助您确定哪个。如果您选择PDO here is a good tutorial

你遵循这个建议变得比以往任何时候都重要,现在已经弃用了ext / MySQL并且使用它会从PHP 5.5开始发出E_DEPRECATED错误,有一天它将完全从核心语言中删除。话虽如此,以下内容适用于所有数据库的所有驱动程序。

对于本解释的其余部分,我将假设您由于某种原因无法使用MySQLi或PDO(请注意唯一令人满意的原因是它们不可用,“我不知道知道如何使用它们“不是借口”,并且你被迫使用ext / MySQL。如果您能够使用任何一个较新的驱动程序,那么您可以使用预准备语句,但这些都不适用。所以,考虑到这一点......

接下来让我们来看看上一个答案有什么问题。这主要围绕逃避用户输入。它使用mysql_real_escape_string()是一种毫无意义的方式。这应该用于转义单个字符串文字,绝对没有别的。它不能用于有效地转义数字,也不能用于转义不仅仅是值的SQL部分。

以下两个代码段显示了执行此操作的正确方法,具体取决于数据的类型,以及最重要的类型。

如果值是字符串(通常是CHARVARCHAR字段),我们会采取以下措施:

// First create an array of individually escaped values with quotes added
$deds = array();
foreach ($_POST['deductions'] as $ded) {
  $deds[] = "'".mysql_real_escape_string($ded)."'";
}

// Now join them together in an SQL syntax
$deds_joined = join('), (', $deds);

// Now they can safely be used in the query
$query = "INSERT INTO mytable (deduction) VALUES ($deds_joined)";

但通常在这种情况下,值只是数字,在这种情况下,我们需要做的就是确保PHP用正确的数据类型表示它们,因为它们在转换回时会自动安全要在查询中使用的字符串:

// First convert the array values to integers
$deds = array();
foreach ($_POST['deductions'] as $ded) {
  $deds[] = (int) $ded;
}

// Now join them together in an SQL syntax
$deds_joined = join('), (', $deds);

// Now they can safely be used in the query
$query = "INSERT INTO mytable (deduction) VALUES ($deds_joined)";

此代码显然假设数据是整数类型,只需将(int)强制转换为(float)即可轻松处理浮点数。

值得注意的是,字符串方法也可以安全且成功地用于数值,因为MySQL也会将值转换为正确的类型。但一般来说,在查询中使用正确的类型表示传递数据会更好,更有效。


历史参考的上一个答案

我认为问题在于您的查询,而您应该这样做:

$deds = $_POST['deductions'];
$deds_joined = mysql_real_escape_string(join('),(',$deds));
$query = "INSERT INTO mytable (deduction) VALUES ($deds_joined)";
$sql = mysql_query($query);

所以结束查询将如下所示:

INSERT INTO mytable (deduction) VALUES (1), (2), (3)

而不是

INSERT INTO mytable (deduction) VALUES (1,2,3)

第一个示例是插入多行的正确语法,这是您似乎要尝试执行的操作,因为您只指定了一个列名。或者,如果您尝试将值插入为逗号分隔的字符串,则可以执行以下操作:

$deds_joined = mysql_real_escape_string(join(',',$deds));
$query = "INSERT INTO mytable (deduction) VALUES ('$deds_joined')";

答案 1 :(得分:0)

我有同样的问题,这对我有帮助。以表格收集数据

<form action="page.php" method="post">
<select name="requests[]" multiple="multiple=" class="selectpicker">
<option value="one">one</option>
<option value="two">two</option>
<option value="three">three</option>
<option value="four">four</option>
<option value="five">five</option>
<option value="six">six</option>
</select>
<input type="submit" value="submit" />
</form>

将此作为您的page.php

    <?php 
     $contents = ob_get_contents(); //used this this to generate a variable that    can be posted ?> 
    <?php ob_start(); ?>
    <?php
    $requests=$_POST['requests'];
    if ($requests){
    foreach ($requests as $request){echo $request,','."";}
    } 
    ?>
    <?php $contents = ob_get_contents();//a variable that was generated ?>
    <?php 
    $h =$contents; // just renaming
    $sql = "INSERT INTO mytable (requests) VALUES (:h)";//dont forget to         connect to you database
    $q = $db->prepare($sql);
    $q->execute(array(':h'=>$h));
    header("location: mypage.php?"); //redirect to a page after posting into    mytable
    ?>

答案 2 :(得分:-1)

尝试

<?php
foreach ($_POST['deductions'] as $names)
{
        print "You are selected $names<br/>";
}

?>