【问题标题】:PHP Query Update DataPHP 查询更新数据
【发布时间】:2022-10-05 17:33:55
【问题描述】:

这是我得到的错误:

更新问题 SET situacao=\'Concluido\' WHERE id=? SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以在第 1 行的 \'?\' 附近使用正确的语法

感谢大家,我尝试了很多东西,只设法使用下面的代码

  • 身份证对吗?在您使用 2 的代码中,但在屏幕截图中它是 22。顺便说一句,使用现有的数据库包装器处理该任务会更容易和更安全。现在您负责清理用户输入以防止 SQL 注入。
  • 我看到我和我把它改成 ?所以它可以读取任何行
  • 请显示您的 PHP 代码。您可以在PHPize.online 上分享代码

标签: php mysql


【解决方案1】:

你很接近你自己的答案。正如 Slava Rozhnev 指出的那样,尽管您的代码对 SQL 注入是开放的。在您的问题中,您在查询中使用了占位符。当您准备声明时,您告诉 PDO:whatever I put in there, do not execute it, it is just data。准备好后,您可以将值绑定到占位符。这可以通过bindValuebindParam 甚至execute() 来完成

<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "oil";

$id = 'id';
$sql = "UPDATE problemas SET situacao='Concluido' WHERE id=?";
try {
    $link = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);

    $link->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 . "<br>" . $e->getMessage();
}

$link = null;

?>

$stmt-&gt;bindValue(1, $id) 行读取当前值并用它替换占位符。如果您要使用循环,并且$id 将不断变化,您可以使用$stmt-bindParam(1, $id) 这在执行查询时读取$id 变量的当前值。另一种选择是删除bindValue 调用并让execute 绑定值。这可以通过将值数组作为参数添加到execute 调用来完成。在您的情况下,这将是$stmt-&gt;execute([$id])。我个人的偏好是为此执行,因为它比在执行之前添加大量的 bindValue 调用要清晰得多。

另外,请注意,我已将 $sql 变量的赋值移到 try-catch 块之外。这是因为您想在 catch 中使用变量,如果 PDOException 被 PDO 的构造函数抛出,这可能会出现问题(在 $link = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);

【讨论】:

    【解决方案2】:
    <?php
    $servername = "localhost";
    $username = "root";
    $password = "";
    $dbname = "oil";
    
    $id = 'id';
    
    try {
      $link = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    
      $link->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
      $sql = "UPDATE problemas SET situacao='Concluido' WHERE id=$id";
    
      $stmt = $link->prepare($sql);
    
      $stmt->execute();
    
      header("Location:verTodos.php");
    } catch(PDOException $e) {
      echo $sql . "<br>" . $e->getMessage();
    }
    
    $link = null;
    
    ?>
    

    这就是您需要解决的问题

    更新问题 SET situacao='Concluido' WHERE id=? SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以了解在“?”附近使用的正确语法。在第 1 行

    【讨论】:

    • 此代码为 SQL 注入开放!永远不要在 SQL 查询中进行变量连接!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 2020-11-20
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多