2014-01-14 54 views
2
$name = $_GET['user']; 
if(isset($_GET['user']) && strlen($_GET['user'])>0) { 
    $mysqli = new mysqli($dbhost, $dbuser, $dbpass, $db); 
    $stmt = $mysqli->prepare("SELECT username FROM users WHERE username=?"); 
    $stmt->bind_param('s', $name); 
    $stmt->execute(); 
    while($stmt->fetch()) { 
     if($stmt->num_rows == 0) { 
      header("Location: home?errormsg=notfound"); 
      exit(); 
     } 
    } 
    $stmt->store_result(); 
    $stmt->close(); 
} 
$mysqli->close(); 

所以,上面的代碼檢查$ _GET [「名」]存在於數據庫中,如果沒有,重定向到家裏ERRORMSG = NOTFOUND,但它重定向用戶名它存在於數據庫中的鏈接'home?errormsg = notfound'。你能提出一種解決這個問題的方法嗎?PHP - 庫MySQLi預處理語句

+0

爲什麼不檢查與count語句的存在? 'SELECT COUNT(*)AS uncnt FROM users WHERE username =?'。它和選擇用戶名本身一樣快(你基本上扔掉了),並且在語義上更加明確你想要做什麼。 –

回答

3

你必須在$stmt->num_rows之前致電$stmt->store_result()

而您的$stmt->fetch()不是必需的,因爲您不使用選定的數據。

如果在num_rows之後致電store_result(),它將無法工作。從manual page評論

部分:

如果你不使用mysqli_stmt_store_result(),和immediatley呼叫 執行預先準備的聲明後,這個功能,這個功能將 通常返回0,因爲它沒有辦法知道 結果集中有多少行,因爲結果集尚未保存在內存中。

所以,你的代碼看起來應該是這樣:

$name = $_GET['user']; 
if(isset($_GET['user']) && strlen($_GET['user'])>0) { 
    $mysqli = new mysqli($dbhost, $dbuser, $dbpass, $db); 
    $stmt = $mysqli->prepare("SELECT username FROM users WHERE username=?"); 
    $stmt->bind_param('s', $name); 
    $stmt->execute(); 
    $stmt->store_result(); 
    if($stmt->num_rows == 0) { 
     header("Location: home?errormsg=notfound"); 
     exit(); 
    } 
    $stmt->close(); 
} 
$mysqli->close(); 
+0

非常感謝!它解決了我的問題。 – user3152750

0

我還沒有嘗試過,但也許它有幫助。

要調用$stmt->store_result();$stmt->num_rows
後再試前$stmt->num_rows

示例的移動$stmt->store_result();。你可以看到here