首頁  >  問答  >  主體

PHP查詢更新數據

這是我收到的錯誤:

更新問題SET situacao='Concluido' WHERE id=? SQLSTATE[42000]: 語法錯誤或存取衝突: 1064 您的SQL 語法有錯誤;檢查與您的MariaDB 伺服器版本相對應的手冊,了解在「? 「附近使用的正確語法在第1 行

我嘗試了很多東西,最後只能使用下面的程式碼,感謝大家

P粉938936304P粉938936304186 天前410

全部回覆(1)我來回復

  • P粉132730839

    P粉1327308392024-04-02 12:07:59

    您已經接近自己的答案了。正如 Slava Rozhnev 指出的那樣,儘管你的程式碼對 SQL 注入是開放的。在您的問題中,您在查詢中使用佔位符。當您準備語句時,您告訴 PDO:無論我放入其中的內容,都不要執行它,它只是資料。準備好後,您可以將值綁定到佔位符。這可以透過 bindValuebindParam 或甚至使用 execute()

    #
    setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
        $stmt = $link->prepare($sql);
        $stmt->bindValue(1, $id);
    
        $stmt->execute();
    
        header("Location:verTodos.php");
    } catch (PDOException $e) {
    
        echo $sql . "
    " . $e->getMessage(); } $link = null; ?>

    $stmt->bindValue(1, $id)讀取目前值並用它取代佔位符。如果您要使用循環,並且$id 會不斷變化,您可以使用$stmt-bindParam(1, $id) 這會讀取< code>$id執行查詢時的變數。另一個選擇是刪除 bindValue 呼叫並讓 execute 綁定值。這可以透過將值數組作為參數新增至 execute 呼叫來完成。在您的情況下,這將是 $stmt->execute([$id])。我個人更喜歡執行它,因為它比在執行之前添加大量的 bindValue 呼叫要清晰得多。

    另請注意,我已將 $sql 變數的賦值移至 try-catch 區塊之外。這是因為您想要在catch 中使用變量,如果PDO 的建構子拋出PDOException(在行$link = new PDO("mysql:host=$servername;dbname= $dbname", $用戶名, $密碼);

    回覆
    0
  • 取消回覆