我有一个测试代码,我尝试访问我的数据库信息。但是一个使用预处理语句的脚本不起作用,第二个没有预处理语句的脚本工作正常。无法找到问题所在:/
$userzzz = "test";
通过这个脚本,我得到了" BAD"结果
$db = new mysqli("localhost", "root", "", "test");
$stmt = $db->prepare('SELECT * FROM user WHERE username=?');
$stmt->bind_param('s', $userzzz);
$stmt->execute();
echo $stmt->num_rows();
if ($stmt->num_rows > 0){
echo "good";
} else {
echo "bad";
}
有了这个,我得到了好的"结果。
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "test";
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "SELECT * FROM user WHERE username = '$userzzz'";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
echo "good";
}
} else {
echo "bad";
}
$conn->close();
?>
答案 0 :(得分:3)
从手册中,
使用
mysqli_stmt_num_rows()
取决于您是否使用mysqli_stmt_store_result()
缓冲语句句柄中的整个结果集。如果您使用
mysqli_stmt_store_result()
,则可能会立即调用mysqli_stmt_num_rows()
。
这意味着您必须在执行后使用$stmt->store_result();
,但在访问num_rows
属性之前。
$stmt = $db->prepare('SELECT * FROM user WHERE username=?');
$stmt->bind_param('s', $userzzz);
$stmt->execute();
$stmt->store_result();
echo $stmt->num_rows;
if ($stmt->num_rows > 0){
echo "good";
} else {
echo "bad";
}
如果不这样做,行将不会被缓冲到内存中,并且无法知道实际返回了多少行,直到循环遍历整个数据集(while ($stmt->fetch())
})。
答案 1 :(得分:2)
在面向对象的mysqli中,num_rows不是函数,它是结果的属性(stmt)。您需要$stmt->num_rows;
而不是$stmt->num_rows();
在你的第二个例子中,你没有使用(),你正在正确地做,因此它在第二个但不是第一个中起作用。
$db = new mysqli("localhost", "root", "", "test");
$stmt = $db->prepare('SELECT unique_col FROM user WHERE username=?');
$stmt->bind_param('s', $userzzz);
$stmt->execute();
$stmt->store_result();
$rows = $stmt->num_rows;
if ($rows > 0){
echo "good";
} else {
echo "bad";
}
我还添加了$stmt->store_result()
。它很挑剔,num_rows将为0,除非您在运行$stmt->num_rows;
我还会使用唯一列而不是*,例如id
。
答案 2 :(得分:0)
你需要在执行后绑定结果,这将适用于你的情况(适合我):
<?php
$userzzz = 'test';
$db = new mysqli("localhost", "root", "", "test");
$stmt = $db->prepare('SELECT * FROM users WHERE username = ?');
$stmt->bind_param('s', $userzzz);
$stmt->execute();
$stmt->store_result();
echo $stmt->num_rows();
if ($stmt->num_rows() > 0){
echo "good";
} else {
echo "bad";
}
?>