Я продолжаю сталкиваться с ошибкой, когда 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()
функция, которая возвращает 0 как целое число (не логическое), если для последнего кода ошибки не было значения mysqli_connect()
функция.
В-третьих, нет необходимости инициализировать подготовку заявления.
Четвертый mysqli_stmt_bind_reslut()
предшествует mysqli_stmt_fetch()
, см примечание в руководство
использование hash_equals()
функция для сопоставления пароля вместо ===
, см. раздел предупреждения в крипта
$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 */
} `
Других решений пока нет …