2012-01-13 89 views
0

我有一個表單,提交了我正在爲另一個項目練習的食譜的步驟和配料。我已經將表單設置爲提交數組中的數據,但我無法正確地將PHP代碼插入到數據庫中。我在這裏粘貼了表單佈局。表單是作爲另一個PHP頁面的一部分出現的,當用戶輸入一個配方名稱來添加到數據庫時會調用該頁面。我想在這個表單上有10個單獨的步驟條目,如果我能弄清楚如何將它們正確地插入到數據庫中。如何使用數組將表單數據輸入到mysql數據庫中?

<form action="add_recipe2.php" method="post"> 
    <fieldset> 
     <legend>Add a Recipe</legend> 
     <table> 
      <tr> 
       <td>Recipe Name:</td> 
       <td><input type="text" name="recipename" value="$recipename"></td> 
      </tr> 
      <tr> 
       <td>Step:</td> 
       <td><input type="text" name="recipe[0][step]" placeholder="1"></td> 
       <td>Ingredients:</td> 
       <td><input type="text" name="recipe[0][ingredients]" placeholder="Ingredients"></td> 
      </tr> 
      <tr> 
       <td>Step:</td> 
       <td><input type="text" name="recipe[1][step]" placeholder="2"></td> 
       <td>Ingredients:</td> 
       <td><input type="text" name="recipe[1][ingredients]" placeholder="Ingredients"></td> 
      </tr> 
      <tr> 
       <td>Step:</td> 
       <td><input type="text" name="recipe[2][step]" placeholder="3"></td> 
       <td>Ingredients:</td> 
       <td><input type="text" name="recipe[2][ingredients]" placeholder="Ingredients"></td> 
      </tr> 

     </table> 
     <button type="submit">Add a Recipe</button> 
     <button type="reset">Reset</button> 

    </fieldset> 
</form> 

這是將數據輸入數據庫的PHP。問題是當我只向數據庫添加兩條記錄時,最後一條記錄仍然插入,但它插入一條空行。我需要一種方法來只添加從窗體傳遞的數據,即使它只有一行。我已經研究了很長時間,這代表了我發現的答案之一。但是,當表單中沒有更多數據時,它仍然不會停止插入到數據庫中。

$recipename = $_REQUEST["recipename"]; 

$conn = mysql_connect("localhost","user","password") or die(mysql_error()); 
mysql_select_db("test"); 

foreach($_POST['recipe'] as $recipe) { 

// Add to database 
$sql1 = "INSERT INTO `recipes` (recipe, step, ingredients) VALUES ('".$_POST['recipename']."', '".$recipe['step']."', '".$recipe['ingredients']."')"; 
mysql_query($sql1, $conn) or die(mysql_error()); 
} //end foreach 

我只是無法弄清楚這一點。我需要幫助。如果不是存在的表單條目的數量,我懷疑我必須有一種方法來告訴我實際發送了多少條記錄。

回答

2

您需要測試數組中的值是否在查詢之前被填入。此外,您必須對逃逸SQL注入的所有插入值與mysql_real_escape_string()

$recipename = mysql_real_escape_string($_POST['recipename']); 

foreach($_POST['recipe'] as $recipe) { 
    // Only insert if step is non-empty. 
    if (!empty($recipe['step']) { 
    // Add to database 

    // Escape against SQL injection 
    $recipe['step'] = mysql_real_escape_string($recipe['step']; 
    $recipe['ingredients'] = mysql_real_escape_string($recipe['ingredients']; 

    $sql1 = "INSERT INTO `recipes` (recipe, step, ingredients) VALUES ('".$recipename."', '".$recipe['step']."', '".$recipe['ingredients']."')"; 
    mysql_query($sql1, $conn) or die(mysql_error()); 
    } 
} 
+0

這應該工作,但它不會插入除食譜名稱之外的任何東西。我嘗試了一個var_dump來查看配方步驟是什麼,並且顯示爲0.表單僅發送步驟和配料的最後一個條目。我不知道如何克服這一點。 – attentionjay 2012-01-13 05:14:38

+0

我通過重新載入所有內容,然後重新嘗試了一遍,現在似乎可以正常工作。當我第一次嘗試時,我不知道問題出在哪裏。真心謝謝你幫助我解決這個問題。 – attentionjay 2012-01-13 18:03:50

+0

@ user1137742很高興認識它 - 很樂意幫助 – 2012-01-13 18:53:33

0

事實是,即使用戶沒有在信息填寫表格的食譜[3],空值仍在提交。

你必須插入到數據庫之前驗證您的數據:

function isValidRecipe($recipe){ 
    // returns true if ingredients and step are not empty 
    return !(empty($recipe['ingredients']) || empty($recipe['step'])); 
} 
foreach($_POST['recipe'] as $recipe) { 
if (isValidRecipe($recipe)){ 
    // Add to database 
    $sql1 = "INSERT INTO `recipes` (recipe, step, ingredients) VALUES ('".$_POST['recipename']."', '".$recipe['step']."', '".$recipe['ingredients']."')"; 
     mysql_query($sql1, $conn) or die(mysql_error()); 
    } 
} 

注意,這是最低的驗證,你應該更徹底地檢查一切。

+0

我試過了,它似乎工作。我仍在測試,但目前看起來不錯。感謝您花時間幫助我。 – attentionjay 2012-01-13 18:04:26

相關問題