【问题标题】:fetching the data when using prepared statements with mysqli使用带有 mysqli 的准备好的语句时获取数据
【发布时间】:2017-07-03 14:27:46
【问题描述】:

这是我在网上找到的标准代码,用于在使用 mysqli 准备好的语句时蚀刻数据:

$sql = "SELECT Title, CopyrightYear FROM Books WHERE ID=?";

if ($statement = mysqli_prepare($connection, $sql)) {

    mysqli_stmt_bindm($statement, 'i', $id);
    mysqli_stmt_execute($statement); //Question 1 
    mysqli_stmt_bind_result($statement, $title, $year);

    while (mysqli_stmt_fetch($statement)) {  //Question 2 
        echo $title . '-' . $year . '<br/>';
    }
}

我有一些问题:

  1. 为什么我们不存储mysqli_stmt_execute的结果?我们可以使用类似的东西:

$result = mysqli_stmt_execute($statement);那么我们可以从结果集中检索每条记录吗?

  1. 既然我们已经执行了查询,那么mysqli_stmt_fetch($statement)是什么意思呢?我们不是已经执行了$statement,不应该是这样吗:mysqli_stmt_fetch($result)?

【问题讨论】:

  • mysqli_stmt_bindm() ?????
  • prepare 将查询发送到数据库进行编译和优化。它实际上并没有运行查询显然因为它有一个? 参数需要在查询实际完成之前绑定
  • execute 运行查询,但不返回查询执行生成的结果集
  • fetch 每次调用时都会从结果集中获取一行
  • 如果您查找 mysqli_stmt_execute,您会看到它返回一个布尔值,而不是结果集 mysqli_stmt_execute

标签: php mysql mysqli prepared-statement


【解决方案1】:

execute 函数不会返回结果,但mysqli_stmt_get_result() 会。然后,您可以一次从结果资源中获取一行。这种用法可能对您更有意义:

if ($statement = mysqli_prepare($connection, $sql)) {

    mysqli_stmt_bind_param($statement, 'i', $id);
    mysqli_stmt_execute($statement);
    $result = mysqli_stmt_get_result($statement);

    while ($row = mysqli_fetch_assoc($result)) {
        echo $row['title'] . '-' . $row['year'] . '<br/>';
    }
}

execute 函数没有返回结果集的一个原因是某些 SQL 语句(如 INSERT、UPDATE、DELETE、CREATE、DROP 等)没有结果集。所以execute函数只返回一个布尔值来表示语句是否运行成功。

【讨论】:

  • 。谢谢您的回答。那么 $statement 是结果资源吗? mysqli_stmt_execute($statement) 是在执行查询(reaultset 已经生成)还是只是在执行语句(男性确定语句编译,还没有生成结果集)?
  • @whoisit,$statement 是 mysqli_stmt 资源。正如我所说,有些语句不返回结果集。
【解决方案2】:

为什么我们不存储mysqli_stmt_execute 的结果?我们可以使用类似:$result = mysqli_stmt_execute($statement); 然后我们可以从结果集中检索每条记录?

这是因为mysqli_stmt_execute() 函数 执行已使用mysqli_prepare() 函数准备的查询。执行时,任何存在的参数标记将自动替换为适当的数据。它不返回任何结果集,而只是返回执行查询的状态,即TRUEFALSE

既然我们已经执行了查询,那么mysqli_stmt_fetch($statement) 是什么意思?我们不是已经执行了$statement,不应该是这样的吗:mysqli_stmt_fetch($result)

同样,由于mysqli_stmt_fetch()函数只是执行prepared statement并且不返回任何结果集,因此您需要将变量绑定到prepared statement以存储结果。而来自the doc

当调用mysqli_stmt_fetch() 获取数据时,MySQL 客户端/服务器协议将绑定列的数据放入指定的变量 var1, ....

【讨论】:

  • 感谢您的回答。那么 $statement 是结果资源吗? mysqli_stmt_execute($statement) 是在执行查询(reaultset 已经生成)还是只是在执行语句(男性确定语句编译,还没有生成结果集)?
  • @whoisit $statement 是一个MySQLi statement object,它不是你可以在准备好的语句之后直接循环的东西(就像你对mysqli_query() 所做的那样)。正如我在答案中所说,mysqli_stmt_execute() 不返回任何结果集,它只是执行使用mysqli_prepare() 函数准备的查询,并用适当的数据替换任何参数标记(如果存在)。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-22
相关资源
最近更新 更多