SELECT不在PHP中使用变量

时间:2017-08-29 19:12:48

标签: php mysql sql mysqli

我有一个测试代码,我尝试访问我的数据库信息。但是一个使用预处理语句的脚本不起作用,第二个没有预处理语句的脚本工作正常。无法找到问题所在:/

$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();
?> 

3 个答案:

答案 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";
}
?>