2017-08-29 37 views
0

我有一个测试代码,我尝试访问我的数据库信息。但是一个使用准备好的语句的脚本不起作用,其次没有准备好的语句就可以正常工作。无法找到问题出在哪里:/SELECT不能在PHP中使用变量

$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

'$ username'容器根,你的数据库连接。不'测试' – aynber

+0

@anyber上帝,这太明显了。好的,所以第二个可以工作,但使用stmt的仍然不起作用:/ – PhpNewbie

+0

您是否检查了您的Web服务器的错误日志。你在这里没有做任何真正的错误检查。 –

回答

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()。这是finicky和num_rows将为0,除非您在运行之前存储结果$stmt->num_rows;

我也会使用一个独特的列而不是*,例如id例如。

+0

仍然无法正常工作。 – PhpNewbie

+0

上面的语法正确。回显$行,看看它有什么 – clearshot66

+0

似乎store_result()解决了这个问题。这很奇怪,因为我有以前的项目,我没有使用函数来存储结果,但它工作得很好。 – PhpNewbie

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()))。

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