2009-06-30 108 views
2

我试图根据从多个选择框中选择的选项数量将多行插入到MySQL表中。目前它插入一行(不管选择了多少选项),但每次“策略名”列都是空的。从多个选择框向MySQL发送多条记录

关于如何插入多行以及为什么选项的值未被发送到表的任何想法?

下面的形式:

<form method="POST" action="update4.php"> 

<input type="hidden" name="id" value="1"> 

<p class="subheadsmall">Strategies</p> 

<p class="sidebargrey"> 

<?php 

      $result = mysql_query("SELECT strategyname FROM sslink WHERE study_id = '{$_GET['id']}'"); 
       if (!$result) { 
        die("Database query failed: " . mysql_error()); 
       } 

while($row = mysql_fetch_array($result)) { 
    $strategyname = $row['strategyname']; 


    echo $strategyname.'<br />'; 
} 

?> 
     <p class="subheadsmall">Add a strategy... (hold down command key to select more than one)</p> 

<select name="strategylist" multiple="multiple"> 
    <?php 

      $result = mysql_query("SELECT * FROM strategies"); 
       if (!$result) { 
        die("Database query failed: " . mysql_error()); 
       } 

while($row = mysql_fetch_array($result)) { 
    $strategylist = $row['name']; 
    $strategyname = htmlspecialchars($row['name']); 
    echo '<option value="' . $strategylist . '" >' . $strategyname . '</option>' . '\n'; 
} 

?> 
</select> 
    </p> 



<input type="submit" class="box" id="editbutton" value="Update Article"> 

</form> 

而这正是它发送到数据库:

<?php 
$id=$_POST['id']; 
$test=$_POST['strategylist']; 
$db="database"; 

$link = mysql_connect("localhost", "root", "root"); 
//$link = mysql_connect("localhost",$_POST['username'],$_POST['password']); 
if (! $link) 
die("Couldn't connect to MySQL"); 
mysql_select_db($db , $link) or die("Select Error: ".mysql_error()); 
//for($i=0;$i<sizeof($_POST["test"]);$i++) 
//{ 
//$sql = "insert into tbl_name values ($_POST["test"][$i])"; } 
//sql = "INSERT INTO table_name VALUES ('" . join(",",$_POST["test"]) . "')"; 
$result=mysql_query("INSERT INTO sslink (study_id, strategyname) VALUES ('$id','" . join(",",$_POST["strategylist"]) . "')")or die("Insert Error: ".mysql_error()); 
mysql_close($link); 
print "Record added\n"; 
?> 

回答

3

几点:

  • select需要被命名为strategylist[]为了告诉PHP它将包含一个数组而不是单个值
  • 然后,您的插入代码需要遍历该数组,为每个包含的元素创建一个新插入,除非(看起来)要将所有这些选项连接到单个行的字段中。

目前,你的表单只返回一个选项(从PHP的角度来看),所以它只会插入一行。

为了迭代这个数组,使用是这样的:

foreach($_POST["strategylist[]"] as $s) { 
    # do the insert here, but use $s instead of $_POST["strategylist[]"] 
    $result=mysql_query("INSERT INTO sslink (study_id, strategyname) " . 
     "VALUES ('$id','" . join(",",$s) . "')") 
     or die("Insert Error: ".mysql_error()); 
} 
+0

谢谢!我已经完成了你所说的要做的事情,现在信息正在传递到数据库中。它将插入两个选项,但插入同一行,并由昏迷分隔。我理想地喜欢每个选项进入它自己的行。我需要在哪里插入代码来遍历数组?谢谢你的帮助! – user96828 2009-06-30 15:29:35

+0

目前您在插入中使用$ _POST [“strategistist []”],但这是一个数组。我已编辑帖子以说明如何操作。 – 2009-06-30 15:40:01

2

两件事情:

  1. 如果您查看多个页面的源选择它,你可以看到<option value="something">那里?这些值是否为空?我觉得很奇怪,在文件顶部,您使用的是$row['strategyname'],后来您使用的是$row['name']。我怀疑这可能是空的StrategyName列的原因。

  2. 要处理多个选择,你应该指定选择标签作为

    <select name="strategylist[]" multiple="multiple"> 
    

    额外[]告诉PHP,以形成与其中的所有选择的数组。然后,您可以循环在阵列上,如:

    $strategylist = $_POST['strategylist']; 
    for ($i = 0; $i < count($strategylist); $i++) { 
        $strategyname = $strategylist[$i]; 
        // Insert a record... 
    } 
    
+0

一个好主意也是检查并逃避你插入到数据库中的任何东西,即使它假设源是你自己的输出。 – 2009-06-30 12:46:13

0
// first you need to define your output as one variable if you don't like the loop 
    if($_POST){ 
    $sum = implode(", ", $_POST[select2]); 
    echo $sum."."; 
} 
// the variable sum is the one you are seeking for you can insert it to the database 
// if you want to enter every peiece of the array in a new field you should use 
// different select names