簡體   English   中英

使用“准備陳述”時從函數返回MySQLi查詢結果

[英]Return a MySQLi query results from a function while using “Prepare Statment”

這是我第一次使用prepare語句方法。

問題在於該函數返回Nothing“ null”。

功能:

function login($username, $password)
{

    $username = sanitize($username);
    $password = md5($password);

    global $connect;

    $stmt = $connect->prepare("SELECT `user_id` FROM `users` WHERE `username` = ? AND `password` = ? ");

    $stmt->bind_param("ss", $username, $password);
    $stmt->execute();

    $stmt->bind_result($id);
    $result = $stmt->fetch();

    $stmt->close();
    $connect->close();

    return $result;
} 

我得到的錯誤:

“ mysqli_num_rows()期望參數1為mysqli_result,輸入為空”

我不知道出什么問題了!


最新結果:

function login($username, $password)
{
    global $connect;

    $stmt = $connect->prepare("SELECT `user_id` FROM `users` WHERE `username` = ? AND `password` = ? ");
    $stmt->bind_param("ss", $username, $password);
    $stmt->execute();

    $result = $stmt->get_result();
    while ($row = $result->fetch_array(MYSQLI_NUM))
    {
        $result[] = $row;
    }

    $stmt->close();
    $connect->close();

    return $result;
} 

無法將類型為mysqli_result的對象用作“ $ result [] = $ row;”中的數組

幾乎所有事情都可以,除非您不能像執行操作那樣從fetch語句獲取結果。

一切都取決於您的登錄功能的工作方式,您可以通過多種方式進行操作,我將演示3個示例,並由您自己決定:

對於這兩種解決方案:
在您的sql語句中,您可以選擇所需的特定字段或所有字段:

SELECT `user_id`, `email`, `username`, `password` FROM `users`......etc...

或所有類似的字段:

SELECT * FROM `users`......etc...

解決方案1:
更換

$stmt->bind_result($id);
$result = $stmt->fetch();

有了這個

$output = $stmt->get_result();
while ($row = $output->fetch_array(MYSQLI_NUM))
{
    $result = $row;
}

並調用您的登錄方法/函數,我注入了一個測試用戶進行測試:

print_r(login("user", "1234"));

我從虛擬測試數據庫獲得的結果是一個包含來自特定用戶數據庫表的所有字段數據的數組,如下所示(我在SELECT語句中使用star *):

Array ( [0] => 1 [1] => user@user.com [2] => user [3] => 1234 ) 

解決方案2:
我們保留前面刪除的兩行,但是添加的變量將包含從數據庫中獲取的值,它的順序應與SELECT語句中的順序相同,如果選擇星號(*),則需要在其中寫入所有字段數據庫順序。 我們的bind_result語句將向我們提供數據庫的結果,如果您錯過一個字段,它將不起作用並返回錯誤。

更換

$stmt->bind_result($id);
$result = $stmt->fetch();

有了這個

$stmt->bind_result($db_user_id, $db_email, $db_username, $db_password);
$stmt->fetch();

如果需要用戶電子郵件地址,則使用$db_email變量,可以將所有或部分結果放入數組中並返回它,甚至返回單個值,這取決於您。

解決方案3

此解決方案組合為1和2。

更換

$stmt->bind_result($id);
$result = $stmt->fetch();

有了這個

$stmt->bind_result($db_user_id, $db_email, $db_username, $db_password);
while ($stmt->fetch()) {
    echo $db_user_id;
}

此處相同,如果您需要用戶電子郵件地址,然后使用$db_email變量,則可以將全部或部分結果放入數組中並返回它,甚至返回單個值。 它是由你決定。


注意:
為了減少測試失敗的機會,我在測試時禁用了sanitize($username)md5($password) 因此,我僅使用純文本,只是為了測試並查看是否一切均按預期方式工作。 作業完成后,您可以再次激活它們。 我建議您也使用替代的哈希解決方案,因為md5被認為對密碼不安全。 有關最佳做法,請參見PHP手冊頁。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM