@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>');
  }
}
?>
  • Вопрос задан
  • 462 просмотра
Решения вопроса 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_ уже миллион лет как использовать нельзя. И что пароли хэшировать надо. Правда, там не пишут что не нужно комментировать каждую строчку кода.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
28 апр. 2024, в 00:54
10000 руб./за проект
28 апр. 2024, в 00:53
70000 руб./за проект
27 апр. 2024, в 21:24
150000 руб./за проект