2012-08-25 137 views
3

我知道這裏有很多關於這個問題,關於這個問題,我已經看過他們,但沒有得到一個令人滿意的答案。所以這裏是我的問題,插入多個複選框值到MySQL

我有一個窗體,它由幾個文本框和複選框組成。它看起來像這樣,

enter image description here

用戶可以選擇多個複選框。我試圖將這些複選框的(不是顯示文本字符串)插入到MySQL表中。它應該是這樣的,

enter image description here

一個服務ID(SID)可以有多個位置(Loc_Code)。這些位置代碼(CO,GQ)是複選框的值。

到目前爲止,我已經寫了下面的代碼。

<html> 
<head> 
</head> 
<body> 
<?php 
require_once("db_handler.php"); 

$conn = iniCon(); 
$db = selectDB($conn); 

/* Generating the new ServiceID */ 
$query = "SELECT SID FROM taxi_services ORDER BY SID DESC LIMIT 1"; 
$result = mysql_query($query, $conn); 
$row = mysql_fetch_array($result); 
$last_id = $row["SID"]; 

$id_letter = substr($last_id, 0, 1); 
$id_num = substr($last_id, 1) + 1; 
$id_num = str_pad($id_num, 3, "0", STR_PAD_LEFT); 
$new_id = $id_letter . $id_num; 

//Selecting locations 
$query = "SELECT Loc_Code, Name FROM districts"; 
$result = mysql_query($query, $conn); 

$count = mysql_num_rows($result); 
?> 

<?php 
if(isset($_POST["savebtn"])) 
{ 
    //inserting the new service information 
    $id = $_POST["sid"]; 
    $name = $_POST["name"]; 
    $cost = $_POST["cost"]; 
    if($_POST["active"] == "on") $active = 1; else $active = 0; 

    $query = "INSERT INTO taxi_services(SID, Name, Cost, Active) VALUES('$id', '$name', '$cost', '$active')"; 
    $result = mysql_query($query, $conn); 

    //inserting the location details 
    for($j = 0; $j < $count; $j++) 
    { 
     $loc_id = $_POST["checkbox2"][$j]; 
     $query = "INSERT INTO service_locations(SID, Loc_Code) VALUES('$id', '$loc_id')"; 
     $result5 = mysql_query($query, $conn); 
    } 

    if (!$result || !$result5) 
    { 
     die("Error " . mysql_error()); 
    } 
    else 
    { 
?> 
     <script type="text/javascript"> 
      alert("Record added successfully!"); 
     </script> 
<?php 
    } 
    mysql_close($conn); 
} 
?> 

<div id="serv"> 
<b>Enter a new taxi service</b> 
<br/><br/> 
    <form name="servForm" action="<?php $PHP_SELF; ?>" method="post" > 
     <table width="300" border="0"> 
      <tr> 
      <td>Service ID</td> 
      <td><input type="text" name="sid" readonly="readonly" value="<?php echo $new_id; ?>" style="text-align:right" /></td> 
      </tr> 
      <tr> 
      <td>Name</td> 
      <td><input type="text" name="name" style="text-align:right" /></td> 
      </tr> 
      <tr> 
      <td>Cost</td> 
      <td><input type="text" name="cost" style="text-align:right" onkeypress="return isNumberKey(event)" /></td> 
      </tr> 
      <tr> 
      <td>Active</td> 
      <td><input type="checkbox" name="active" /></td> 
      </tr> 
     </table> 
</div> 

<div id="choseLoc"> 
Locations <br/><br/> 
    <table border="0"> 
     <?php 
     $a = 0; 
     while($row = mysql_fetch_array($result)) 
      { 
      if($a++ %5 == 0) echo "<tr>"; 
      ?> 
      <td align="center"><input type="checkbox" name="checkbox2[]" value="<?php echo $row['Loc_Code']; ?>" /></td> 
      <td style="text-align:left"><?php echo $row["Name"]; ?></td> 
     <?php 
     if($a %5 == 0) echo "</tr>"; 
      } 
     ?> 
    </table> 
