2017-09-26 128 views
1

2有關使用PDO(PHP)在數據庫中保存來自多個複選框的數據的問題(我的表單中包含很少數據)。我只是展示代碼的相關部分,以使其對每個人都更簡單。 A)我寫的代碼工作正常(仍然保存所有數據),但它仍然給我一個失敗的消息,你可以在下面看到。爲什麼,或者我能做得更好?保存數據庫中多個複選框中的數據

B)它將選中的複選框保存爲數據庫中的數組。後來,我想通過從數據庫中獲取數據將數據更改回原始格式來更改數據 - 如果將其保存爲數組,它會產生問題嗎?如果是的話,你會建議如何做得更好。

警告:破滅():上線通過參數無效......對於

$p2 = implode(',',$product_2); 
$p3 = implode(',',$product_3); 

$p1 = implode(',',$product_1); which I defined first seems to be fine 

<?php 
    if(isset($_POST['send'])) 
    { 
     require("php/tconnect.php");  

     $id = $_POST['id']; 
     $name = $_POST['name']; 
     $date = $_POST['date']; 
     $p1 = implode(',',$product_1); 
     $p2 = implode(',',$product_2); 
     $p3 = implode(',',$product_3); 

     $sql = "INSERT INTO database (id, name, date) VALUES (:id, :name, :date, '$p1', '$p2', '$p3')"; 
     $stmt = $dbh->prepare($sql); 
     $stmt->bindValue(':id', $id); 
     $stmt->bindValue(':name', $name); 
     $stmt->bindValue(':date', $date); 

     $stmt->execute(); 

     echo "Datas saved";    
    } 
?> 

HTML

<input type="checkbox" name="product_1[]" value="apple" id="product_1_apple"> 
    Apple 
</label> 
<label class="checkbox-inline"> 
    <input type="checkbox" name="product_1[]" value="Banana" id="product_1_banana"> 
    Banana 
</label> 

,下表類似於

<input type="checkbox" name="product_2[]" value="water" id="product_2_water"> 
    Water 
</label> 
<label class="checkbox-inline" > 
    <input type="checkbox" name="product_2[]" value="juice" id="product_2_juice"> 
    Juice 
</label> 
+0

雖然警告不是錯誤,幾乎總是意味着有東西是不是就在你的代碼,可能你的某個產品沒有被保存。你得到警告(或警告)的行中的代碼是什麼? –

+0

謝謝你,這是正確的,它的這些行:$ p2 = implode(',',$ product_2);和 $ p3 = implode(',',$ product_3); - 我第一次使用$ p1 = implode(',',$ product_1);我沒有收到警告。 – Jessy642

回答

1

由於$product_1$product_2$product_3似乎從HTML輸入數組我想你在的代碼類似於另一部分有關這個:

$product_1 = $_POST['product_1']; 
$product_2 = $_POST['product_2']; 
$product_3 = $_POST['product_3']; 

現在,問題是這些變量與複選框數組有關,但是當在頁面f中沒有選中複選框時或一組,而不是獲得該組的空數組該數組未添加到$ _POST(您可以使用var_dump($_POST)查看它)。

我懷疑在你的測試中,你只是爲product_1標記複選框,所以你得到一個該產品的數組,但沒有爲其他的數組。此外

if(isset($_POST['product_1'])) // if the array is defined in $_POST 
    $product_1 = $_POST['product_1']; // fill with the array from the form 
else $product_1 = array(); // fill with empty array, you get the empty string with implode() 

// repeat for product_2 and product_3 


,你混合準備好的語句,這是好的,在查詢字符串,它是直接插入值:要防止錯誤,您可以使用像這樣充滿每一個產品變量不好的,因爲它可以導致SQL Injection,你應該使用bindValue()爲表中的所有值:

$sql = "INSERT INTO database (id, name, date) VALUES (:id, :name, :date, :p1, :p2, :p3)"; 
$stmt = $dbh->prepare($sql); 
$stmt->bindValue(':id', $id); 
$stmt->bindValue(':name', $name); 
$stmt->bindValue(':date', $date); 
$stmt->bindValue(':p1', $p1); 
$stmt->bindValue(':p2', $p2); 
$stmt->bindValue(':p3', $p3); 
+0

現在只是問題的最後一部分。 是否有可能將數據(例如3個不同的名稱(如選中的複選框)保存在我的數據庫的一行中)返回到我的表單中,因此所有複選框都被正確檢查。如果是的話,我會用哪個表揚。如果不是,我該如何讓它工作? – Jessy642

+0

這是可能的,但它需要一些工作,首先你使用['explode()'函數](http://php.net/manual/en/function.explode.php)來轉換你從數據庫返回一個數組,然後根據數組的值,將['checked'屬性](https://www.w3schools.com/Tags/att_input_checked.asp)添加到使用PHP的相應輸入標記中,例如:>(參見([ in_array()'](http://php.net/manual/en/function.in-array.php)函數文檔)。 –

+0

對不起,我遲到了,我想先回答。你這麼多阿爾貝託! – Jessy642

相關問題