簡體   English   中英

奇怪的未解決的PDO錯誤:語法錯誤或訪問沖突:1064 SQL語法有錯誤;

[英]Strange unsolved PDO error: Syntax error or access violation: 1064 You have an error in your SQL syntax;

我在php腳本中遇到錯誤:

PHP致命錯誤:未被捕獲的PDOException:SQLSTATE [42000]:語法錯誤或訪問沖突:1064您的SQL語法有錯誤;請參見語法錯誤。 檢查與您的MySQL服務器版本相對應的手冊以獲取正確的語法,以在/var/www/html/a.php:143中的第1行的''附近使用

請注意它在'' (兩個單引號)附近說'' 該腳本曾經在我以前的服務器上正常工作,但是當我移到新服務器時,它一直顯示此錯誤。 我的PHP版本是7.0,而Mysql版本是5.7.22。

我如何連接到mysql:

try{
    $pdo = new PDO("mysql:host=localhost;dbname=db_name", $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "Connected successfully";
} catch(PDOException $e){
    echo "Connection failed: " . $e->getMessage();
}

它將顯示:“連接成功”。 這些是包含PDO查詢的第142和143行:

$stmt = $pdo->prepare("SELECT has_paid FROM info WHERE chat_id=".$chat_id);
$stmt->execute();

我訪問了類似的問題,但他們沒有幫助。

我該如何解決?

我懷疑您的$chat_id為空。 因此,您的SQL查詢最終成為:

SELECT has_paid FROM info WHERE chat_id=

MySQL的語法錯誤報告如下 ,其中MySQL的糊塗了的地方SQL查詢的一部分。 在這種情況下,它會在''附近報告錯誤,因為在查詢結束時感到困惑。 這並不奇怪,因為=需要一個右手邊的參數。

在嘗試查詢之前,應檢查設置$chat_id的代碼,並確保它具有非空值。

順便說一句,對我來說,您正在使用prepare()execute()卻沒有使用查詢參數,這對我來說似乎很奇怪。 您應該這樣編碼:

$stmt = $pdo->prepare("SELECT has_paid FROM info WHERE chat_id=?");
$stmt->execute([$chat_id]);

(無需像某些人所說的那樣使用bindValue() 。)

您沒有正確使用准備好的語句,而是向自己開放了SQL注入漏洞。

使用這樣的東西...

$stmt = $pdo->prepare("SELECT has_paid FROM info WHERE chat_id= :chat_id");
$stmt->bindValue(":chat_id", $chat_id);
$stmt->execute();

您的錯誤是在告訴您到底出了什么問題。 您的SQL查詢無效。 PHP或PDO都不是問題。 $chat_id可能是一個空變量。 實際上,我檢查了您的SQL語法。 只要為$chat_id提供值,它就完全有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM