2016-03-08 100 views
0

我遇到了數組結果在我的PHP的麻煩。我的第一個問題是這樣的:PHP插入多個複選框和文本框數組到MySQL數據庫

enter image description here

這表明即使複選框未選中的一切。我的第二個問題是,即使它連接到數據庫,它也不會將值插入到數據庫中(正如您在前面的屏幕截圖中看到的,它表示「連接成功」)。

這是我的HTML表單:

<form method="POST"> 
    <input type="hidden" name="item[]" value="cupcake"> 
    <input type="text" name="items" value="cupcake" readonly><br> 
    <b>Price :</b> <span name="price" value="3.00">$17.00</span><br> 
    Quantity: <input tabindex="1" name="quantity[]" min="0" max="5" type="number" class="quantity" value="1" /><br> 
    <input tabindex="1" name="checkbox[]" type="checkbox" value="17" /><span>Add to Cart</span></label></div></div></td><br> 

    <input type="hidden" name="item[]" value="cake"> 
    <input type="text" name="items" value="cake" readonly><br> 
    <b>Price :</b> <span name="price" value="20.00">$20.00</span><br> 
    Quantity: <input tabindex="1" name="quantity[]" min="0" max="5" type="number" class="quantity" value="1" /><br> 
    <input tabindex="1" name="checkbox[]" type="checkbox" value="20" /><span>Add to Cart</span></label></div></div></td><br> 

    <input type="submit" name="insertBT"><br> 
</form> 

PHP:

if(isset($_POST['insertBT'])) 
{ 
    class db_conn 
    { 
     public function create_conn($servername, $username, $password, $db) 
     { 
      global $conn; 
      $conn = new mysqli ($servername, $username, $password, $db); 
     } 

     public function check_conn() 
     { 
      global $conn; 
      if($conn->connect_error) 
      { 
       die ("Connection Failed : " . $conn->connect_error); 
      } 
      else 
      { 
       echo ("Connected Successfully <br>"); 
      } 
     } 

     public function insert() 
     { 

      if(isset($_POST['checkbox'])) { 
       foreach($_POST['checkbox'] as $check) { 

        $check = implode(',', $_POST['checkbox']); 
        $name = implode(',', $_POST['item']); 
        $quantity = implode(',', $_POST['quantity']); 
       } 
       echo $check . "<br>"; 
       echo $name . "<br>"; 
       echo $quantity . "<br>"; 

       mysql_query("INSERT INTO purchases(Product, Quantity, Price) VALUES('$name', '$quantity','$check')"); 

      } 
     } 
    } 
    $obj1 = new db_conn; 
    $obj1->create_conn("localhost","root","", "dbtest"); 
    $obj1->check_conn(); 
    $obj1->insert(); 
} 
+0

對不起,但我沒有問如何將php文件連接到數據庫,我已經知道如何使用面向對象編程連接它。我正在問一個完全不同的問題。 – Raios

+0

爲什麼使用全局變量'$ conn'而不是類屬性? – Barmar

+0

既然你正在循環複選框,爲什麼你還在循環內部執行'implode(',',$ _POST ['checkbox'])'? – Barmar

回答

2

你不應該使用implode。這會將表單中所有內容的逗號分隔列表插入到您插入的每一行中,並對每個檢查過的框重複此操作。您應該通過索引數組在每行中插入一個項目。

但是,當您在表單中有一個複選框時,它只會提交被選中的複選框。其結果是$_POST['checkbox']陣列的索引將與相應的$_POST['item']$_POST['quantity']元素不匹配。您需要將顯式索引放入checkbox名稱中,以便將它們關聯起來。

<form method = "POST"> 

<input type = "hidden" name = "item[]" value = "cupcake"> 
<input type = "text" name = "items" value = "cupcake" readonly><br> 
<b>Price :</b> <span name = "price" value = "3.00">$17.00</span><br> 
Quantity: <input tabindex="1" name="quantity[]" min="0" max="5" type="number" class="quantity" value="1" /><br> 
<input tabindex="1" name="checkbox[0]" type="checkbox" value="17" /><span>Add to Cart</span></label></div></div></td><br> 

<input type = "hidden" name = "item[]" value = "cake"> 
<input type = "text" name = "items" value = "cake" readonly><br> 
<b>Price :</b> <span name = "price" value = "20.00">$20.00</span><br> 
Quantity: <input tabindex="1" name="quantity[]" min="0" max="5" type="number" class="quantity" value="1" /><br> 
<input tabindex="1" name="checkbox[1]" type="checkbox" value="20" /><span>Add to Cart</span></label></div></div></td><br> 

<input type = "submit" name = "insertBT"><br> 
</form> 

然後你的PHP代碼可以是這樣的:

$stmt = $conn->prepare("INSERT INTO purchases (Product, Quantity, Price) VALUES (?, ?, ?)"); 
$stmt->bind_param("sis", $name, $quantity, $price); 
foreach ($_POST['checkbox'] as $i => $price) { 
    $name = $_POST['name'][$i]; 
    $quantity = $_POST['quantity'][$i]; 
    $stmt->execute(); 
} 

BTW,把價格在你的HTML看起來像一個壞主意。在提交表單之前,沒有什麼能夠阻止用戶使用Web檢查器修改HTML,因此他們可以降低價格。處理表單時,您應該從數據庫中獲取價格。

此外,請注意,在您的原始代碼中,您使用MySQLi打開了數據庫連接,但之後您嘗試使用mysql_query而不是$conn->query()進行插入操作。你不能像這樣混用API; myql_query只能在打開與mysql_connect的連接時使用。

+0

和他們原來的查詢的問題是?哦,是的,我提到過,但很快就被告知(更像是被駁回的),混合MySQL APIs並不是問題所在。所以我最終刪除了關於它的評論。 –

+0

啊,我明白了,所以這就是問題所在。似乎弗雷德是對的。現在正在工作,謝謝。另外,我不知道prepare()是什麼,但我猜這只是發送表單時的準備查詢。但是,我可以問一下「sis」的用途嗎? – Raios