我一直在使用准备好的发言一小会儿,现在我从来没有任何问题。
现在,我想:
$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(); 执行后..但我不知道它现在和以前从未需要..
每个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}");
从文档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();
}