2012-03-05 128 views
2

感謝所以非常的所有幫助HTML表單,MySQL數據庫的作品,現在我遇到了一個小問題,希望我會很快修復它,當然痘痘的幫助,所以在這裏我的HTML表單:多次插入到MySQL使用PHP

<div>Date: 
    <input onclick="ds_sh(this);" name="trans_date" readonly="readonly" style="cursor: text" /><br/><br/> 
    Product: 
    <select name="product_id []"> 
     <option value="1">Item1</option> 
     <option value="2">Item2</option> 
     <option value="3">Item3</option> 
     <option value="4">Item4</option> 
     <option value="5">Item5</option> 
    </select> 
    Quantity: 
    <input type="text" name="stock_plus []" /><br/> 
</div> 

這個div重複10次以上,我用這種形式讓用戶添加所選產品

的盤點現在,當我試圖用PHP對插入行我表:

1-方法1:

PHP代碼:

$product = $_POST['product_id']; $stock_plus = $_POST['stock_plus']; 
$Date = $_POST['trans_date']; $limit = count($stock_plus); 
for($i=0;$i<$limit;$i++) { 
    $product[$i] = mysql_real_escape_string($product[$i]); 
    $stock_plus[$i] = mysql_real_escape_string($stock_plus[$i]); 
} 

$query = "INSERT INTO table (trans_date, product_id, stock_plus) 
VALUES ('".$Date."','".$product[$i]."','".$stock_plus[$i]."')"; 
if(mysql_query($query)) 
    echo "$i successfully inserted.<br/>"; 
else 
    echo "$i encountered an error.<br/>"; 

我:注意:未定義抵消:2個... ,而不是所有的行插入。

方法2:

PHP代碼:

$trans_date=$_POST['trans_date']; $sql = 'INSERT INTO table 
(trans_date, product_id, stock_plus) VALUES '; 

for($i = 0;$i < count($_POST['product_id']);$i++) { 
    $sql .= "('$trans_date','".$_POST['product_id'][$i]."','".$_POST['stock_plus']i]."')"; 
    if($i != count($_POST['product_id']) - 1) 
    { 
     $sql .= ','; 
    } 
} 
if (!mysql_query($sql)) { die('Error: ' . mysql_error()); } 

這裏沒有錯誤,但不是所有的行插入。 你能幫助我,請看看clearier什麼,我錯過了,至於

附加:

感謝Travesty3,我看起來太成MYHTML的錯誤,我的HTML機身看起來酷似:

<body> 
<form action="../inserts/stock_insert.php" method="post"> 
<div> 
<!-- JS Datepicker --> 
Date: <input onclick="ds_sh(this);" name="trans_date" readonly="readonly" style="cursor: text" /> 
<br/> 
<!-- User should select product --> 
Product:<select name="product_id []"> 
<option value="1">Item1</option> 
<option value="2">Item2</option> 
<option value="3">Item3</option> 
<option value="4">Item4</option> 
<option value="5">Item5</option> 
</select> 
<!-- User must enter the quantity --> 
Quantity: <input type="text" name="stock_plus []" /><br/> 
</div> 
<input type="submit" name="Submit" value="Submit" /> 
</form> 
</body> 

的div重複10次,所以我應該在我的數據庫表中得到的結果是10行insterted(trans_date,product_id(FK),stock_plus)當回顯Mysql錯誤時,沒有。

+0

災難性的 - 請確保這不是互聯網訪問... – 2012-03-05 17:57:14

回答

3

您正在循環外執行查詢,因此只執行一個插入。在你的for循環中移動你的查詢。

試試這個:

$product = $_POST['product_id']; 
$stock_plus = $_POST['stock_plus']; 
$Date = mysql_real_escape_string($_POST['trans_date']); 
$limit = count($stock_plus); 

for ($i=0; $i<$limit; $i++) 
{ 
    $product[$i] = mysql_real_escape_string($product[$i]); 
    $stock_plus[$i] = mysql_real_escape_string($stock_plus[$i]); 

    if(mysql_query("INSERT INTO table (trans_date, product_id, stock_plus) VALUES ('{$Date}', '{$product[$i]}', '{$stock_plus[$i]}')")) 
     echo "$i successfully inserted.<br/>"; 
    else 
     echo "$i encountered an error.<br/>"; 
} 
+0

謝謝您的回答,但不幸的是我得到了相同的:0成功inserted.Notice:用C 1:未定義抵消\ XAMPP \ htdocs中\第17行上的doua \ inserts \ stock_insert.php 1遇到錯誤。 – 2012-03-07 11:19:23

+0

@JesseJames:這表明在你的HTML表單中,對於每個'stock_plus',你不一定有相應的'product_id'。你必須得到'Undefined offset'消息,因爲'$ product [1]'不存在(但是'$ stock_plus [1]'** does ** exists)。你能發佈更多的HTML表單嗎?不知道爲什麼你的'mysql_query'失敗了......嘗試在'else'語句中回顯'mysql_error()'。 – Travesty3 2012-03-07 13:30:02

+0

@JesseJames:它可能與你的HTML表單中的名字有關。您使用的名稱是'product_id []'和'stock_plus []'。變量名和'[]'之間有一個空格。這會導致您的變量以「product_id_」和「stock_plus_」的形式出現在PHP腳本中。嘗試刪除空間,看看是否有幫助。如果不是,請嘗試'var_dump($ _ POST)'來查看您從HTML表單獲得的內容。 – Travesty3 2012-03-07 15:54:25

1

首先,也是最重要的,你做任何事情修復這兩種方法的大規模安全漏洞之前。您允許將未經協商的用戶輸入直接插入允許SQL注入的SQL查詢中。您必須毫無例外地始終對來自用戶的輸入進行消毒。在將它們放入查詢之前,要通過mysql_real_escape_string傳遞所有變量。你已經清理了一些輸入,但你不要舉例說明清理$日期。我認爲這是因爲它來自日期選擇器,你沒有看到風險。你永遠不應該依賴任何客戶端的安全性,因爲它總是可以改變的 - 總是包括服務器端驗證和衛生。例如,惡意用戶可能會在將日期發佈到服務器之前通過自己的JavaScript修改日期。

但是,如果您多次執行相同的查詢,我強烈建議您開始使用MySQLi或PDO並準備好語句。當您使用準備好的語句時,它是預編譯的,這意味着當您重新運行相同的查詢但僅使用不同的數據時,您會獲得巨大的性能提升。我強烈建議你看看。

你得到未定義的偏移量的原因是因爲數組索引2不存在於你的數組中。你的代碼看起來有點令我困惑 - 你的for循環排除了你的mysql_query。您需要在for循環中執行mysql_query。您最好對product_ids進行foreach,例如

$i = -1; 
$product_ids = $_POST['product_id']; 
$stock_plus = $_POST['stock_plus']; 
$date = mysql_real_escape_string($_POST['trans_date']); 
foreach($product_ids as $product_id) { 
    $product_id = mysql_real_escape_string($product_id); 
    $stock = mysql_real_escape_string($stock_plus[++$i]); 
    mysql_query("INSERT INTO table (trans_date, product_id, stock_plus) VALUES ({$date}, {$product_id}, {$stock})"); 
} 
+0

大聲笑你仍然沒有逃避'$ date'或'$ product_id'。 – Travesty3 2012-03-05 18:09:54

+0

哎呀.....大聲笑這就好笑。現在編輯! – christophmccann 2012-03-05 18:10:35

+0

我很忙,專注於我的回答,我忘了仔細檢查代碼!失敗! – christophmccann 2012-03-05 18:11:42