簡體   English   中英

創建Prepared語句以登錄PHP時遇到錯誤

[英]Ran into an error when creating a Prepared statement to login PHP

我一直遇到錯誤,其中PHP說“我們很抱歉,我們無法讓您登錄。” 根據我的一個條件設置,即使登錄正確,因此我的Prepared系統避免SQL注入失敗。

所以我的代碼是這樣的:

global $connected;

$post = filter_var_array($_POST, FILTER_SANITIZE_STRING);
$pwwd = $post['password'];
$usrn = $post['username'];
$usrn = mysqli_real_escape_string($connected, $usrn);
$pwwd = mysqli_real_escape_string($connected, $pwwd);

if (strlen($usrn) != 0 && strlen($pwwd) != 0 && !empty($post)) {
    $usrn = stripslashes($usrn);
    $pwwd = stripslashes($pwwd);
    $hashFormat = '$2ysomenumber$';
    $salt = 'somehashobviously';
    $hashF_and_salt = $hashFormat.$salt;
    $pwwd = crypt($pwwd, $hashF_and_salt);

    if (!mysqli_connect_errno()) {
        mysqli_select_db($connected, 'someDbname') or die('Database   select error');
    } else {
        die('Failed to connect to PHPMyAdmin').mysqli_connect_error();
    }

    $query = "SELECT Username, Password FROM users WHERE Username=? AND     Password=?";

    $stmt = mysqli_stmt_init($connected);

    if (mysqli_stmt_prepare($stmt, $query)) {
        //Some error in here somewhere

        mysqli_stmt_bind_param($stmt, "ss", $usrn, $pwwd);
        mysqli_stmt_execute($stmt);

        mysqli_stmt_fetch($stmt);

        mysqli_stmt_bind_result($stmt, $check_usrn, $check_pwd);

        if (strcasecmp($usrn, $check_usrn) == 0) {
            if ($pwwd == $check_pwd) {
                echo '<h1 class="text-center">Matches</h1>';
                print_r($row);
            }

        } else {
            echo "<h1 class=text-center>We're sorry we can't log you     in.</h1>";
        }

    }

} else { //This is for strlen boolean cond
    echo "<h1 class='text-center'>Both fields must not be empty.    </h1>";
}

我曾經使用過沒有准備好的語句的登錄頁面,但我意識到我需要這樣做以提高安全性。 我的數據庫工作正常所以問題就在我添加注釋“//某處某處出現錯誤”的地方附近。

我是一個相對較新的PHP程序員,這是一個在假期中嘗試大膽新事物的第一年學生! 請公開閱讀我得到的所有幫助,謝謝!

首先,我沒有看到連接到數據庫的連接代碼,就像這樣。 $connected = msqli_connect(host,user,password,db_name) ; 比你不需要調用mysqli_select_db()函數。

其次,您正在檢查mysqli_connect_errno()函數中的connectinon,如果最后一個mysqli_connect()函數沒有錯誤代碼值,則返回0作為整數(不是布爾值mysqli_connect()

第三,沒有必要初始化准備聲明。

四是mysqli_stmt_bind_reslut()來了前mysqli_stmt_fetch() 請參閱手冊中的注意事項

使用hash_equals()函數匹配密碼而不是=== 請參閱crypt中的警告部分

$connected = msqli_connect(host,user,password,db_name) ;
 if(!$connected)
 {
     die('Connect Error (' . mysqli_connect_errno() . ') '. mysqli_connect_error());
 } 
    echo "Your connection is  successful . "
 if($stmt = mysqli_prepare($connected,$query))
 {
       mysqli_stmt_bind_param($stmt, "ss", $usrn, $pwwd);
       mysqli_stmt_execute($stmt);
       mysqli_stmt_bind_result($stmt, $check_usrn, $check_pwd);
       mysqli_stmt_fetch($stmt);
       /* Now do Your Work */

 } else 
   {
      /* still prepare statement doesn't work */
   } `

暫無
暫無

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

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