За последние 24 часа нас посетили 22367 программистов и 1026 роботов. Сейчас ищут 669 программистов ...

Где я мог ошибиться, подскажите пожалуйста

Тема в разделе "PHP для новичков", создана пользователем TiinnyTerner, 26 май 2020.

  1. TiinnyTerner

    TiinnyTerner Новичок

    С нами с:
    26 май 2020
    Сообщения:
    8
    Симпатии:
    0
    вот у меня есть часть кода,
    PHP:
    1. if(isset($_POST["email"])){
    2.                 //Обрезаем пробелы с начала и с конца строки
    3.                 $email = trim($_POST["email"]);
    4.                 if(!empty($email)){
    5.                     $email = htmlspecialchars($email, ENT_QUOTES);
    6.                     // (3) Место кода для проверки формата почтового адреса и его уникальности
    7.                     //Проверяем формат полученного почтового адреса с помощью регулярного выражения
    8.                     $reg_email = "/^[a-z0-9][a-z0-9\._-]*[a-z0-9]*@([a-z0-9]+([a-z0-9-]*[a-z0-9]+)*\.)+[a-z]+/i";
    9.                     //Если формат полученного почтового адреса не соответствует регулярному выражению
    10.                     if( !preg_match($reg_email, $email)){
    11.                         // Сохраняем в сессию сообщение об ошибке.
    12.                         $_SESSION["error_messages"] .= "<p class='mesage_error' >Вы ввели неправельный email</p>";
    13.                      
    14.                         //Возвращаем пользователя на страницу регистрации
    15.                         header("HTTP/1.1 301 Moved Permanently");
    16.                         header("Location: ".$address_site."/form_register.php");
    17.                         //Останавливаем  скрипт
    18.                         exit();
    19.                     }
    20.                     //Проверяем нет ли уже такого адреса в БД.
    21.                     $result_query = $mysqli->query("SELECT `email` FROM `users` WHERE `email`='".$email."'");
    22.                  
    23.                     //Если кол-во полученных строк ровно единице, значит пользователь с таким почтовым адресом уже зарегистрирован
    24.                     if($result_query->num_rows == 1){
    25.                         //Если полученный результат не равен false
    26.                         if(($row = $result_query->fetch_assoc()) != false){
    27.                          
    28.                                 // Сохраняем в сессию сообщение об ошибке.
    29.                                 $_SESSION["error_messages"] .= "<p class='mesage_error' >Пользователь с таким почтовым адресом уже зарегистрирован</p>";
    30.                              
    31.                                 //Возвращаем пользователя на страницу регистрации
    32.                                 header("HTTP/1.1 301 Moved Permanently");
    33.                                 header("Location: ".$address_site."/form_register.php");
    34.                          
    35.                         }else{
    36.                             // Сохраняем в сессию сообщение об ошибке.
    37.                             $_SESSION["error_messages"] .= "<p class='mesage_error' >Ошибка в запросе к БД</p>";
    38.                          
    39.                             //Возвращаем пользователя на страницу регистрации
    40.                             header("HTTP/1.1 301 Moved Permanently");
    41.                             header("Location: ".$address_site."/form_register.php");
    42.                         }
    43.                         /* закрытие выборки */
    44.                         $result_query->close();
    45.                         //Останавливаем  скрипт
    46.                         exit();
    47.                     }
    48.                     /* закрытие выборки */
    49.                     $result_query->close();
    Жалуется на последнюю строчку, я не понимаю уже что мне надо сделать чтобы код заработал
    Ниже я засунул весь код в котором у меня появилась данная проблема
     

    Вложения:

    • register.txt
      Размер файла:
      15,4 КБ
      Просмотров:
      3
    #1 TiinnyTerner, 26 май 2020
    Последнее редактирование модератором: 26 май 2020
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    Вставляй код правильно. См. мою подпись
    --- Добавлено ---
    Это зачем?
    --- Добавлено ---
    Что говорит?
     
  3. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.745
    Симпатии:
    1.319
    Адрес:
    Лень
    скобки условий не хватает.
     
  4. TiinnyTerner

    TiinnyTerner Новичок

    С нами с:
    26 май 2020
    Сообщения:
    8
    Симпатии:
    0
    upload_2020-5-26_14-20-27.png
    вот что он пишет, я уже голову сломал, и не понимаю что он от меня хочет
     
  5. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Он пишет что на 178 строке есть функция, где ты вызываешь close, но она не объект и вызваться не может:
    178 строка:
    PHP:
    1. $result_query->close();
    Проверяется что там, вот так вот:
    PHP:
    1. var_dump($result_query);
    --- Добавлено ---
    Вот пример как это работает:
    PHP:
    1. <?php
    2. $mysqli = new mysqli("localhost", "my_user", "my_password", "world");
    3.  
    4. /* проверка соединения */
    5. if ($mysqli->connect_errno) {
    6.     printf("Не удалось подключиться: %s\n", $mysqli->connect_error);
    7.     exit();
    8. }
    9.  
    10. /* Создание таблицы не возвращает результирующего набора */
    11. if ($mysqli->query("CREATE TEMPORARY TABLE myCity LIKE City") === TRUE) {
    12.     printf("Таблица myCity успешно создана.\n");
    13. }
    14.  
    15. /* Select запросы возвращают результирующий набор */
    16. if ($result = $mysqli->query("SELECT Name FROM City LIMIT 10")) {
    17.     printf("Select вернул %d строк.\n", $result->num_rows);
    18.  
    19.     /* очищаем результирующий набор */
    20.     $result->close();
    21. }
    22.  
    23. /* Если нужно извлечь большой объем данных, используем MYSQLI_USE_RESULT */
    24. if ($result = $mysqli->query("SELECT * FROM City", MYSQLI_USE_RESULT)) {
    25.  
    26.     /* Важно заметить, что мы не можем вызывать функции, которые взаимодействуют
    27.        с сервером, пока не закроем результирующий набор. Все подобные вызовы
    28.        будут вызывать ошибку 'out of sync' */
    29.     if (!$mysqli->query("SET @a:='this will not work'")) {
    30.         printf("Ошибка: %s\n", $mysqli->error);
    31.     }
    32.     $result->close();
    33. }
    34.  
    35. $mysqli->close();
    36. ?>
    Видишь там $result->close(); вне скобок?
    А у тебя вот это вот:
    PHP:
    1.  /* закрытие выборки */
    2.                         $result_query->close();
    3.  
    4.                         //Останавливаем  скрипт
    5.                         exit();
    6.                     }
    7.  
    8.                     /* закрытие выборки */
    9.                     $result_query->close();  //178 строка
    --- Добавлено ---
    Ты сам запутался в своем же коде, потому что там много if else и это превращается в кашу. Используй функции
    PHP:
    1. //операция 1
    2. function (){
    3. }
    4.  
    5. //операция 2
    6. function (){
    7. }
    8.  
    9. //операция 3
    10. function(){
    11. }
     
  6. TiinnyTerner

    TiinnyTerner Новичок

    С нами с:
    26 май 2020
    Сообщения:
    8
    Симпатии:
    0
    Ладно, я понял ошибку, но это мне надо для курсовой работы, а php я изучаю ток 4ый день, т.е у меня где-то не хватает скобки?
     
  7. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Закомментируй эту строку и все ,она не нужна.
     
  8. TiinnyTerner

    TiinnyTerner Новичок

    С нами с:
    26 май 2020
    Сообщения:
    8
    Симпатии:
    0
    я закомментировал и код выдал мне такое upload_2020-5-26_16-55-30.png
    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
     
  9. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    @TiinnyTerner нельзя выводить что либо перед header. Гугли ошибки.
     
  10. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Практически весь код – это пример того, как делать не надо. И дело даже не в елочной структуре.
    --- Добавлено ---
    @TiinnyTerner, с mysqli_result работают так:
    PHP:
    1. if ($result=$mysqli->query(...))
    2. {
    3.     ...
    4.     $result->free(); // можно close – это синоним
    5. }
    А что с самим $mysqli? Объект создан и доступен (соединение выполнено)?
     
    TiinnyTerner нравится это.
  11. TiinnyTerner

    TiinnyTerner Новичок

    С нами с:
    26 май 2020
    Сообщения:
    8
    Симпатии:
    0
    Ладно, вот я сделал через функцию
    PHP:
    1. <?php
    2.    
    3.     function redirect_to($message, $address_page){
    4.     $_SESSION["serever_message"] = $message;
    5.     header("HTTP/1.1 301 Moved Permanently");
    6.     header("Location: ".$address_site."/".$address_page);
    7.     exit();
    8.     }
    9.     if(isset($_POST["btn_submit_register"])){
    10.         if(isset($_POST["captcha"])){
    11.             $captcha = trim($_POST["captcha"]);
    12.             if($_SESSION["rand_captcha"] != $captcha){
    13.                 $message = "<p class='message_error'><strong>Ошибка!</strong> Вы ввели не правильную капчу </p>";
    14.                 redirect_to($message, 'form_register.php');
    15.             }
    16.             //======= Обработка имени ============
    17.             if(isset($_POST["first_name"])){
    18.                 $first_name = trim($_POST["first_name"]);
    19.                 if(!empty($first_name)){
    20.                     $first_name = htmlspecialchars($first_name, ENT_QUOTES);
    21.                 }else{
    22.                     $message = "<p class='message_error'><strong>Ошибка!</strong> Укажите Ваше имя</p>";
    23.                     redirect_to($message, 'form_register.php');
    24.                 }
    25.             }else{
    26.                 $message = "<p class='message_error'><strong>Ошибка!</strong> Отсутствует поле с именем </p>";
    27.                 redirect_to($message, 'form_register.php');
    28.             }
    29.             //======= Обработка фамилии ============
    30.             if(isset($_POST["last_name"])){
    31.                 $last_name = trim($_POST["last_name"]);
    32.                 if(!empty($last_name)){
    33.                     $last_name = htmlspecialchars($last_name, ENT_QUOTES);
    34.                 }else{
    35.                     $message = "<p class='message_error'><strong>Ошибка!</strong> Укажите Вашу фамилию</p>";
    36.                     redirect_to($message, 'form_register.php');
    37.                 }
    38.             }else{
    39.                 $message = "<p class='message_error'><strong>Ошибка!</strong> Отсутствует поле с фамилией </p>";
    40.                 redirect_to($message, 'form_register.php');
    41.             }
    42.             //======= Обработка адреса электронной почты ============
    43.             if(isset($_POST["email"])){
    44.                 $email = trim($_POST["email"]);
    45.                 if(!empty($email)){
    46.                     $email = htmlspecialchars($email, ENT_QUOTES);
    47.                     $reg_email = "/^[a-z0-9][a-z0-9\._-]*[a-z0-9]*@([a-z0-9]+([a-z0-9-]*[a-z0-9]+)*\.)+[a-z]+/i";
    48.                     if(!preg_match($reg_email, $email)){
    49.                         $message = "<p class='message_error'><strong>Ошибка!</strong> Вы ввели адрес электронной почты в неправильном формате </p>";
    50.                         redirect_to($message, 'form_register.php');
    51.                     }
    52.                     $query_select_user = $mysqli->query("SELECT `id` FROM `users` WHERE `email` = '".$email."'");
    53.                     if(!$query_select_user){
    54.                         $message = "<p class='message_error'><strong>Ошибка!</strong> Ошибка в запросе к Базе Данных, при проверки существования пользователя с таким адресом электронной почты. </p><p>Описание ошибки: $mysqli->error <br /> Код ошибки: $mysqli->errno </p>";
    55.                         redirect_to($message, 'form_register.php');
    56.                     }
    57.                     if($query_select_user->num_rows == 1){
    58.                         $message =  "<p class='message_error'><strong>Ошибка!</strong> Пользователь с таким адресом электронной почты уже зарегистрирован</p>";
    59.                         redirect_to($message, 'form_register.php');
    60.                     }
    61.                 }else{
    62.                     $message = "<p class='message_error'><strong>Ошибка!</strong> Укажите адрес Вашей электронной почты</p>";
    63.                     redirect_to($message, 'form_register.php');
    64.                 }
    65.             }else{
    66.                 $message = "<p class='message_error'><strong>Ошибка!</strong> Отсутствует поле для ввода адреса электронной почты</p>";
    67.                 redirect_to($message, 'form_register.php');
    68.             }
    69.             //======= Обработка пароля ============
    70.             if(isset($_POST["password"])){
    71.                 $password = trim($_POST["password"]);
    72.                 if(!empty($password)){
    73.                     $password = htmlspecialchars($password, ENT_QUOTES);
    74.                     $password = md5($password."top_secret");
    75.                 }else{
    76.                     $message = "<p class='message_error'><strong>Ошибка!</strong> Укажите Ваш пароль</p>";
    77.                     redirect_to($message, 'form_register.php');
    78.                 }
    79.             }else{
    80.                 $message = "<p class='message_error'><strong>Ошибка!</strong> Отсутствует поле для ввода пароля</p>";
    81.                 redirect_to($message, 'form_register.php');
    82.             }
    83.             $result_query_insert = $mysqli->query("INSERT INTO `users` (first_name, last_name, email, password) VALUES ('".$first_name."', '".$last_name."', '".$email."', '".$password."') ");
    84.             if(!$result_query_insert){
    85.                 $message = "<p class='message_error'><strong>Ошибка!</strong> При регистрации произошла ошибка. </p><p>Описание ошибки: $mysqli->error <br /> Код ошибки: $mysqli->errno </p>";
    86.                 redirect_to($message, 'form_register.php');
    87.             }else{
    88.                 $message = "<p class='success_message'>Регистрация прошла успешно! <br /> Теперь Вы можете авторизоваться используя Ваш адрес электронной почты ( Email ) и пароль </p>";
    89.                 redirect_to($message, 'form_auth.php');
    90.             }
    91.             $mysqli->close();
    92.         }else{
    93.            
    94.             $message = "<p class='message_error'><strong>Ошибка!</strong> Отсутствует поле для ввода капчи </p>";
    95.             redirect_to($message, 'form_register.php');
    96.         }
    97.     }else{
    98.         exit("<p><strong>Ошибка!</strong> Вы зашли на эту страницу напрямую, поэтому нет данных для обработки. Вы можете перейти на <a href=".$address_site.">главную страницу</a>.</p>");
    99.     }
    100.    
    101.    
    102. ?>
    но он все-равно жалуется
    upload_2020-5-26_18-17-58.png
     
  12. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Причину этой ЭЛЕМЕНТАРНОЙ ошибки уже называли. И использование сессий с кучей одинаковых редиректов, разбросанных по коду – полный швах. Делайте редирект, указав в адресе цели идентификатор ошибки. (Можно подготовить значение идентификатора и сделать редирект в одном месте.)

    Основная проверка на существование e-mail'а делается не так. Просто вставляете и смотрите, нет ли ошибки «дублирующегося ключа».
     
    AlexProg нравится это.