@Sergey_Tsarev Класс надо попробовать хоть что-то сделать на js и ajax. Сразу можно сказать что я 0 в этих языках... Давайте попробуем так: Вот у меня есть запрос проверяю пользователя, есть ли он в базе или нету: PHP: $login = htmlspecialchars($_POST['login']); /*Бла бла бла*/ $stmt = $pdo->prepare('SELECT `user_id` FROM `users` WHERE `user_login` = "'.$login.'"'); $stmt->bindValue($login, $_POST['login'], PDO::PARAM_STR); $stmt->execute(); $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); if(count($rows) > 0){ $err[] = 'Логин: '. $_POST['login'] .' уже занят'; } Можно ли записать запрос вот таким образом, для уменьшения кода? PHP: $login = htmlspecialchars($_POST['login']); /*Бла бла бла*/ $stmt = $pdo->prepare('SELECT `user_id` FROM `users` WHERE `user_login` = ?'); $stmt->execute([$login]); $rows = $stmt->fetch(); if(count($rows) > 0){ $err[] = 'Логин: '. $_POST['login'] .' уже занят'; } Если можно, что делать с ним дальше, чтобы как то обработать js, ajax для проверки.
Все доброй ночи, кто мне подскажет как делается такое: 1. Был у меня один скрипт, в нем у меня был и обработчик и форма. 2. Я их поделил на 2 файла, теперь у меня обработчик reg.php и форма form_reg.php 3. Я в ссылках указываю путь к форме, а в форме указываю путь к обработчику. 4.У меня получается так, если пользователь вызвал форму, и начинает вводить данные, например забыл ввести что-то, ему высвечивается ошибочка, например: не все поля заполнены, и при этом форма прячется, а как же оставить и форму и ошибки на одной странице? 5. Если писать обработчик, и саму форму в одном файле то если высвечивается ошибка, то форма остается на месте. 6. Вопрос, почему я так хочу сделать? Ответ такой: Так будет быстрее обрабатываться форма при вызове ее если находятся по разным файлам. Ну а если они находятся в одном файле то, затратно временем будет, оно даже видно что скрипт не много думает, из-за того что там и форма и обработчик находятся.
@Sergey_Tsarev Вот примерно об этом я и спрашиваю. Но ошибки останутся с формой? Как это делается правильно? Смотрим на скриншот, уже спать пора))) А я в пеинте, рисую При регистрации если юзер допусти ошибку, форма прячется, а мне надо чтобы ошибки и форма оставалась.
два варианта: Кидать форму на сервер ajax-ом, через JavaScript, а обработчик чтоб возвращал ошибки, выводить их опять же на JavaScript Кидать ошибки в сессию, и перенаправлять опять на файл, выводящий форму. В нём должна быть проверка, типа: если есть ошибки в сессии, показать их. Только возьми в кой-то веки и сам почитай про AJAX и сессии, выбери подход, и сделай форму. Ну реально, ничего сложного нету ни в первом ни во втором варианте, мозг надо задействовать минимально. Веб-программирование - это вообще, очень-очень просто, если речь не идёт о highload. У нас большинство алгоритмов сводится к "прочитать из базы, выплюнуть пользователю" и "получить от пользователя, кинуть в базу"
@_ne_scaju_, восстановление пароля будет выглядеть примерно так: Форма восстановления пароля recovery.htm HTML: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Восстановление пароля</title> </head> <body> <form method="post" action="recovery_action.php"> <label>Почта:</label> <input type="email" name="email"> <input type="submit" value="Восстановить"> </form> </body> </html> Скрипт восстановления пароля recovery_action.php PHP: <?php //подключаемся к базе данных include_once $_SERVER['DOCUMENT_ROOT'].'/connect_db.php'; if ($_POST['email']): $email = $_POST['email']; //фильтруем данные //проверяем, есть ли пользователь с таким email'ом $check_email = $pdo->prepare('SELECT COUNT(0) AS ROW_COUNT FROM `users` WHERE `email` = ?'); $check_email->execute([$email]); //подсчитываем количество строк в ответе $num = $check_email->fetch(); $count = $num['ROW_COUNT']; if($count > 0): //получаем данные о пользователе из таблицы users $query = $pdo->prepare('SELECT * FROM `users` WHERE `email` = ?'); $query->execute([$email]); $result = $query->fetch(); $id = $result['id']; $time = time(); //записываем в переменную текущее время $recovery_key = md5(uniqid(rand(), true)); //генерируем уникальную строку для восстановления //вносим запись в таблицу recovery $recovery = $pdo->prepare('INSERT INTO `recovery` (`id`, `recovery_key`, `time`) VALUES (?, ?, ?)'); $recovery->execute([$id, $recovery_key, $time]); //отправляем письмо $to= $email; //получатель $subject = 'Восстановление пароля'; //тема $message = 'Для изменения пароля перейдите по ссылке: http://site.ru/recovery.php?recovery_key='.$recovery_key; //текст //заголовки $headers= "MIME-Version: 1.0\r\n"; $headers .= "Content-type: text/html; charset=iso-8859-1\r\n"; //отправляем mail($to, $subject, $message, $headers); echo 'На ваш почтовый ящик отправлено письмо с ссылкой для изменения пароля!'; else: echo 'Такой адрес в системе не зарегистрирован!'; endif; else: echo 'Поля не заполнены!'; endif; ?> Скрипт генерации нового пароля recovery.php PHP: <?php //подключаемся к базе данных include_once $_SERVER['DOCUMENT_ROOT'].'/connect_db.php'; if ($_GET['recovery_key']): $recovery_key = $_GET['recovery_key']; //фильтруем данные //делаем запрос к таблице recovery и //проверям есть ли там запись с таким ключом $check = $pdo->prepare('SELECT COUNT(0) AS ROW_COUNT FROM `recovery` WHERE `recovery_key` = ?'); $check->execute([$recovery_key]); //подсчитываем количество строк в ответе $num = $check->fetch(); $count = $num['ROW_COUNT']; if($count > 0): //делаем запрос к таблице recovery и получаем данные в виде ассоциативного массива $query = $pdo->prepare('SELECT * FROM `recovery` WHERE `recovery_key` = ?'); $query->execute([$recovery_key]); $result = $query->fetch(); //проверяем просрочена ли активация или нет $limit_time = 3000; //время жизни активации в секундах $id = $result['id']; if((time()-$result['time']) <= $limit_time): //генерируем новый пароль $new_password = rand(10000, 99999999); $recovery = $pdo->prepare('UPDATE `users` SET `password` = ? WHERE `id` = ?'); $recovery->execute([$new_password, $id]); //удаляем запись из таблицы recovery $delete = $pdo->prepare('DELETE FROM `recovery` WHERE `id` = ?'); $delete->execute([$id]); echo 'Пароль изменен!'; else: //удаляем запись из таблицы recovery $delete = $pdo->prepare('DELETE FROM `recovery` WHERE `id` = ?'); $delete->execute([$id]); echo 'Ссылка просрочена!'; endif; else: echo 'Неправильный ключ восстановления!'; endif; else: echo 'Не указан ключ восстановления!'; endif; ?>
@Sergey_Tsarev Огромное спасибо за ответ и помощь. Завтра буду под свои таблицы создавать изменять твой скрипт, и ещё заниматься копипастом. Если честно я стараюсь вникнуть в любой код чужой и разобраться в нем. Мне понравился твой принцип оформления кода. А особенно открывающийся и закрывающийся endif. Надо для себя подчеркнуть, такое оформление, и может быть использовать его. И к комментариям на счет 15 и 25 строки, типа объединить их в один, а то-есть что сделать надо?
https://php.ru/manual/control-structures.alternative-syntax.html Вместо этого: PHP: $check_email = $pdo->prepare('SELECT COUNT(0) AS ROW_COUNT FROM `users` WHERE `email` = ?'); $check_email->execute([$email]); //подсчитываем количество строк в ответе $num = $check_email->fetch(); $count = $num['ROW_COUNT']; if($count > 0): //получаем данные о пользователе из таблицы users $query = $pdo->prepare('SELECT * FROM `users` WHERE `email` = ?'); $query->execute([$email]); $result = $query->fetch(); Можно написать так: PHP: $query = $pdo->prepare('SELECT * FROM `users` WHERE `email` = ?'); $query->execute([$email]); $result = $query->fetch(); if($result):
@Sergey_Tsarev Понятно, что надо было сделать, как объединить в один) убрать один запрос а то он повторяет тот же запрос что и ниже, за исключением что он подсчитывает сколько количество строк вернул запрос. Правильно ли я понимаю? Сегодня буду разбираться в твоём коде. Спасибо за ответ.
@Sergey_Tsarev --- Добавлено --- @Sergey_Tsarev Можно ли при регистрации проверить занят ли такой email таким запросом? PHP: $query = $pdo->prepare('SELECT * FROM `users` WHERE `email` = ?'); $query->execute([$email]); $result = $query->fetch(); if($result): $err[] ='email такой существует'; endif; Если нельзя подскажите как можно.
А попробовать никак? Можно, конечно Только здесь целесообразнее счётчик запросить, поскольку тут нам не нужны все поля, а только факт присутствия. А ещё можно поставить уникальный ключ на e-mail, что @Fell-x27 любит советовать, тогда база сама будет проверять перед вставкой, есть такой e-mail или нет, а тебе останется проверить, выполнился ли запрос
Нет. Запрос не повторяется. COUNT просто возвращает число строк в результате запроса. Этот запрос будет работать быстрее. Его хорошо использовать, когда тебе не нужна работа с данными, а нужно только получить количество записей в таблице, соответствующих твоим условиям. И ещё поговаривают, что лучше так не писать: PHP: SELECT * FROM А лучше перечислить все необходимые тебе для работы поля, например: Код (Text): SELECT `id`, `email`, `status` FROM
@Sergey_Tsarev Привет не подскажет из-за чего образуется ошибка notice: undefined variable: err in... Прочитать вроде могу, не объявлена переменная err Ну на самом деле она у меня объявлена, но в другом файле, который подключен к этому. И пишет мне ошибку не пойму почему...
@Sergey_Tsarev Ок буду возле инета скину код. Я сегодня разобрался не много как работает ваш скрипт, спасибо за него отдельно, и уже прикрутил его. Но вот эти не значительные ошибки notice мешают.
@Sergey_Tsarev А все же скиньте мне пожалуйста страницу где можно на самых лёгких примерах построить проверку и вывод ошибок js. Или почитать об этом. Спасибо.
@Sergey_Tsarev А может быть эта ошибка из-за такого: Есть файл в нем я подключаются БД, и сама функция для вывода ошибок. И вот этот файл я подключаю в принципе везде где надо выводить ошибки и подключение к БД. В данном случае подключение этого файла делаю в скрипте register.php PHP: <?php //Путь скрипта где я указываю подключение к БД и подключение функции которая выводить ошибки. include 'file/inc.php ?> <?php //Вот тут проверяют была ли нажата кнопка //Дальше идут всякие проверки if(empty($_POST['email'])){ $err[] = 'vvedite email'; }//И так дальше... //И в самом конце когда проверка окончена делаю обращение к этой функции в ней находится несколько функций, одна из которых отвечает за вывод ошибок. //Пример если ошибок нет пропускаем дальше if(count($err) > 0){ echo 'errorMessage($err)';//выводим количество ошибок } else{ //Ну и тут идут запросы разные } ?> Может эта ошибка notice образуется по сути из-за того что к функцие обращаюсь 2 раза? Первое я ее подключил через include и второе я к ней обращаюсь errorMessage.
И что, по твоему, в этой строчке происходит? И логики у тебя как всегда.... У тебя переменная $err получает значение только если была ошибка, а если её не было - она не определена, вот 13 строчка и кидает нотис. Заинициализурй просто $err сразу на пустой массив
@mkramer Ой не эта строчка подсчитывает ошибки а выше. Ты мне советуешь что не пойму. Написать условие для не определенной $err?
Инициализировать $err пустым массивом прежде чем начинать проверять и записывать туда ошибки. Что тут непонятного? Вроде по-русски пишу. А строчка, которую я тебе указал, выведет совсем не то, что ты явно думал. Прочитай ещё раз про строки в php, и тогда поймёшь почему.
@mkramer Понял на что ты намекаешь, мне надо было написать так: Сделать надо так: PHP: $err = array(); А потом аж Проверку делать PHP: if($err>0) errorMessage(); Правильно понял ли я тебя?