2011-12-17 83 views
0

我在遇到以下代碼時遇到了問題。它已被簡化以顯示問題。我使用循環,因爲輸入名稱是相同的,需要在mysql表中創建多個新行。問題是我使用$ _POST ['name'] [$ i],表格不會接受,因爲它不會將它看作'文本',...我想。像我說的那樣,代碼被大大簡化了。

for($i=0;$i<count($_POST['url']); $i++) { 
    $sql = 'INSERT INTO urls (url) VALUES ('. $_POST['url'][$i].')'; 
    if(!mysql_query($sql)) { 
    echo "error " . mysql_error(); 
    } 
} 

我試圖與此有關rememdy -

$ SQL = 'INSERT INTO網址(URL)VALUES(' '「'。$ _POST [ 'URL'] [$ i]於」。「 '。')';

如果我這樣做它的工作原理,沒有錯誤

$sql = 'INSERT INTO urls (url) VALUES (' " hello " ')'; 

這可能是一個新手型搞錯吧?感謝任何幫助。

+1

發佈html

標記。 – adatapost 2011-12-17 04:35:56

+2

您的代碼易受SQL注入攻擊。我建議你閱讀這個主題,並且(至少)在插入前通過`mysql_real_escape_string()`運行它們來逃避你的價值。 – kba 2011-12-17 04:38:40

+0

請執行`var_dump($ _ POST)`併發布任何查詢無效的信息。另外,發佈您收到的錯誤。 – kba 2011-12-17 04:39:17

回答

-2

嘗試這種說法

$sql = "INSERT INTO urls (url) VALUES ('". mysql_real_escape_string($_POST['url'][$i])."')"; 
+0

在插入 – 2011-12-17 04:40:39

1

你只需要在你的MySQL查詢添加周圍張貼的價值行情如下圖所示。另外,如果你沒有逃跑的輸入,這是一個巨大的SQL注入漏洞:

$data = mysql_escape_string($_POST['url'][$i]); 
$sql = 'INSERT INTO urls (url) VALUES ("'.$data.'")'; 

查詢打破的MySQL因爲MySQL認爲你的崗位價值應該是不帶引號的數字。

+0

+1之前對帖子值使用mysql_real_escape_string(),我不知道你可以在MySQL中使用雙引號作爲文本分隔符,直到我測試了這個.... – cori 2011-12-17 04:53:43

+0

它們通常不應該被使用。除非我不正確地記住這一點,否則ANSI SQL指定'應該用作字符串分隔符。 – Corbin 2011-12-17 04:54:45

0

看到由mysql_error()返回的實際錯誤信息會很有幫助,但我認爲你的問題是你沒有提供$ _POST值給sql查詢,因爲它認爲它是文本。

嘗試

$sql = "INSERT INTO urls (url) VALUES ('". mysql_real_escape_string($_POST['url'][$i]) ."')"; 
2

更換

$sql = 'INSERT INTO urls (url) VALUES ('. $_POST['url'][$i].')'; 

一個更清潔的方式(和錯誤是固定的):

$urls = (isset($_POST['url']) && is_array($_POST['url'])) ? $_POST['url'] : array(); 
foreach($urls as $url) { 
    if(!is_string($url)) { 
     continue; 
    } 
    $sql = "INSERT INTO urls (url) VALUES ('" . mysql_real_escape_string($url) . "')"; 
    if(!mysql_query($sql)) { 
     echo "error " . mysql_error(); 
    } 
} 

確保在$ _ POST [ '鏈接']是一個數組將不會試圖將一個非數組(或不存在的鍵)作爲一個數組來處理。 is_string是爲了防止用戶試圖拋出一個子數組來讓PHP拋出一個「使用數組作爲字符串」的通知。逃避是爲了避免SQL注入,並且添加的單引號是MySQL知道它是一個字符串。

0

Corbin提供的答案很好 - 但是儘量不要在循環中觸發插入查詢。

您可以創建sql查詢作爲一個字符串,然後觸發插入查詢一次。您可以將插入語句從 插入到表(字段)值(1)中;您可以將插入語句從 插入到表(字段)值(1)中。插入表(字段)值(1)的 ;插入表(字段)值(1),(2),(3),(4)...

這是一個更優化的解決方案 - 但是mysql有一個最大長度,可以使用sql語句 - 因此請使用您的最佳判斷。