вот у меня есть часть кода, PHP: if(isset($_POST["email"])){ //Обрезаем пробелы с начала и с конца строки $email = trim($_POST["email"]); if(!empty($email)){ $email = htmlspecialchars($email, ENT_QUOTES); // (3) Место кода для проверки формата почтового адреса и его уникальности //Проверяем формат полученного почтового адреса с помощью регулярного выражения $reg_email = "/^[a-z0-9][a-z0-9\._-]*[a-z0-9]*@([a-z0-9]+([a-z0-9-]*[a-z0-9]+)*\.)+[a-z]+/i"; //Если формат полученного почтового адреса не соответствует регулярному выражению if( !preg_match($reg_email, $email)){ // Сохраняем в сессию сообщение об ошибке. $_SESSION["error_messages"] .= "<p class='mesage_error' >Вы ввели неправельный email</p>"; //Возвращаем пользователя на страницу регистрации header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); //Останавливаем скрипт exit(); } //Проверяем нет ли уже такого адреса в БД. $result_query = $mysqli->query("SELECT `email` FROM `users` WHERE `email`='".$email."'"); //Если кол-во полученных строк ровно единице, значит пользователь с таким почтовым адресом уже зарегистрирован if($result_query->num_rows == 1){ //Если полученный результат не равен false if(($row = $result_query->fetch_assoc()) != false){ // Сохраняем в сессию сообщение об ошибке. $_SESSION["error_messages"] .= "<p class='mesage_error' >Пользователь с таким почтовым адресом уже зарегистрирован</p>"; //Возвращаем пользователя на страницу регистрации header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); }else{ // Сохраняем в сессию сообщение об ошибке. $_SESSION["error_messages"] .= "<p class='mesage_error' >Ошибка в запросе к БД</p>"; //Возвращаем пользователя на страницу регистрации header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); } /* закрытие выборки */ $result_query->close(); //Останавливаем скрипт exit(); } /* закрытие выборки */ $result_query->close(); Жалуется на последнюю строчку, я не понимаю уже что мне надо сделать чтобы код заработал Ниже я засунул весь код в котором у меня появилась данная проблема
Он пишет что на 178 строке есть функция, где ты вызываешь close, но она не объект и вызваться не может: 178 строка: PHP: $result_query->close(); Проверяется что там, вот так вот: PHP: var_dump($result_query); --- Добавлено --- Вот пример как это работает: PHP: <?php $mysqli = new mysqli("localhost", "my_user", "my_password", "world"); /* проверка соединения */ if ($mysqli->connect_errno) { printf("Не удалось подключиться: %s\n", $mysqli->connect_error); exit(); } /* Создание таблицы не возвращает результирующего набора */ if ($mysqli->query("CREATE TEMPORARY TABLE myCity LIKE City") === TRUE) { printf("Таблица myCity успешно создана.\n"); } /* Select запросы возвращают результирующий набор */ if ($result = $mysqli->query("SELECT Name FROM City LIMIT 10")) { printf("Select вернул %d строк.\n", $result->num_rows); /* очищаем результирующий набор */ $result->close(); } /* Если нужно извлечь большой объем данных, используем MYSQLI_USE_RESULT */ if ($result = $mysqli->query("SELECT * FROM City", MYSQLI_USE_RESULT)) { /* Важно заметить, что мы не можем вызывать функции, которые взаимодействуют с сервером, пока не закроем результирующий набор. Все подобные вызовы будут вызывать ошибку 'out of sync' */ if (!$mysqli->query("SET @a:='this will not work'")) { printf("Ошибка: %s\n", $mysqli->error); } $result->close(); } $mysqli->close(); ?> Видишь там $result->close(); вне скобок? А у тебя вот это вот: PHP: /* закрытие выборки */ $result_query->close(); //Останавливаем скрипт exit(); } /* закрытие выборки */ $result_query->close(); //178 строка --- Добавлено --- Ты сам запутался в своем же коде, потому что там много if else и это превращается в кашу. Используй функции PHP: //операция 1 function (){ } //операция 2 function (){ } //операция 3 function(){ }
Ладно, я понял ошибку, но это мне надо для курсовой работы, а php я изучаю ток 4ый день, т.е у меня где-то не хватает скобки?
я закомментировал и код выдал мне такое 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(); жалуется на header
Практически весь код – это пример того, как делать не надо. И дело даже не в елочной структуре. --- Добавлено --- @TiinnyTerner, с mysqli_result работают так: PHP: if ($result=$mysqli->query(...)) { ... $result->free(); // можно close – это синоним } А что с самим $mysqli? Объект создан и доступен (соединение выполнено)?
Ладно, вот я сделал через функцию PHP: <?php function redirect_to($message, $address_page){ $_SESSION["serever_message"] = $message; header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/".$address_page); exit(); } if(isset($_POST["btn_submit_register"])){ if(isset($_POST["captcha"])){ $captcha = trim($_POST["captcha"]); if($_SESSION["rand_captcha"] != $captcha){ $message = "<p class='message_error'><strong>Ошибка!</strong> Вы ввели не правильную капчу </p>"; redirect_to($message, 'form_register.php'); } //======= Обработка имени ============ if(isset($_POST["first_name"])){ $first_name = trim($_POST["first_name"]); if(!empty($first_name)){ $first_name = htmlspecialchars($first_name, ENT_QUOTES); }else{ $message = "<p class='message_error'><strong>Ошибка!</strong> Укажите Ваше имя</p>"; redirect_to($message, 'form_register.php'); } }else{ $message = "<p class='message_error'><strong>Ошибка!</strong> Отсутствует поле с именем </p>"; redirect_to($message, 'form_register.php'); } //======= Обработка фамилии ============ if(isset($_POST["last_name"])){ $last_name = trim($_POST["last_name"]); if(!empty($last_name)){ $last_name = htmlspecialchars($last_name, ENT_QUOTES); }else{ $message = "<p class='message_error'><strong>Ошибка!</strong> Укажите Вашу фамилию</p>"; redirect_to($message, 'form_register.php'); } }else{ $message = "<p class='message_error'><strong>Ошибка!</strong> Отсутствует поле с фамилией </p>"; redirect_to($message, 'form_register.php'); } //======= Обработка адреса электронной почты ============ if(isset($_POST["email"])){ $email = trim($_POST["email"]); if(!empty($email)){ $email = htmlspecialchars($email, ENT_QUOTES); $reg_email = "/^[a-z0-9][a-z0-9\._-]*[a-z0-9]*@([a-z0-9]+([a-z0-9-]*[a-z0-9]+)*\.)+[a-z]+/i"; if(!preg_match($reg_email, $email)){ $message = "<p class='message_error'><strong>Ошибка!</strong> Вы ввели адрес электронной почты в неправильном формате </p>"; redirect_to($message, 'form_register.php'); } $query_select_user = $mysqli->query("SELECT `id` FROM `users` WHERE `email` = '".$email."'"); if(!$query_select_user){ $message = "<p class='message_error'><strong>Ошибка!</strong> Ошибка в запросе к Базе Данных, при проверки существования пользователя с таким адресом электронной почты. </p><p>Описание ошибки: $mysqli->error <br /> Код ошибки: $mysqli->errno </p>"; redirect_to($message, 'form_register.php'); } if($query_select_user->num_rows == 1){ $message = "<p class='message_error'><strong>Ошибка!</strong> Пользователь с таким адресом электронной почты уже зарегистрирован</p>"; redirect_to($message, 'form_register.php'); } }else{ $message = "<p class='message_error'><strong>Ошибка!</strong> Укажите адрес Вашей электронной почты</p>"; redirect_to($message, 'form_register.php'); } }else{ $message = "<p class='message_error'><strong>Ошибка!</strong> Отсутствует поле для ввода адреса электронной почты</p>"; redirect_to($message, 'form_register.php'); } //======= Обработка пароля ============ if(isset($_POST["password"])){ $password = trim($_POST["password"]); if(!empty($password)){ $password = htmlspecialchars($password, ENT_QUOTES); $password = md5($password."top_secret"); }else{ $message = "<p class='message_error'><strong>Ошибка!</strong> Укажите Ваш пароль</p>"; redirect_to($message, 'form_register.php'); } }else{ $message = "<p class='message_error'><strong>Ошибка!</strong> Отсутствует поле для ввода пароля</p>"; redirect_to($message, 'form_register.php'); } $result_query_insert = $mysqli->query("INSERT INTO `users` (first_name, last_name, email, password) VALUES ('".$first_name."', '".$last_name."', '".$email."', '".$password."') "); if(!$result_query_insert){ $message = "<p class='message_error'><strong>Ошибка!</strong> При регистрации произошла ошибка. </p><p>Описание ошибки: $mysqli->error <br /> Код ошибки: $mysqli->errno </p>"; redirect_to($message, 'form_register.php'); }else{ $message = "<p class='success_message'>Регистрация прошла успешно! <br /> Теперь Вы можете авторизоваться используя Ваш адрес электронной почты ( Email ) и пароль </p>"; redirect_to($message, 'form_auth.php'); } $mysqli->close(); }else{ $message = "<p class='message_error'><strong>Ошибка!</strong> Отсутствует поле для ввода капчи </p>"; redirect_to($message, 'form_register.php'); } }else{ exit("<p><strong>Ошибка!</strong> Вы зашли на эту страницу напрямую, поэтому нет данных для обработки. Вы можете перейти на <a href=".$address_site.">главную страницу</a>.</p>"); } ?> но он все-равно жалуется
Причину этой ЭЛЕМЕНТАРНОЙ ошибки уже называли. И использование сессий с кучей одинаковых редиректов, разбросанных по коду – полный швах. Делайте редирект, указав в адресе цели идентификатор ошибки. (Можно подготовить значение идентификатора и сделать редирект в одном месте.) Основная проверка на существование e-mail'а делается не так. Просто вставляете и смотрите, нет ли ошибки «дублирующегося ключа».