84669 人学习
152542 人学习
20005 人学习
5487 人学习
7821 人学习
359900 人学习
3350 人学习
180660 人学习
48569 人学习
18603 人学习
40936 人学习
1549 人学习
1183 人学习
32909 人学习
这是我收到的错误:
更新问题 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", $用户名, $密码);