2013-09-10 33 views
-1

我不明白为什么$ amountOfUsers显示为0?- > num_rows无法正常工作

在我转移到bind_param函数之前,这用于工作......我只使用了prepare()的query()instad。但是这样更安全,我只是很难理解为什么这种方式无效,以及如何解决这个问题。

$stmt = $mysqli->prepare("SELECT id, expire, status, username FROM username WHERE username= ?"); 
$stmt->bind_param('s', $username); 
$stmt->execute(); 

//Counting results. 0 = Invalid, 1 = Valid 
$amountOfUsers = $stmt->num_rows; 

我得到的错误是:$ amountOfUsers没有正确计算结果的数量。

+0

尝试'mysqli_num_rows',而不是'num_rows'在'$ amountOfUsers = $ stmt-> mysqli_num_rows;'(http://php.net/manual/en/mysqli -result.num-rows.php) –

+0

@ Fred-ii-我试过了,我得到:未定义的属性:mysqli_stmt :: $ mysqli_num_rows在... –

+0

有没有可能用户名不存在于表中? –

回答

1
$stmt = $mysqli->prepare("SELECT id, expire, status, username FROM username WHERE username= ?"); 
$stmt->bind_param('s', $username); 
$stmt->execute(); 
// Store the result (so you can get the properties, like num_rows) 
$stmt->store_result(); 
// Get the number of rows 
$amountOfRows = $stmt->num_rows; 

// Bind the result to variables 
$stmt->bind_result($id, $expire, $status, $db_username); 
// Process the variables 
while($stmt->fetch()) { 
    printf("%d %s %s %s\n", $id, $expire, $status, $db_username); 
} 
+0

我的下一行是“$ row = $ stmt-> fetch_assoc();”也不起作用。 –

+0

最好的练习是比底部更好的练习吗? –

+0

@Arian我改变了代码。现在应该是最高效的。 – FalconC

-2

我永远不会在我的生活理解,为什么PHP用户是如此倾向于行数返回。
特别是如果仅用作一个标志...如果有任何数据返回!

为什么不采取非常返回的数据,看看?

$sql ="SELECT id, expire, status, username FROM username WHERE username= ?s"; 
$stmt = $mysqli->prepare($sql); 
$stmt->bind_param('s', $username); 
$stmt->execute(); 
$res = $stmt->get_result(); 
$row = $res->fetch_assoc(); 
if ($row) 
{ 
    // do whatever 
} 

我永远不会理解长和有风代码的倾向。
为什么不让自己成为一个抽象库,并把所有东西都放在一个单一的行中?

$sql = "SELECT id, expire, status, username FROM username WHERE username= ?"; 
if ($row = $db->getRow($sql)) 
{ 
    // do whatever 
} 
+0

PHP开发人员不使用'num_rows'作为标志来查看是否返回数据。在OP的情况下,他想知道用户名是否有_exactly_一行,而不是零行(用户未注册)或多行(表错误)。后者返回数据,但不应该使用。 – FalconC

0

有时事情不按计划进行。检查库中的可用结果代码和错误通常是用于故障排除效率比对陌生人的询问,但希望这陌生人可以帮助...选择这些模式之一:

答:

$result = $stmt->execute(); 
if (!$result) { /* handle errors */ } 

B:

$stmt->execute(); 
if ($stmt->errno != 0) { /* handle errors */ } 

C(发展疑难解答只,而不是代码,你会乱放):

$stmt->execute(); 
print_r($stmt->error_list); 
这里

更多信息和相关网页: http://www.php.net/manual/en/mysqli-stmt.errno.php

+0

P.S.我的猜测是你的桌子不叫“用户名” – dkamins

+0

是。在我准备好我的发言之前,它工作得很好。我需要:$ stmt-> store_result(); –