簡體   English   中英

帶有mysqli_real_escape_string的PHP無法按預期工作

[英]PHP with mysqli_real_escape_string does not work as expected

我正在嘗試創建一個登錄頁面,但是有一個問題,其中數據沒有被發送。 誰能幫我嗎。

  $myusername = stripslashes($username);
    $mypassword = stripslashes($password);
    $myusername = mysqli_real_escape_string($myusername);
    $mypassword = mysqli_real_escape_string($mypassword);

    $sql="SELECT * FROM login_admin WHERE user_name='$myusername' and user_pass=SHA1('$mypassword')";
    $result=mysql_query($dbC, $sql);
    // Mysql_num_row is counting table row
    $count=mysql_num_rows($result);
    // If result matched $myusername and $mypassword, table row must be 1 row
    if($count==1){
        // Register $myusername, $mypassword and redirect to file "admin.php"
        session_register("admin");
        session_register("password");
        $_SESSION['name']= $myusername;
        header("location:admin.php");
    }
    else {

        $msg = "$username $password $myusername $mypassword $sql $result Wrong Username or Password. Please retry";
        header("location:login.php?msg=$msg");
    }

我得到的輸出是:test test123 SELECT * FROM login_admin WHERE user_name = \\'\\'和user_pass = SHA1(\\'\\')錯誤的用戶名或密碼。 請重試

您必須提供$ link標識符作為mysqli_real_escape_string中的第一個參數,因此這些行應看起來更像

$myusername = mysqli_real_escape_string($dbconn,$myusername);
$mypassword = mysqli_real_escape_string($dbconn,$mypassword);

其中$ dbconn是您從mysqli_connect返回的鏈接。 如果要切換到mysqli_ *功能集,則還應使用mysql_query和mysql_num_rows,它們應該使用它們的mysqli_等效項。

我強烈建議您使用(現在是舊的)mysql函數切換到mysqli(或PDO)。 PHP.net提供有關原因的信息

考慮使用我們喜歡調用的(很棒的) 預備查詢
這些很棒,因為它們將數據視為數據,而不是要執行的語句 這意味着不需要轉義,因為您的輸入不會被誤解。

要在您的情況下實現此目的:

$sql = "SELECT user_name FROM login_admin WHERE user_name = ? AND user_pass = SHA1(?)";
if ($query = $db->prepare($sql)) { //returns false if incorrect syntax, error, etc.
    $query->bind_param("ss", $user, $pass);
    // ss = string, string
    // mixed bind_param($params, **args);
    $query->execute();
    $query->bind_result($u);
    $query->fetch();
    $query->close();
} else {
    /* error handling */
}
if ($u) {
    /* session setting */
    header("Location: admin.php");
} else {
    header("Location: login.php?e=1");
}

我還寫了一個工作的管理員控制面板 ,我將其復制粘貼到可以為登錄系統實現幾乎所有功能的東西中(請參閱private.php

另外,要回答您的真實問題,在沒有數據庫連接的情況下,沒有辦法在mysqli中進行轉義。 將數據庫添加到函數的開頭:

mysqli_real_escape_string($db, $string);

暫無
暫無

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

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