2009-12-12 111 views
0
$sql = "UPDATE galleries SET name='$name', desc='$desc', mainthumb='$mt' 
     WHERE id='$id'"; 

這引發了一些錯誤,因爲一些被遺忘的原因。我一定是太累了,因爲我沒有看到它。MySQL語法錯誤

我已確認所有值都已發佈。更糟糕的是,這幾乎是完全正確的複製任何查詢,工作正常。

更新:

這已經得到解決。事實上,desc沒有反引號。我也打算按照建議使用PDO。

回答

7

是不是一個不能用作列名的關鍵字?

+0

我剛試過'SELECT desc FROM Table1'失敗,但引用成功。 – 2009-12-12 11:52:11

+3

的確如此。 http://dev.mysql.com/doc/refman/5.0/en/reserved-words.html - 請注意,對於這些保留字中的許多(全部?),如果您在反引號中圍繞列名稱(應該是做無論如何imho)它會工作得很好。 – 2009-12-12 11:53:20

+0

謝謝,這是非常問題。我寫這些時甚至都沒有想到。 至於注射,這是我在試圖發現問題時的簡化版本。 – RedElement 2009-12-12 12:13:01

1

echo $sql並看看它實際上變成了什麼。它看起來像SQL注入的一個簡單的目標,除非你照顧。

7

您有一個名爲desc的列,它是reserved word。你需要引用反引號。

`desc`='$desc' 
0

是的,請確保您首先清理數據,例如使用mysql_real_escape_string

然後回顯你的mysql錯誤(mysql_error())它會給你更多的提示錯誤在哪裏;

<?php 
$link = mysql_connect("localhost", "mysql_user", "mysql_password"); 

mysql_select_db("nonexistentdb", $link); 
echo mysql_errno($link) . ": " . mysql_error($link). "\n"; 

mysql_select_db("kossu", $link); 
mysql_query("SELECT * FROM nonexistenttable", $link); 
echo mysql_errno($link) . ": " . mysql_error($link) . "\n"; 
?> 
4

你把sanitize all the parameters混合之前用sql語句嗎?
descreserved word in MySQL,你必須明確地mark it as an identifier

的標識符可以或不使用引號。如果標識符包含特殊字符或是保留字,則只要引用標識符就必須引用該標識符。 [...]
標識符引號字符是反引號(「`」):
$mysql = mysql_connect(... 

$sql = " 
    UPDATE 
     galleries 
    SET 
     name='" . mysql_real_escape_string($_POST['name'], $mysql) . "', 
     `desc`='" . mysql_real_escape_string($_POST['desc'], $mysql) . "', 
     mainthumb='" . mysql_real_escape_string($_POST['mt'], $mysql) . "' 
    WHERE 
    id='" . mysql_real_escape_string($_POST['id'], $mysql) . "' 
"; 

甚至更​​好:use prepared statements

+0

用於準備好的語句和'mysqli'。 – 2009-12-12 11:55:07

+1

acutally我有pdo記住;-)鏈接添加 – VolkerK 2009-12-12 11:56:07

0
$sql = "UPDATE `galleries` SET 
      name='".$name."', 
      desc='".$desc."', 
      mainthumb='".$mt."' 
     WHERE id='".$id."'"; 

這可能是處理這一個替代方法。雖然我會按照VolkerK的建議去掉PDO。我也會回聲看看它會輸出什麼。正如Ben所建議的那樣,Desc可能是一個保留字。