PHP Prepared语句返回-1

时间:2010-03-30 22:53:48

标签: php mysqli

我一直在使用准备好的陈述,我从来没有遇到任何问题。

现在我想:

$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查询可以正常工作。

知道可能导致这种情况的原因吗?

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

2 个答案:

答案 0 :(得分:1)

来自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();
}

答案 1 :(得分: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}");