2017-08-04 75 views
1

幫助。我得到0 num_rows,但如果我在控制檯執行查詢,我正在得到結果。我還挺新的準備stmts。這裏是我的代碼Mysqli Prepared Stmt returns 0 num_rows

數據庫連接類:

class DbConnection { 
const HOST = "localhost"; 
const USR = "root"; 
const PWD = ""; 
const DB = "club_db"; 
} 

登錄類:

class UsrLogin extends DbConnection { 

private $conn; /*db connector*/ 

/*login vars*/ 
private $usr; 
private $pwd; 

/*ctrl var*/ 
public $AccessGranted = false; 

function __construct($username,$password){ 
    /*initialize db connection*/ 
    $this->conn = new mysqli(DbConnection::HOST,DbConnection::USR,DbConnection::PWD,DbConnection::DB); 
    /*set login vars*/ 
    $this->usr = $username; 
    $this->pwd = $password; 

} 

public function login(){ 
    $sql = "SELECT * FROM sys_usr WHERE uid = ? AND passwd = ?"; 
    $stmt = $this->conn->prepare($sql); 
    $stmt->bind_param("ss", $usr,$pwd); 

    $usr = $this->usr; 
    $pwd = $this->pwd; 

    $stmt->execute(); 

    echo $stmt->num_rows; 
} 
} 

回答

2

雖然在我看來,這裏的兩個給定的答案是不正確的,我想我知道問題出在哪裏。嗯,首先,如上所述,在綁定變量之前,不需要爲變量賦值。那根本不是真的。這讓我很生氣,因爲我在這裏一遍又一遍地讀了這個關於stackoverflow的錯誤信息。只是。錯誤。如果確實如此,則無法使用不同的值執行多個準備好的語句。即使它的老年人和許多人不喜歡在這裏看到它,W3:OLYML: https://www.w3schools.com/php/php_mysql_prepared_statements.asp它表明你正在嘗試的是完全可能的,它也表明你有準備好的語句的可能性。

所以,現在你的問題:

你在做什麼是完全的罰款。但還有一件事情你錯過了,我認爲那是錯誤的原因。缺少store_result()功能。

給這個代碼的機會,並告訴我,如果它的工作原理:

public function login(){ 
    $sql = "SELECT * FROM sys_usr WHERE uid = ? AND passwd = ?"; 
    $stmt = $this->conn->prepare($sql); 
    $stmt->bind_param("ss", $usr,$pwd); 

    $usr = $this->usr; 
    $pwd = $this->pwd; 

    $stmt->execute(); 
    $stmt->store_result(); // Quite sure you need this to perform a num_rows... 
    echo $stmt->num_rows; 
} 
+1

就像魔法。你是最好的兄弟。非常感謝。 – kingraphaII

+0

@kingraphaII很高興它幫助你:) – Twinfriends

+0

@kingraphaII如果你將Twinfriends的答案標記爲「接受」,這將是非常好的,這樣其他用戶也可以從這個正確的解決方案中受益。 – 2017-08-08 16:52:32