PHP编写的语句返回-1(PHP Prepared Statement Returns -1)

2019-10-20 19:03发布

我一直在使用准备好的发言一小会儿,现在我从来没有任何问题。

现在,我想:

$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(); 执行后..但我不知道它现在和以前从未需要..

Answer 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}");


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


文章来源: PHP Prepared Statement Returns -1
标签: php mysqli