</div> 
<br/> 
<div id="buttons"> 
    <input type="reset" value="Clear" /> <input type="submit" value="Save" name="savebtn" /> 
    </form> 
</div> 

</body> 
</html> 

它正確插入服務的詳細信息。但是,當它插入的位置數據,像這樣的問題時,

enter image description here

我選擇4個複選框和保存。 4個位置代碼與服務ID一起保存。但是從上面的屏幕截圖中可以看到,還插入了一堆空行。

我的問題是我該如何阻止這種情況發生?我如何才能從複選框插入數據,只有我選擇?

謝謝。

+5

**你的代碼很容易受到SQL注入**你真的* *應使用[預處理語句(HTTP://計算器。com/a/60496/623041),將您的變量作爲參數傳遞到其中,而這些參數不針對SQL進行評估。如果你不知道我在說什麼,或者如何解決它,請閱讀[Bobby Tables]的故事(http://stackoverflow.com/questions/332365/xkcd-sql-injection-please-explain) 。 – eggyal

+4

另外,正如[介紹](http://www.php.net/manual/en/intro.mysql.php)所述,在PHP手冊中介紹了'mysql_ *'函數:*不推薦使用此擴展名用於編寫新的代碼。相反,無論是[mysqli](http://www.php.net/manual/en/book.mysqli.php)還是[PDO_MySQL](http://www.php.net/manual/en/ref.pdo應該使用-mysql.php)擴展名。請參閱[MySQL API概述](http://www.php.net/manual/en/mysqlinfo.api.choosing.php)以獲得進一步的幫助,以便選擇MySQL API。* – eggyal

+0

您是否嘗試過檢查'$ _POST '變量來檢查提交什麼? –

回答

8

一種方法是隻環比分別提交的複選框:

//inserting the location details 
foreach($_POST["checkbox2"] as $loc_id) 
{ 
    $query = "INSERT INTO service_locations(SID, Loc_Code) VALUES('$id', '$loc_id')"; 
    $result5 = mysql_query($query, $conn); 
} 

我在這裏重申上面給出的SQL注入警告:你會最好準備一個INSERT語句,然後執行它帶有參數。使用PDO,它看起來像這樣:

//inserting the location details 
$stmt = $dbh->prepare(' 
    INSERT INTO service_locations(SID, Loc_Code) VALUES(:id, :loc) 
'); 
$stmt->bindValue(':id', $id); 
$stmt->bindParam(':loc', $loc_id); 
foreach($_POST["checkbox2"] as $loc_id) $stmt->execute(); 
+0

美麗的作品。 :)你能解釋一下這一行嗎? 'foreach($ _ POST [「checkbox2」]爲$ loc_id)'$ loc_id'如何獲取複選框的值? |我目前正在學習PDO :)當我掌握它時,我一定會在使用PHP和MySQL時使用它。謝謝。 – Isuru

+0

@ nK0de:閱讀['foreach'](http://php.net/manual/en/control-structures.foreach.php)。 – eggyal

-4

發生這種情況的原因是未勾選的複選框仍然發佈,它們只有空值。在你插入到service_locations之前,只需檢查$loc_id是否爲空,如果不是,則只進行插入。

+1

不正確。這是因爲循環受到數據庫中位置數量的限制。 – eggyal

+1

不,沒有勾選的複選框不會被瀏覽器提交。 –

+0

你們都很正確,我的錯誤。現在刪除按鈕在哪裏... – Tieran

1

從這些句子:

for($j = 0; $j < $count; $j++) 
    { 
     $loc_id = $_POST["checkbox2"][$j]; 
     $query = "INSERT INTO service_locations(SID, Loc_Code) VALUES('$id', '$loc_id')"; 
     $result5 = mysql_query($query, $conn); 
    } 

我覺得問題是,loc_code的值必須是你最後一次選擇的網站位置。因爲在這個循環中,loc_code的價值將每次更換。如果要插入的所有位置,你應該把它放在一個句子,像INSERT INTO service_locations(SID,Loc_Code)VALUES( '的$ id', '$ loc_id'),爲$ loc_id值應爲CO,GQ,GL