【问题标题】:Fetching in prepared statements在准备好的语句中获取
【发布时间】:2016-12-28 18:35:38
【问题描述】:

我正在尝试将以下内容转换为预测语句。你能告诉我我哪里出错了。

$userid = mysqli_real_escape_string($con, $_SESSION['usr_id']);
$user = mysqli_query($con, "SELECT * FROM users WHERE id = '" . $userid . "'");
$row = mysqli_fetch_array($user);

我没有运气尝试转换它。到目前为止我所拥有的:

$userid = mysqli_real_escape_string($db, $_SESSION['usr_id']);
$userinfo = $db->prepare("SELECT * FROM users WHERE id = ?");
$userinfo->bind_param("i", $userid);
$userinfo->execute();
$row = $userinfo->fetch_assoc();
$userinfo->close();

进一步的代码(至于我为什么需要这个):

<input class="form-control" name="charname" value="<?php echo $row["charname"]; ?>" required/>

编辑 1:

(我还没有尝试过 localhost。但是当我使用 get_result() 替代方法时它仍然不起作用)

$userinfo = $db->prepare("SELECT * FROM users WHERE id = ?");
$userinfo->bind_param("i", $_SESSION['usr_id']);
$userinfo->execute();
$result = $userinfo->get_result();
$userinfo->close();

$row = $result->fetch_assoc();

当我把它改回这个时,它就可以工作了。

$userid = mysqli_real_escape_string($con, $_SESSION['usr_id']);
$user = mysqli_query($con, "SELECT * FROM users WHERE id = '" . $userid . "'");
$row = mysqli_fetch_array($user);

编辑 2:

移除 get_result();在编辑 1

$db 用于连接。

$db = new mysqli($servername, $username, $password, $dbname);

if (mysqli_connect_errno()) {
    printf("Error: %s\n", mysqli_connect_error());
    exit();
} 

-

var_dump($userinfo->execute());

返回:

bool(true)

-

var_dump($result);

返回:

object(mysqli_result)#4 (5) { ["current_field"]=> int(0) ["field_count"]=> int(11) ["lengths"]=> NULL ["num_rows"]=> int(1) ["type"]=> int(0) }

【问题讨论】:

  • 使用bind_param时不需要做real_escape_string。当你尝试时会发生什么?
  • @aynber 即使没有它仍然无法工作
  • 它不起作用怎么办?您收到错误消息吗?尝试使用mysqli_error() 看看它是否为您提供任何信息。
  • @aynber 没有来自 mysqli_error() 的错误消息
  • twitter.com/ShrapnelCol/status/811554258927702016 不必猜测正确的语法,您必须从手册页中学习。然后转到 PDO

标签: php mysqli


【解决方案1】:

请看下面这句话,

$row = $userinfo->fetch_assoc();

$userinfo 是一个语句对象,而不是 mysqli_result 对象。所以你不能像 that 这样在你的代码中使用它。使用-&gt;get_result()方法从prepared statement中获取结果集,然后从结果集中取出行,如下所示:

$userinfo = $db->prepare("SELECT * FROM users WHERE id = ?");
$userinfo->bind_param("i", $userid);
$userinfo->execute();
$result = $userinfo->get_result();
$userinfo->close();

$row = $result->fetch_assoc();

稍后,您可以在 input 元素中使用此 $row 变量,

<input class="form-control" name="charname" value="<?php echo $row["charname"]; ?>" required/>

旁注:

  • 如果您使用准备好的语句,那么您不必使用mysqli_real_escape_string() 函数转义任何内容。您可以直接在您的-&gt;bind_param() 方法中使用$_SESSION['usr_id'],如下所示:

    $userinfo->bind_param("i", $_SESSION['usr_id']);
    
  • -&gt;get_result() 方法仅适用于 MySQL 本机驱动程序 (mysqlnd),因此如果您没有安装 那个 特定驱动程序,它将无法工作。

【讨论】:

  • 我使用的虚拟主机可能没有 MySQL 本机驱动程序,因为它似乎不起作用。有什么办法可以克服这个吗?谢谢。
  • @MMQVBN 首先在您的 localhost 上测试它,并检查所有功能是否正常工作。然后,您可以确定您的托管服务器没有安装那个
  • @MMQVBN 如果您的服务器中没有安装 mysqlnd 驱动程序,那么这是解决方法,http://stackoverflow.com/a/30551477/5517143
  • 我还没有尝试过本地主机,但即使有解决方法,它似乎也不起作用。还有什么我可以尝试的吗? (用我现在所拥有的内容编辑了问题。)
  • @MMQVBN $result = get_result($userinfo); 错了,应该是$result = $userinfo-&gt;get_result();如答案中给出的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多