@t_timaa

Как исправить ошибку, php?

Суть такова: у меня база создана в phpmyadmin. Есть таблица Clients(Фио,паспортные данные, адрес, login, password). Я сделал кнопку входа, данные login и password должны считывать с таблицы Clients с колонок login и password.
При попытке входа у меня выдаётся ошибка:
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean

Подскажите, что она означает?

Код входа:
<?php
if (isset($_POST['login'])) { $login = $_POST['login']; if ($login == '') { unset($login);} } //заносим введенный пользователем логин в переменную $login, если он пустой, то уничтожаем переменную
    if (isset($_POST['password'])) { $password=$_POST['password']; if ($password =='') { unset($password);} }
    //заносим введенный пользователем пароль в переменную $password, если он пустой, то уничтожаем переменную
if (empty($login) or empty($password)) //если пользователь не ввел логин или пароль, то выдаем ошибку и останавливаем скрипт
    {
    exit ('<script>alert("Дла начала заполните поля!");</script>');
    }
    //если логин и пароль введены,то обрабатываем их, чтобы теги и скрипты не работали, мало ли что люди могут ввести
    $login = stripslashes($login);
    $login = htmlspecialchars($login);
$password = stripslashes($password);
    $password = htmlspecialchars($password);
//удаляем лишние пробелы
    $login = trim($login);
    $password = trim($password);
// подключаемся к базе
    include ("BD_for_users.php");// файл bd.php должен быть в той же папке, что и все остальные, если это не так, то просто измените путь 
 
if(isset($_POST['login']) && isset($_POST['password'])) {
  $login = $_POST['login'];
  $password = $_POST['password'];
  if(empty($login) OR empty($password)){
    exit ('<script>alert("Дла начала заполните поля!");</script>');
  }
  $login = trim(stripslashes(htmlspecialchars($login))); 
  $password = trim(stripslashes(htmlspecialchars($password))); // надо хранить хеш пароля, а не в чистом виде
  $result = mysql_query("SELECT * FROM Clients WHERE login='".$login."' AND password='".$password."'");
  $myrow = mysql_num_rows($result);
  if ($myrow == 1){
    $_SESSION['login'] = $myrow['login'];
    $_SESSION['id'] = $myrow['id'];
    echo "Вы успешно вошли на сайт! <a href='For_users.php'>Личный кабинет</a>";
  }else{
    exit ('<script>alert("Извините, введённый вами логин или пароль неверный.");</script>');
  }
}
?>
  • Вопрос задан
  • 464 просмотра
Решения вопроса 1
Я уже говорил одному человеку тут, что нельзя так делать
$result = mysql_query("SELECT * FROM Clients WHERE login='$login'",$db); /
$myrow = mysql_fetch_array($result);
 if(empty($myrow['password'])){
}

У вас в принципе не правильно всё сделано, вам достаточно посчитать количество совпадений в базе, и не надо тянуть данные из неё. Вот пример на PDO используйте его:
/*Подключение к бд разумеется в отдельном файле, а лучше вообще освоить ООП*/
$dsn = "mysql:host=".$host.";dbname=".$db.";charset=".$charset."";
     $opt = array(
                  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
                  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
        );
$pdo = new PDO($dsn, $user, $pass, $opt);

/*Ваш запрос*/

$query = $pdo->prepare('SELECT COUNT(*) FROM users WHERE login = :login AND password = :password');
$query->execute(array(':login'=>$login, ':password' =>$password));
if($query->fetchColumn() == 1){
}

Учите то, что актуально, а не то, что мертво: PDO официальная документация

А теперь к сути вопроса. Вот такой вариант у меня заработал в итоге:
session_start();
include ("BD_for_users.php");
if(isset($_POST['login']) && isset($_POST['password'])) {
  $login = $_POST['login'];
  $password = $_POST['password'];
  if(empty($login) OR empty($password)){
    exit ('<script>alert("Дла начала заполните поля!");</script>');
  }
  $login = trim(stripslashes(htmlspecialchars($login)));
  $password = trim(stripslashes(htmlspecialchars($password))); // надо хранить хеш пароля, а не в чистом виде
  $result = mysql_query("SELECT * FROM Clients WHERE login='".$login."' AND password='".$password."'");
  $row = mysql_fetch_array($result);
  $myrow = mysql_num_rows($result);

  if ($myrow == 1){
    $_SESSION['login'] = $row['login'];
    $_SESSION['id'] = $row['id'];
    echo "Вы успешно вошли на сайт! <a href='For_users.php'>Личный кабинет</a>";
  }else{
    exit ('<script>alert("Извините, введённый вами логин или пароль неверный.");</script>');
  }
}
?>
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
riot26
@riot26
<:З )~~
Надеюсь, в продакшн такой код не попадает?
mysql_query возвращает false в случае ошибки. Ты бы это узнал, если бы читал немного документацию. А ещё там сказано, что mysql_ уже миллион лет как использовать нельзя. И что пароли хэшировать надо. Правда, там не пишут что не нужно комментировать каждую строчку кода.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы