2017-04-14 73 views
0

我在製作一個登錄腳本,它從兩個表中獲取數據。我明白,當語句返回FALSE AKA布爾值時發生此錯誤,但它爲什麼返回false? 我做這些工作在一定程度上致命錯誤:調用布爾型成員函數bind_param()

function loginall($username, $password) 
{ 
    $db_host="localhost"; 
    $db_username="root"; 
    $db_password=""; 
    $db_name="name"; 
    $con=mysqli_connect($db_host, $db_username,$db_password, $db_name); 
    $mysqli = new mysqli("$db_host","$db_username","$db_password", "$db_name"); 

    $qry = "SELECT username, password, level, active FROM businesses WHERE username=? AND password=? 
    UNION SELECT username, password, level, active FROM employees WHERE username=? AND password=?"; 
    $stmt = $mysqli->prepare($qry); 
    $stmt->bind_param("ssss", $u,$p,$uu,$pp); 
    $u = $username; 
    $p = $password; 
    $uu = $username; 
    $pp = $password; 
    $stmt->execute(); 
    $result = $stmt->get_result(); 
    while($row = $result->fetch_array(MYSQLI_ASSOC)) 
    { 
     return $row; 
    } 
} 

,直到我嘗試從表中獲取更多的列,甚至可以從表中試圖SELECT *它的偉大工程的功能。我閱讀了其他類似的問題,並找到代碼來顯示錯誤,但沒有運氣。謝謝!

+0

U,$ P,$ UU,或$ pp爲空。迴應他們看哪一個。 –

+0

同樣的查詢在我的系統上運行 –

+0

@SloanThrasher你能解釋一下嗎?該函數的工作,直到我試圖從表中獲得更多的列,這意味着這些變量是好的? 如果我試圖迴應它們,它不起作用,因爲我得到了錯誤,我說的是錯誤後的白色頁面,或者它只是登錄我,但我需要登錄時獲得更多的列。 – Mar1AK

回答

0

您的函數一旦碰到循環中的第一個return語句(第一次迭代)就會結束/返回。 您將需要構建完整的數組,然後將其返回一次。

這應該做到這一點:

if(!($stmt=$mysqli->prepare($qry))){ 
    return ["Prepare failed: ".mysqli_error($mysqli)]; // what does this say? 
}elseif(!$stmt->bind_param("ssss",$u,$p,$uu,$pp)){ 
    return ["Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error]; 
}else{ 
    $u = $username; 
    $p = $password; 
    $uu = $username; 
    $pp = $password; 
    if (!$stmt->execute()){ 
     return ["Execute failed: (" . $stmt->errno . ") " . $stmt->error]; 
    }else{ 
     $result = $stmt->get_result(); 
     while($row = $result->fetch_array(MYSQLI_ASSOC)){ 
      $rows[]=$row; 
     } 
     return $rows; 
    } 
} 

嘗試backticking所有列名的。 LEVEL是MySQL的KEYWORD。

+0

我認爲$ stmt是錯誤的,按照錯誤 –

+0

他意味着while循環不會迭代多次,因爲該函數將在第一次返回後退出,但事實並非如此,循環實際上遍歷整個數組。不過,我會嘗試你的建議。謝謝 – Mar1AK

+0

我有興趣瞭解如何在調用'return'後讓函數繼續運行。那將是一個新的。 – mickmackusa

-1

試試這個也許bind_result()get_result()

你可能想知道,爲什麼還要使用bind_result()

這嚴格地歸因於偏好,因爲語法被認爲是更可讀的。

但是,應該注意bind_result()不能用於*通配符選擇器。它必須包含明確的價值

在這裏,在使用bind_result()這個代碼,值$usernameRow, $passwordRow, ....是形成數據庫tebles:根據您的錯誤信息,一個或多個$

..... 
... 
. 
$stmt->bind_param("ssss", $username, $password, $username, $password); 
$stmt->execute(); 
$stmt->store_result(); 
$numRows = $stmt->num_rows; 
$stmt->bind_result($usernameRow, $passwordRow, $levelRow, $activeRow); 
if($numRows > 0) { 
    while ($stmt->fetch()) { 
    $u[] = $usernameRow; 
    $p[] = $passwordRow; 
    $uu[] = $levelRow; 
    $pp[] = $activeRow; 
    } 
} 
$stmt->close(); 
+0

我也開始寫這個,一開始,但OP想要一個數組返回,所以它必須重新包裝。 – mickmackusa

+0

@Mousa Alfhaily 它只是在輸入正確的用戶名和密碼時返回NULL。我將它設置爲在表中找不到用戶名和密碼匹配時返回NULL。 – Mar1AK

+0

@ Mar1AK對不起,我編輯了答案,我做了一個錯誤,'bind_param'應該是用戶輸入的用戶名和密碼,它們是'$ username,$ password',但對於這兩個表,所以'bind_param(「ssss 「,$ username,$ password,$ username,$ password)'' –

相關問題