這是我收到的錯誤:
更新問題SET situacao='Concluido' WHERE id=? SQLSTATE[42000]: 語法錯誤或存取衝突: 1064 您的SQL 語法有錯誤;檢查與您的MariaDB 伺服器版本相對應的手冊,了解在「? 「附近使用的正確語法在第1 行
我嘗試了很多東西,最後只能使用下面的程式碼,感謝大家
您已經接近自己的答案了。正如 Slava Rozhnev 指出的那樣,儘管你的程式碼對 SQL 注入是開放的。在您的問題中,您在查詢中使用佔位符。當您準備語句時,您告訴 PDO:無論我放入其中的內容,都不要執行它,它只是資料。準備好後,您可以將值綁定到佔位符。這可以透過 bindValue 或 bindParam 或甚至使用 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) 這會讀取$id執行查詢時的變數。另一個選擇是刪除 bindValue 呼叫並讓 execute 綁定值。這可以透過將值數組作為參數新增至 execute 呼叫來完成。在您的情況下,這將是 $stmt->execute([$id])。我個人更喜歡執行它,因為它比在執行之前添加大量的 bindValue 呼叫要清晰得多。
$stmt->bindValue(1, $id)
$id
$stmt-bindParam(1, $id)
bindValue
execute
$stmt->execute([$id])
另請注意,我已將 $sql 變數的賦值移至 try-catch 區塊之外。這是因為您想要在catch 中使用變量,如果PDO 的建構子拋出PDOException(在行$link = new PDO("mysql:host=$servername;dbname= $dbname", $用戶名, $密碼);
$sql
$link = new PDO("mysql:host=$servername;dbname= $dbname", $用戶名, $密碼);
您已經接近自己的答案了。正如 Slava Rozhnev 指出的那樣,儘管你的程式碼對 SQL 注入是開放的。在您的問題中,您在查詢中使用佔位符。當您準備語句時,您告訴 PDO:
#無論我放入其中的內容,都不要執行它,它只是資料
。準備好後,您可以將值綁定到佔位符。這可以透過 bindValue 或 bindParam 或甚至使用 execute()行
$stmt->bindValue(1, $id)
讀取目前值並用它取代佔位符。如果您要使用循環,並且$id
會不斷變化,您可以使用$stmt-bindParam(1, $id)
這會讀取$id執行查詢時的變數。另一個選擇是刪除bindValue
呼叫並讓execute
綁定值。這可以透過將值數組作為參數新增至execute
呼叫來完成。在您的情況下,這將是$stmt->execute([$id])
。我個人更喜歡執行它,因為它比在執行之前添加大量的 bindValue 呼叫要清晰得多。另請注意,我已將
$sql
變數的賦值移至 try-catch 區塊之外。這是因為您想要在catch 中使用變量,如果PDO 的建構子拋出PDOException(在行$link = new PDO("mysql:host=$servername;dbname= $dbname", $用戶名, $密碼);