[英]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.