【问题标题】:PHP Prepared Statement Returns -1PHP 准备好的语句返回 -1
【发布时间】:2011-02-02 16:55:51
【问题描述】:

我已经使用准备好的语句有一段时间了,我从来没有遇到过任何问题。

现在我正在尝试:

$sql="SELECT PhotoID,Caption FROM Photos WHERE EntityID=? AND TypeID=? LIMIT ?,?";

$iDB = new mysqliDB(); // Extends mysqli

$stmt = $iDB->prepare($sql);

$stmt->bind_param('iiii',$entityID,$typeID,$minRange,$maxRange);

$stmt->execute();

$stmt->bind_result($photoID,$caption);

echo("Affected={$stmt->affected_rows}");

这会打印 -1。我已经三重测试了 bindParam 中的所有 4 个值都已设置,并且当使用相应的值粘贴到 myAdmin 中时,sql 查询可以正常工作。

知道是什么原因造成的吗?

Edit:: 我在网上找到了答案,显然我需要使用 $stmt->store_result();执行后..但我不确定现在是否需要它,以前从未需要..

【问题讨论】:

    标签: php mysqli


    【解决方案1】:

    每个 mysqli 函数/方法可能失败。根据您扩展class mysqli 的方式,您可能必须测试每个返回值。如果方法返回false,则发生错误并且错误消息存储在 mysqli 或语句对象的属性中。

    $sql="SELECT PhotoID,Caption FROM Photos WHERE EntityID=? AND TypeID=? LIMIT ?,?";
    
    $iDB = new mysqliDB(); // Extends mysqli
    if ($iDB->connect_error) {
      printf('connect error (%d) %s', $iDB->connect_errno, htmlspecialchars($iDB->connect_error));
      die;
    }
    
    $stmt = $iDB->prepare($sql);
    if ( false===$stmt ) {
      printf('prepare failed: %s', htmlspecialchars($iDB->error));
      die;
    }
    
    $rc = $stmt->bind_param('iiii',$entityID,$typeID,$minRange,$maxRange);
    if ( false===$rc ) {
      printf('bind_param failed: %s', htmlspecialchars($stmt->error));
      die;
    }
    
    $rc = $stmt->execute();
    if ( false===$rc ) {
      printf('execute failed: %s', htmlspecialchars($stmt->error));
      die;
    }
    
    $rc = $stmt->bind_result($photoID,$caption);
    if ( false===$rc ) {
      printf('bind_result failed: %s', htmlspecialchars($stmt->error));
      die;
    }
    
    // echo("Affected={$stmt->affected_rows}");
    

    【讨论】:

    • 谢谢,我从来没想过要这样调试——我一直以为只是execute()会经常出错
    【解决方案2】:

    来自mysqli_stmt->affected_rows的文档:

    此函数仅适用于更新表的查询。 要从 SELECT 查询中获取行数,请改用 mysqli_stmt_num_rows()

    因此,您只能将此方法与 UPDATEDELETE 查询一起使用。

    此外:

    返回值 大于零的整数表示受影响或检索的行数。零表示没有为 UPDATE/DELETE 语句更新的记录、没有与查询中的 WHERE 子句匹配的行或尚未执行任何查询。 -1 表示查询返回错误。 NULL 表示向函数提供了无效参数。

    但这也可能意味着它返回-1,因为您尝试将它用于SELECT 语句。试试mysqli_stmt_num_rows()

    更新:

    我链接到的页面示例:

    $query = "SELECT Name, CountryCode FROM City ORDER BY Name LIMIT 20";
    if ($stmt = $mysqli->prepare($query)) {
    
        /* execute query */
        $stmt->execute();
    
        /* store result */
        $stmt->store_result();
    
        printf("Number of rows: %d.\n", $stmt->num_rows);
    
        /* close statement */
        $stmt->close();
    }
    

    【讨论】:

    • 这个我知道,但是什么错误?该语句很好,并且正确填充了值。
    • @pws5068:而你使用mysqli_stmt_num_rows的结果是什么?
    • 总是零,但也许我使用不正确? $stmt->执行(); die("Rows = ".mysqli_stmt_num_rows($stmt));
    • @pws5068:您在问题中写的内容是正确的,您必须首先使用$stmt->store_result();:请参阅此处的示例:php.net/manual/en/mysqli-stmt.num-rows.php
    猜你喜欢
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    • 2015-07-13
    • 2012-01-31
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 2013-02-08
    相关资源
    最近更新 更多