Задать вопрос
@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 просмотра
Подписаться 2 Оценить 5 комментариев
Помогут разобраться в теме Все курсы
  • Skillbox
    Веб-разработчик на PHP
    9 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 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_ уже миллион лет как использовать нельзя. И что пароли хэшировать надо. Правда, там не пишут что не нужно комментировать каждую строчку кода.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