2017-05-26 30 views
-1

我使用的查詢(從PHP)是庫MySQLi UPDATE有一列

"UPDATE articles SET 
title='".$_POST['title']."', 
contents='".$_POST['cont']."', 
category='".$_POST['cat']."', 
desc='".$_POST['desc']."' 
WHERE stitle='".$_POST['stitle']."'"; 

一個錯誤,我得到的錯誤

您的SQL語法錯誤;檢查對應於你的MySQL服務器版本的手冊正確的語法使用近「DESC =」你好「WHERE stitle ='在第1行

香蕉」如果我刪除desc='".$_POST['desc']."'的查詢工作。字段'desc'是varchar(150)。我可以直接從phpMyAdmin插入文本,該字段絕對稱爲'desc',並且$_POST['desc']肯定會捕獲一個值(我嘗試使用echo $_POST['desc'];並傳遞一個值)。我試着將代碼更改爲desc='test',這不起作用。

任何想法?

+0

問題可能出現在您的$ _POST ['cat']'值中。您應該使用帶有綁定參數的準備語句 – Phil

+0

感謝您的迴應。我會試一試。 – jcvamp

+0

沒有。沒有工作。我將它改爲'$ tit = $ _ POST ['title']; $ stit = $ _ POST ['stitle']; $ cont = $ _ POST ['cont']; $ desc = $ _ POST ['desc']; $ cat = $ _ POST ['cat'];'和 'UPDATE articles SET title ='「。$ tit。」',contents ='「。$ cont。」',category ='「。$ cat。」 ',desc ='「。$ desc。」'WHERE stitle ='「。$ stit。」';'同樣的錯誤。 – jcvamp

回答

0

我設法解決了這個問題。我在表格中創建了一個新列,將'desc'中的信息複製到該列中,刪除了'desc'。我用新的列名運行查詢,並且它工作。我不知道問題是什麼,但是解決了這個問題。

+0

可能問題在於列名本身。我已經用逃生更新了答案以避免這些問題。你可以檢查它,如果你喜歡。 –

+0

我很欣賞這種努力。謝謝。 – jcvamp

-1

問題是你的$ _POST ['desc']包含一個撇號。我建議你在所有參數上使用函數mysqli_real_escape_string(doc:http://be2.php.net/manual/en/mysqli.real-escape-string.php)。

另外,嘗試用反引號逃避所有行和表,以避免保留字創建錯誤。

您所查詢的例子看起來像這樣與他們同在

"UPDATE `articles` SET `title` = '".mysqli::real_escape_string($_POST['title'])."', `contents` = '".mysqli::real_escape_string($_POST['cont'])."', `category` = '".mysqli::real_escape_string($_POST['cat'])."', `desc` = '".mysqli::real_escape_string($_POST['desc'])."' WHERE `stitle` = '".mysqli::real_escape_string($_POST['stitle'])."'"; 

如果您正在使用的程序的編程風格調用mysqli的功能,使用方法:

"UPDATE `articles` SET `title` = '".mysqli_real_escape_string($link, $_POST['title'])."', `contents` = '".mysqli_real_escape_string($link, $_POST['cont'])."', `category` = '".mysqli_real_escape_string($link, $_POST['cat'])."', `desc` = '".mysqli_real_escape_string($link, $_POST['desc'])."' WHERE `stitle` = '".mysqli_real_escape_string($link, $_POST['stitle'])."'"; 

(Obviosuly,替換變量$鏈接當你做mysqli_connect()時初始化)

使用這些函數,你可以避免這些錯誤,並且還有很多SQL漏洞。如果變量包含整數,則不需要,但是,您總是需要檢查傳遞給SQL引擎的數據以避免問題。

是一種很好的做法,可以進行一些檢查,例如,測試誰的整數變量包含整數,或使用mysqli :: real_escape_string進行轉義。而且,如果輸入數據中有某些內容不正確,請暫停該進程並且不要求SQL查詢。

+0

感謝您的回覆。它產生錯誤'非靜態方法mysqli :: real_escape_string()不能被靜態調用。我曾想過,當我刪除「desc」列時,它不會發布。 – jcvamp

+0

我按照[這裏](https://www.w3schools.com/php/func_mysqli_real_escape_string)更正了real_escape_string代碼。asp),並再次得到原始錯誤。 – jcvamp

+0

如果您檢查文檔,該函數有被調用的另一種形式。如果您在代碼中使用過程樣式,請將所有mysqli :: real_escape_string()替換爲mysqli_real_escape_string($ link,$ escapestr),其中$ link是您在mysqli_connect()上創建的變量,而$ escapestr則爲$ _POST var被清除。 –