2009-06-30 73 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