Подскажите пожалуйста, учусь создавать портал с возможностью регистрации пользователей, пытаюсь реализовать пока что простую схему, регистрация по логину и паролю. WEB сервер собран на FreeBSD (Apache24, PHP7, MySQL56) Для регистрации использую 5 файлов: dbconnect.php (для подключения к БД) header.php (для проврки введенных данных) form_register.php (форма регистрации) register.php (для обработки формы регистрации) dbconnect.php Код (Text): <?php // Указываем кодировку header('Content-Type: text/html; charset=utf-8'); $server = "localhost"; $username = "имя_пользователя_бд"; $password = "пароль_пользователя_бд"; $database = "имя_базы_данных"; // Подключение к базе данный через MySQLi $mysqli = new mysqli($server, $username, $password, $database); // Проверяем, успешность соединения. if (mysqli_connect_errno()) { echo "<p><strong>Ошибка подключения к БД</strong>. Описание ошибки: ".mysqli_connect_error()."</p>"; exit(); } // Устанавливаем кодировку подключения $mysqli->set_charset('utf8'); //Для удобства, добавим здесь переменную, которая будет содержать название нашего сайта $address_site = "http://testsite.local"; ?> form_register.php Код (Text): <?php //Подключение файла require_once("header.php"); ?> <!-- Блок для вывода сообщений --> <div class="block_for_messages"> <?php //Если в сессии существуют сообщения об ошибках, то выводим их if(isset($_SESSION["error_messages"]) && !empty($_SESSION["error_messages"])){ echo $_SESSION["error_messages"]; //Уничтожаем чтобы не выводились заново при обновлении страницы unset($_SESSION["error_messages"]); } //Если в сессии существуют радостные сообщения, то выводим их if(isset($_SESSION["success_messages"]) && !empty($_SESSION["success_messages"])){ echo $_SESSION["success_messages"]; //Уничтожаем чтобы не выводились заново при обновлении страницы unset($_SESSION["success_messages"]); } ?> </div> <?php //Проверяем, если пользователь не авторизован, то выводим форму регистрации, //иначе выводим сообщение о том, что он уже зарегистрирован if(!isset($_SESSION["first name"]) && !isset($_SESSION["password"])){ ?> <div id="form_register"> <h2>Форма регистрации</h2> <form action="register.php" method="post" name="form_register"> <table> <tbody><tr> <td> Логин </td> <td> <input type="text" name="first_name" required="required"> </td> </tr> <tr> <td> Пароль: </td> <td> <input type="password" name="password" placeholder="минимум 6 символов" required="required"><br> <span id="valid_password_message" class="mesage_error"></span> </td> </tr> <tr> <td colspan="2"> <input type="submit" name="btn_submit_register" value="Зарегистрироватся!"> </td> </tr> </tbody></table> </form> </div> <?php }else{ ?> <div id="authorized"> <h2>Вы уже зарегистрированы</h2> </div> <?php } ?> header.php Код (Text): <?php //Запускаем сессию session_start(); ?> <!DOCTYPE html> <html> <head> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> <script type="text/javascript"> $(document).ready(function(){ "use strict"; //================ Проверка длины пароля ================== var password = $('input[name=password]'); password.blur(function(){ if(password.val() != ''){ //Если длина введенного пароля меньше шести символов, то выводим сообщение об ошибке if(password.val().length < 6){ //Выводим сообщение об ошибке $('#valid_password_message').text('Минимальная длина пароля 6 символов'); // Дезактивируем кнопку отправки $('input[type=submit]').attr('disabled', true); }else{ // Убираем сообщение об ошибке $('#valid_password_message').text(''); //Активируем кнопку отправки $('input[type=submit]').attr('disabled', false); } }else{ $('#valid_password_message').text('Введите пароль'); } }); }); </script> </head> </html> register.php Код (Text): <?php //Запускаем сессию session_start(); //Добавляем файл подключения к БД require_once("dbconnect.php"); //Объявляем ячейку для добавления ошибок, которые могут возникнуть при обработке формы. $_SESSION["error_messages"] = ''; //Объявляем ячейку для добавления успешных сообщений $_SESSION["success_messages"] = ''; ?> <?php /* Проверяем была ли отправлена форма, то есть была ли нажата кнопка зарегистрироваться. Если да, то идём дальше, если нет, то выведем пользователю сообщение об ошибке, о том что он зашёл на эту страницу напрямую. */ if(isset($_POST["btn_submit_register"]) && !empty($_POST["btn_submit_register"])){ /* Проверяем если в глобальном массиве $_POST существуют данные отправленные из формы и заключаем переданные данные в обычные переменные.*/ if(isset($_POST["first_name"])){ //Обрезаем пробелы с начала и с конца строки $first_name = trim($_POST["first_name"]); //Проверяем переменную на пустоту if(!empty($first_name)){ // Для безопасности, преобразуем специальные символы в HTML-сущности $first_name = htmlspecialchars($first_name, ENT_QUOTES); }else{ // Сохраняем в сессию сообщение об ошибке. $_SESSION["error_messages"] .= "<p class='mesage_error'>Укажите Ваше имя</p>"; //Возвращаем пользователя на страницу регистрации header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); //Останавливаем скрипт exit(); } }else{ // Сохраняем в сессию сообщение об ошибке. $_SESSION["error_messages"] .= "<p class='mesage_error'>Отсутствует поле с именем</p>"; //Возвращаем пользователя на страницу регистрации header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); //Останавливаем скрипт exit(); } if(isset($_POST["password"])){ //Обрезаем пробелы с начала и с конца строки $password = trim($_POST["password"]); if(!empty($password)){ $password = htmlspecialchars($password, ENT_QUOTES); //Шифруем папроль $password = md5($password."top_secret"); }else{ // Сохраняем в сессию сообщение об ошибке. $_SESSION["error_messages"] .= "<p class='mesage_error'>Укажите Ваш пароль</p>"; //Возвращаем пользователя на страницу регистрации header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); //Останавливаем скрипт exit(); } }else{ // Сохраняем в сессию сообщение об ошибке. $_SESSION["error_messages"] .= "<p class='mesage_error'>Отсутствует поле для ввода пароля</p>"; //Возвращаем пользователя на страницу регистрации header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); //Останавливаем скрипт exit(); } //Запрос на добавления пользователя в БД $result_query_insert = $mysqli->query("INSERT INTO `users` (first_name, password) VALUES ('".$first_name."', '".$password."')"); if(!$result_query_insert){ // Сохраняем в сессию сообщение об ошибке. $_SESSION["error_messages"] .= "<p class='mesage_error' >Ошибка запроса на добавления пользователя в БД</p>"; //Возвращаем пользователя на страницу регистрации header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); //Останавливаем скрипт exit(); }else{ $_SESSION["success_messages"] = "<p class='success_message'>Регистрация прошла успешно!!! <br />Теперь Вы можете авторизоваться используя Ваш логин и пароль.</p>"; //Отправляем пользователя на страницу авторизации header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_auth.php"); } /* Завершение запроса */ $result_query_insert->close(); //Закрываем подключение к БД $mysqli->close(); }else{ exit("<p><strong>Ошибка!</strong> Вы зашли на эту страницу напрямую, поэтому нет данных для обработки. Вы можете перейти на <a href=".$address_site."> главную страницу </a>.</p>"); } ?> Все что требуется от файлов срабатывает, кроме одного… Когда ввожу логин, пароль и нажимаю зарегистрироваться, выскакивает ошибка: Ошибка запроса на добавления пользователя в БД Подскажите пожалуйста, где я допустил ошибку в коде?
Чувак это же чужой код еще и англоязычный был. Напиши сам, так хоть научишься чему нибудь. Создай пока один файлик вот тут примеры форм https://developer.mozilla.org/ru/docs/Web/HTML/Element/form После ввода имени просто выведи его для начала. А потом и с базой можно работать.
Немного упростил себе задачу, сделал так: Два файла: test.php (создаем значения) script.php (записываем значения в базу) test.php Код (Text): <html> <head> <title>Zapis v BD</title> </head> <body> <form method="POST" action="script.php"> <input name="name" type="text" placeholder="Name"/> <input name="text" type="text" placeholder="Text"/> <input type="submit" value="Отправить"/> </form> </body> </html> script.php Код (Text): <?php if (isset($_POST['name']) && isset($_POST['text'])){ $name = $_POST['name']; $text = $_POST['text']; $db_host = "localhost"; $db_user = "portal"; $db_password = "password"; $db_base = 'portal'; $db_table = "users"; $mysqli = new mysqli($db_host,$db_user,$db_password,$db_base); // Osibka podkl if ($mysqli->connect_error) { die('ERROR : ('. $mysqli->connect_errno .') '. $mysqli->connect_error); } $result = $mysqli->query("INSERT INTO ".$db_table." (first_name,email) VALUES ('$name','$text')"); if ($result == true){ echo "Всё хорошо"; }else{ echo "Не работает"; } } ?> База portal с таблицей users и полями first_name и email создана... Но данные из скрипта не записываются. При нажатии на кнопку "Отправить", выходит сообщение "Не работает". Где в скрипте ошибка?
Твоя ошибка в том что не выводишь ошибки пошагово это вот фигня: PHP: if ($result == true){ echo "Всё хорошо"; }else{ echo "Не работает"; } пример из документации: PHP: if (!$mysqli->query("SET @a:='this will not work'")) { printf("Ошибка: %s\n", $mysqli->error); } $result->close(); --- Добавлено --- Когда данные получится записать в таблицу, исправь свои insert по этому примеру. https://www.php.net/manual/ru/mysqli-stmt.bind-param.php
Да, пытаюсь сделать сам, на более простом примере Заменил: Код (Text): if ($result == true){ echo "Всё хорошо"; }else{ echo "Не работает"; } на вот это: Код (Text): if (!$mysqli->query("SET @a:='this will not work'")) { printf("Ошибка: %s\n", $mysqli->error); } $result->close(); } $mysqli->close(); В итоге, при нажатии на отправить, пустая страница...Не показывает ошибок. Что сможете подсказать?
Я же писал что это пример просто из документации =( подумай как скрестить твой код: PHP: <?php if (isset($_POST['name']) && isset($_POST['text'])){ $name = $_POST['name']; $text = $_POST['text']; $db_host = "localhost"; $db_user = "portal"; $db_password = "password"; $db_base = 'portal'; $db_table = "users"; $mysqli = new mysqli($db_host,$db_user,$db_password,$db_base); // Osibka podkl if ($mysqli->connect_error) { die('ERROR : ('. $mysqli->connect_errno .') '. $mysqli->connect_error); } $result = $mysqli->query("INSERT INTO ".$db_table." (first_name,email) VALUES ('$name','$text')"); if ($result == true){ echo "Всё хорошо"; }else{ echo "Не работает"; } } ?> с этим примером: PHP: if (!$mysqli->query("SET @a:='this will not work'")) { printf("Ошибка: %s\n", $mysqli->error); }
Спасибо, всё получилось... Скрестил скрипт: Код (Text): <?php if (isset($_POST['name']) && isset($_POST['text'])){ $name = $_POST['name']; $text = $_POST['text']; $db_host = "localhost"; $db_user = "portal"; $db_password = "password"; $db_base = 'portal'; $db_table = "users"; $mysqli = new mysqli($db_host,$db_user,$db_password,$db_base); // Osibka podkl if ($mysqli->connect_error) { die('ERROR : ('. $mysqli->connect_errno .') '. $mysqli->connect_error); } $result = $mysqli->query("INSERT INTO ".$db_table." (first_name,email) VALUES ('$name','$text')"); if ($result == true){ echo "Всё хорошо"; }else{ printf("Ошибка: %s\n", $mysqli->error);} } ?> После этого увидел ошибку по нормальному "ERROR: Field 'UID' doesn't have a default value " У меня в таблице было поле "UID". В итоге я создал другую таблицу, только с полями "name" и "text" После этого всё получилось, данные записались в базу.
@Swert313, аа.. нагуглил регистрацию с кодом на ладони, а придя сюда за копиПастом, опачки.... не судьба
у меня свой сайт на html полностью написан т нет регистрации.. а это просто пытаюсь изучить php вот и пробую разные коды и смотрю чужие ошибки вот и этот решил проверить а он пишет что файла нет ошибка 404, хоть файл и есть --- Добавлено --- ребят а не у кого нет книг по изучению php