【问题标题】:Combining two prepared statements not working结合两个准备好的语句不起作用
【发布时间】:2017-08-22 06:33:04
【问题描述】:

首先,根据另一个SO post,我尝试将这两个语句合二为一。

<?php
  $conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, 1);
  $sql  = "UPDATE users SET pass = :password WHERE usrn = :id;
           SELECT prim FROM users WHERE usrn = :id;";
  $stmt = $conn->prepare($sql);
  $stmt->bindParam(":id", $_SESSION["idPersist"]);
  $stmt->bindParam(":password", password_hash($_POST["password"], PASSWORD_DEFAULT));
  $stmt->execute();
  $result = $stmt->fetch(PDO::FETCH_ASSOC); //// line 71
?>

但是,这一直抛出错误:Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error on line 71

我找不到任何相关的解决方案来解决这个问题,所以我决定简单地将这两个语句分开。

<?php
  $sql  = "UPDATE users SET pass = :password WHERE usrn = :id";
  $stmt = $conn->prepare($sql);
  $stmt->bindParam(":id", $_SESSION["idPersist"]);
  $stmt->bindParam(":password", password_hash($_POST["password"], PASSWORD_DEFAULT));
  $stmt->execute();
  $sql  = "SELECT prim FROM users WHERE usrn = :id";
  $stmt = $conn->prepare($sql);
  $stmt->bindParam(":id", $_SESSION["idPersist"]);
  $stmt->execute();
  $result = $stmt->fetch(PDO::FETCH_ASSOC);
  $_SESSION["session"] = $result["prim"];
?>

但是var_dump($result) 正在返回Bool(false),因此显然在这两种情况下都无法正常获取结果并将其存储为变量。

我是 PHP 和 MySQL 的新手,所以我现在很茫然。

【问题讨论】:

  • 尝试使用 fetchAll 代替 fetch
  • @Akintunde 我会试试的,谢谢
  • @Akintunde fetch 确实有效。我只是错过了一个执行语句。我想我已经盯着屏幕太久了。我可以发誓我检查过:/有没有办法结合这两个陈述?
  • 哦,哈哈,我什至没有发现。因为您的代码有点聚集。你是什​​么意思结合?你不能加入这两张桌子吗?数据库架构如何
  • 如果您正在编码,请休息一下,当我进入超级驱动器时会出错,您使用什么 IDE 进行编码?

标签: php mysql pdo prepared-statement


【解决方案1】:

改变这个,

$sql  = "SELECT prim FROM users WHERE usrn = :id";
$stmt = $conn->prepare($sql);
$stmt->bindParam(":id", $_SESSION["idPersist"]);
$result = $stmt->fetch(PDO::FETCH_ASSOC);
$_SESSION["session"] = $result["prim"];

对此,

$sql  = "SELECT prim FROM users WHERE usrn = :id";
$stmt = $conn->prepare($sql);
$stmt->bindParam(":id", $_SESSION["idPersist"]);
$stmt->execute(); // Your problem
$result = $stmt->fetch(PDO::FETCH_ASSOC);
$_SESSION["session"] = $result["prim"];

您错过了查询的执行。

【讨论】:

  • NM 我想我确实错过了它 o:我可以发誓我检查过了。这两个查询不能合并吗?
  • 现在删除这个问题。我不想要任何其他反对票:/
  • 我平衡了它没有问题是愚蠢的,即使我问过这样的问题。
  • 这正是我的感受。我很少对 cme​​ts 投反对票,即使是那些非常直截了当的 cmets。每个人都必须从某个地方开始,每个人都会犯错,对吧?我讨厌 SO 社区中无情地拒绝投票的那部分人。如果您知道条款,那么在搜索或搜索解决方案时不知道什么是不难找到的东西
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-09
  • 2015-10-11
  • 2018-01-24
  • 1970-01-01
  • 2010-10-14
  • 1970-01-01
相关资源
最近更新 更多