2012-04-28 101 views
1

我有問題插入到我的數據庫中我認爲這是當我嘗試將我的prdocutPrice字符串或股票字符串轉換爲十進制和int值。我很確定我正在做其他權利,有人可以爲我確認嗎?將項目插入數據庫

<?php 

    if (isset($_POST['addSubmitted'])) { 

     $errors = array(); 
     require_once ('mysql_connect.php'); 

      //This gets all the other information from the form 
      $name=$_POST['productName']; 
      $description=$_POST['productDescription']; 
      $price= floatval($_POST['productPrice']); 
      $stock= intval($_POST['productStock']); 


     if (empty($errors)) { 
      //Writes the information to the database 
      mysql_query("INSERT INTO products (name, description, price, stock) VALUES ($name, $description, $price, $stock)"); 
      $result = mysql_query($query); 

      if (mysql_affected_rows() == 1) { 
       // Show thank you message 
       echo '<span style="color:green;">Your product has been added.</span>'; 
      } else { 
       echo '<font color="red">We were unable to add your product to the database.</font>'; 
      } 

     } else { 
      echo '<font color="red"><h3>Error!</h3> 
      The following error(s) occured:<br /></font>'; 

      foreach ($errors as $msg) { 
       echo " - <font color=\"red\">$msg</font><br />\n"; 
      } 
     } 
    } 

?> 

回答

5

INSERT語句中沒有正確引用任何字符串值。用單引號括住它們。

此外,第一件事是第一件事 - 確保所有字符串輸入值都是mysql_real_escape_string(),因爲它們目前很容易受到SQL注入攻擊。

$name = mysql_real_escape_string($_POST['productName']); 
$description= mysql_real_escape_string($_POST['productDescription']); 
$price= floatval($_POST['productPrice']); 
$stock= intval($_POST['productStock']); 

此外,您呼叫mysql_query()而不是兩次的SQL字符串存儲到您的變量$query

// Quote the string values, 
// store the SQL as a variable then pass it to mysql_query() 
$query = "INSERT INTO products (name, description, price, stock) VALUES ('$name', '$description', $price, $stock)"; 
$result = mysql_query($query); 

調用echo mysql_error();將有助於調試SQL語句的問題。

最後,更多的一個音符,我將添加 - 除了呼籲從$_POST傳遞的字符串intval()floatval(),它通常是驗證數字實際上數字一個好主意。否則,如果它們是非數值,則它們將被轉換爲0,並且當您根本不應該插入它時(因爲它是無效數據),您將在數據庫中獲得零。

if (is_numeric($_POST['productPrice'])) { 
    $price = floatval($_POST['productPrice']); 
} 
else // non numeric value, don't do the insert with bad data 

爲正數或零整數,我喜歡用ctype_digit()

if (ctype_digit($_POST['productStock'])) { 
    $stock = intval($_POST['productStock']); 
} 
else // bad input value, don't do insert 
+0

+1更快的答案和找到雙'mysql_query()' – 2012-04-28 16:28:15

+0

ooo mysql_error()多數民衆贊成在方便!感謝您花時間給我一個這麼好的答案! – Anicho 2012-04-28 16:42:34

+0

在$查詢結束時你有一個額外的')' – Anicho 2012-04-28 16:43:59

1

要回答你的問題,我相信你需要周圍的價值觀(尤其是字符串)報價:

mysql_query("INSERT INTO products (name, description, price, stock) VALUES ('$name', '$description', '$price', '$stock')"); 

但是,您還需要使用mysql_real_escape_string來逃避變量或切換到類似mysqliPDO的內容以使用參數化查詢秒。

1

1)您很容易受到SQL注入攻擊。通過http://bobby-tables.com閱讀之前,繼續您的任何代碼
2)您忽略了查詢中的引號,導致語法錯誤。您也沒有任何錯誤處理,並假設您的查詢成功:

mysql_query("INSERT INTO products (name, description, price, stock) VALUES ('$name', '$description', etc....) 
                      ^ ^

請注意額外的引號。對於錯誤處理,你應該總是使用絕對最低限度是

$result = mysql_query(...) or die(mysql_error()); 

即使您的查詢字符串絕對是完全有效的(和你的絕對不是),有太多太多的其他原因查詢未能不是檢查成功/失敗。

0

如果(空($錯誤)){// 將信息寫入到數據庫 的mysql_query(「INSERT INTO產品(名稱,描述,價格,股吧)VALUES($名稱,$描述,$的價格,$股票)」); $ result = mysql_query($ query);

如果不是這種:

如果(空($錯誤)){// 將信息寫入到數據庫 $查詢=「INSERT INTO產品(名稱,描述,價格,股吧)VALUES ($名稱,$描述,$的價格,$股票 「; $結果= mysql_query($查詢);

0

的mysql_query(」 INSERT INTO產品(名稱,描述,價格,股吧)VALUES($名,$ description,$ price,$ stock)「);

您沒有爲您的mysql_query聲明變量。另外,邁克爾對轉義字符串值有一些優點。 試試這個與$查詢圍繞值的變量和單引號。

$query = mysql_query("INSERT INTO products (name, description, price, stock) VALUES ('$name', '$description', '$price', '$stock')");