我一直在使用准备好的陈述,我从来没有遇到任何问题。
现在我想:
$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();执行后...但我不确定它现在是否需要而且从未在......之前...
答案 0 :(得分:1)
来自mysqli_stmt->affected_rows
的文档:
此功能仅适用于更新表的查询。 要从SELECT查询中获取行数,请改用
mysqli_stmt_num_rows()
。
因此,您只能将此方法与UPDATE
或DELETE
查询一起使用。
此外:
返回值 大于零的整数表示受影响或检索的行数。零表示没有为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}");