我有一个多选字段,设计如下:
<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。 不幸的是,我无法实现这一目标。相反,只获得了预期数组的单个值。 非常感谢您的协助。谢谢。
答案 0 :(得分:3)
我在这里写了一个新答案,因为之前的答案本质上是错误的。我将在下面留下原始答案用于历史目的,但不要使用它。
首先是:
Please, don't use
mysql_*
functions in new code。它们不再被维护and are officially deprecated。请参阅red box?转而了解prepared statements,并使用PDO或MySQLi - this article将帮助您确定哪个。如果您选择PDO here is a good tutorial。
你遵循这个建议变得比以往任何时候都重要,现在已经弃用了ext / MySQL并且使用它会从PHP 5.5开始发出E_DEPRECATED
错误,有一天它将完全从核心语言中删除。话虽如此,以下内容适用于所有数据库的所有驱动程序。
对于本解释的其余部分,我将假设您由于某种原因无法使用MySQLi或PDO(请注意唯一令人满意的原因是它们不可用,“我不知道知道如何使用它们“不是借口”,并且你被迫使用ext / MySQL。如果您能够使用任何一个较新的驱动程序,那么您可以使用预准备语句,但这些都不适用。所以,考虑到这一点......
接下来让我们来看看上一个答案有什么问题。这主要围绕逃避用户输入。它使用mysql_real_escape_string()
是一种毫无意义的方式。这应该用于转义单个字符串文字,绝对没有别的。它不能用于有效地转义数字,也不能用于转义不仅仅是值的SQL部分。
以下两个代码段显示了执行此操作的正确方法,具体取决于数据的类型,以及最重要的类型。
如果值是字符串(通常是CHAR
或VARCHAR
字段),我们会采取以下措施:
// 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/>";
}
?>