Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Ошибка в скрипте регистрации.
 
 автор: antei   (23.10.2010 в 14:11)   письмо автору
 
 

Пытаюсь немного усовершенствовать скрипт регистрации,
и локалка выдает ошибку:
Скрипт такой:

if($_SERVER['REQUEST_METHOD'] != 'POST')
{
 require 'forma.php';
}
else
 { $errors = array();
  //удаляем лишние пробелы
    $_POST['user_name'] = trim ($_POST['user_name']);
    $_POST['user_pass'] = trim ($_POST['user_pass']);
    $_POST['user_pass_check'] = trim ($_POST['user_pass_check']);
    $_POST['user_email'] = trim ($_POST['user_email']);
   //проверяем, не пустой ли суперглобальный массив $_POST
   if (empty($_POST['user_name'])) exit();
    //проверяем правильно ли заполнены обязательные поля
     if (empty($_POST['user_name'])) $errors[] =('Поле "логин*" не заполнено');
     if (empty($_POST['user_pass'])) $errors[] =('Поле "пароль*" не заполнено');
     if (empty($_POST['user_pass_check'])) $errors[] =('Поле "пароль еще раз*" не заполнено');
     if($_POST['user_pass'] != $_POST['user_pass_check']) $errors[] =('Пароли не совпадают.');
     if (empty($_POST['user_email'])) $errors[] =('Поле "пароль еще раз*" не заполнено');
     // Если введен E-mail, проверяем его на корректность
     if (!empty($_POST['user_email']))
     {
         if (!preg_match("|^[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,6}$|i",$_POST['user_email']))
      {
        exit ('Поле "E-mail*" должно соответствовать формату somebody@somewhere.ru');
        }
        }
     }
      else - вот на етот тег постоянно выдается ошибка синтаксиса в else!!!!!!!
                      и скрипт не запускается

   {
    $sql = "INSERT INTO
                    personal (user_name, user_pass, user_email ,user_date)
                VALUES('" . mysql_real_escape_string($_POST['user_name']) . "',
                       '" .  mysql_real_escape_string($_POST['user_pass']) . "',
                       '" . mysql_real_escape_string($_POST['user_email']) . "',
                        NOW())";
         $result = mysql_query($sql);
         if(!$result)
        {
            echo '<p align="center">Ошибка, попробуйте позже.</p>';
        }
         else
        {
            echo '<p align="center">Успешная регистрация. Вы можете <a href="signin.php">войти</a> :-)</p>';
        }

       }


Может подскажите проблему.
В упрощенном варианте все работает.

  Ответить  
 
 автор: sim5   (23.10.2010 в 14:22)   письмо автору
 
   для: antei   (23.10.2010 в 14:11)
 

Это как может быть такая логика - "удаляем лишние пробелы" элементов массива POST, а затем "проверяем, не пустой ли суперглобальный массив $_POST"?
Это - if (empty($_POST['user_name'])) и есть проверка пуст ли массив POST?
И почему везде выход, почему не возвращается форма пользователю для работы над ошибками?
else это не тег, и написаны все ваши else (структура кода) неверно, вот и ошибка.

  Ответить  
 
 автор: antei   (23.10.2010 в 20:02)   письмо автору
 
   для: sim5   (23.10.2010 в 14:22)
 

Я тогда не пойму:
Вот этот блок -
//удаляем лишние пробелы
    $_POST['user_name'] = trim ($_POST['user_name']);
    $_POST['user_pass'] = trim ($_POST['user_pass']);
    $_POST['user_pass_check'] = trim ($_POST['user_pass_check']);
    $_POST['user_email'] = trim ($_POST['user_email']);
   //проверяем, не пустой ли суперглобальный массив $_POST
   if (empty($_POST['user_name'])) exit();
    //проверяем правильно ли заполнены обязательные поля
     if (empty($_POST['user_name'])) $errors[] =('Поле "логин*" не заполнено');
     if (empty($_POST['user_pass'])) $errors[] =('Поле "пароль*" не заполнено');
     if (empty($_POST['user_pass_check'])) $errors[] =('Поле "пароль еще раз*" не заполнено');
     if($_POST['user_pass'] != $_POST['user_pass_check']) $errors[] =('Пароли не совпадают.');
     if (empty($_POST['user_email'])) $errors[] =('Поле "пароль еще раз*" не заполнено');
     // Если введен E-mail, проверяем его на корректность
     if (!empty($_POST['user_email']))
     {
         if (!preg_match("|^[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,6}$|i",$_POST['user_email']))
      {
        exit ('Поле "E-mail*" должно соответствовать формату somebody@somewhere.ru');
        }
        }
     } 

- как в учебнике,( там еще применяются комбинации для удаления тегов и.т.д.),
только для сохранения данных в текстовый файл,
там эти две функции включены и рекомендуются.
А насчет -else - подскажите пожалуйста правильный вариант
для исправления ошибки...???

  Ответить  
 
 автор: sim5   (23.10.2010 в 20:58)   письмо автору
 
   для: antei   (23.10.2010 в 20:02)
 

Книжки оно конечно хорошо, но думать должны вы, а не книги за вас. Ваш код будет получаться ровно таким, как вы думаете, вы ведь в код закладываете логику своих мыслей.
Если вам надо принять некое решение по наличию пустого массива POST, то значит проверяйте это сразу, иначе какой смысл у элементов такого массива удалять "лишние" пробелы? Такую операцию можно записать одной строкой, если использовать функцию пересечения массивов.
То же самое и удаление этих самых "лишних" пробелов - пишется одна строка:
<?
$_POST 
array_map("trim"$_POST);
И у всех элементов массива будут удалены крайние пробелы. Функций работы с массивами много, полезно бы заглядывать в этот раздел мануала, так как с массивами придется работать часто, и эти функции упростят задачу и облегчат код ваш в плане восприятия.
Не знаю о каких комбинациях в учебнике речь, но вы тегом назвали условие else. Касаемо как правильно писать, то возьмите за правило - открывая фигурную скобку сразу жмите Enter и пишите для нее закрывающую, а уже после этого между ними пишите код. Так вы никогда не проставите лишнию скобку и не забудете о нужной. Делайте отступы для вложенных блоков (скобок). Какой стиль написания скобок, это уже не так важно, лично я предпочитаю стиль JavaScript, как более компактный. Прочтите об if... elseif... else, у вас с этим проблема или со скобками.
Впредь - не только обрамляйте код свой тегами [сode][/сode], но и добавляйте первой строкой РНР тег, чтобы код был подсвечен, разбираться в серости да еще уставшими глазами трудно.

  Ответить  
 
 автор: antei   (23.10.2010 в 22:37)   письмо автору
 
   для: sim5   (23.10.2010 в 20:58)
 

Понял. Учту ваши указания.
А книга -
Максим Кузнецов,
Игорь Симдянов - PHP5/6
страница 497.
По поводу условия else - просто в просторечии многие называют,
в данном случае хотелось разобраться в проблеме в скрипте, а не
в лексике написания вопроса.
Но спасибо и на том.
Вот код с подсветкой:
Кстати не все форумы любят ввод текста с кодом.

<?php
if($_SERVER['REQUEST_METHOD'] != 'POST')
{
 require 
'forma.php';
}
else
 { 
$errors = array();
  
//удаляем лишние пробелы
    
$_POST['user_name'] = trim ($_POST['user_name']);
    
$_POST['user_pass'] = trim ($_POST['user_pass']);
    
$_POST['user_pass_check'] = trim ($_POST['user_pass_check']);
    
$_POST['user_email'] = trim ($_POST['user_email']);
   
//проверяем, не пустой ли суперглобальный массив $_POST
   
if (empty($_POST['user_name'])) exit();
    
//проверяем правильно ли заполнены обязательные поля
     
if (empty($_POST['user_name'])) $errors[] =('Поле "логин*" не заполнено');
     if (empty(
$_POST['user_pass'])) $errors[] =('Поле "пароль*" не заполнено');
     if (empty(
$_POST['user_pass_check'])) $errors[] =('Поле "пароль еще раз*" не заполнено');
     if(
$_POST['user_pass'] != $_POST['user_pass_check']) $errors[] =('Пароли не совпадают.');
     if (empty(
$_POST['user_email'])) $errors[] =('Поле "пароль еще раз*" не заполнено');
     
// Если введен E-mail, проверяем его на корректность
     
if (!empty($_POST['user_email']))
     {
         if (!
preg_match("|^[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,6}$|i",$_POST['user_email']))
      {
        exit (
'Поле "E-mail*" должно соответствовать формату somebody@somewhere.ru');
        }
        }
     }
      else - 
вот на етот тег постоянно выдается ошибка синтаксиса в else!!!!!!!
                      
и скрипт не запускается
   
{
    
$sql "INSERT INTO
                    personal (user_name, user_pass, user_email ,user_date)
                VALUES('" 
mysql_real_escape_string($_POST['user_name']) . "',
                       '" 
.  mysql_real_escape_string($_POST['user_pass']) . "',
                       '" 
mysql_real_escape_string($_POST['user_email']) . "',
                        NOW())"
;
         
$result mysql_query($sql);
         if(!
$result)
        {
            echo 
'<p align="center">Ошибка, попробуйте позже.</p>';
        }
         else
        {
            echo 
'<p align="center">Успешная регистрация. Вы можете <a href="signin.php">войти</a> :-)</p>';
        }

       } 
?>

Кстати, если у вас есть админ доступ, то удалите предыдущие блоки без подсветки,
дабы не засорять базу, или все удалите.
Спасибо.

  Ответить  
 
 автор: sim5   (23.10.2010 в 23:04)   письмо автору
 
   для: antei   (23.10.2010 в 22:37)
 

Я же вам написал, что у вас оишбка в "етом самом...", и сказал что почитать - elseif.
<?
if($_SERVER['REQUEST_METHOD'] != 'POST') {
  require 
'forma.php'
} else { 
  
// код
  
if (!empty($_POST['user_email'])) { 
    if (!
preg_match("|^[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,6}$|i",$_POST['user_email'])) { 
      exit (
'Поле "E-mail*" должно соответствовать формату somebody@somewhere.ru'); 
    } 
  } 

elseif (
чтобы на "етот" не ругалось) {
  
$sql "INSERT INTO 
                    personal (user_name, user_pass, user_email ,user_date) 
                VALUES('" 
mysql_real_escape_string($_POST['user_name']) . "', 
                       '" 
.  mysql_real_escape_string($_POST['user_pass']) . "', 
                       '" 
mysql_real_escape_string($_POST['user_email']) . "', 
                        NOW())"

  
$result mysql_query($sql); 
  if(!
$result) { 
     echo 
'<p align="center">Ошибка, попробуйте позже.</p>'
  } else { 
    echo 
'<p align="center">Успешная регистрация. Вы можете <a href="signin.php">войти</a> :-)</p>'
  } 
}
Выбрасывайте из кода exit неоправданный - вы должны вести диалог с пользователем, а не ставить его в раскоряку. И занимайтесь оптимизацией кода - используйте функции работы с массивами.

  Ответить  
 
 автор: Красная_шляпа   (23.10.2010 в 23:15)   письмо автору
 
   для: sim5   (23.10.2010 в 23:04)
 

думаю следует указать на существование функции filter_var

<?php

if($_SERVER['REQUEST_METHOD'] != 'POST') { 
  require 
'forma.php';  
} else { 



интересный стиль

  Ответить  
 
 автор: sim5   (23.10.2010 в 23:36)   письмо автору
 
   для: Красная_шляпа   (23.10.2010 в 23:15)
 

В этом случае лучше использовать filter_var_array, но прежде чем это использовать, нужно научиться понимать то, чего пытаемся делать, и на простых вещах, чай пример то из книги....

  Ответить  
 
 автор: Trianon   (23.10.2010 в 23:55)   письмо автору
 
   для: sim5   (23.10.2010 в 23:36)
 

ну вот, при всем почтении, array_map как-то к простым вещам и начальной учебе... как-то со скриптом.

  Ответить  
 
 автор: sim5   (24.10.2010 в 06:04)   письмо автору
 
   для: Trianon   (23.10.2010 в 23:55)
 

Так вот я о чем и говорю, пусть с простым сперва разберется, что к чему, и что выбросить можно безболезненно. )

  Ответить  
 
 автор: antei   (25.10.2010 в 13:00)   письмо автору
 
   для: sim5   (24.10.2010 в 06:04)
 

Спасибо за ответ.
Теперь по пунктам:
"....Прочтите об if... elseif... else, у вас с этим проблема или со скобками....." -
вчера с утра до ночи учил и разбирал примеры,

Огромное спасибо за правило -
"....как правильно писать, то возьмите за правило - открывая фигурную скобку сразу жмите Enter и пишите для нее закрывающую, а уже после этого между ними пишите код....."

После капитальных мучений дошло, что именно в логике била ошибка, а потому и со скобками проблема!!!
Немного переписал скрипт, он и ЗАРАБОТАЛ! Регистрация на локалке прошла успешно.
Вот результат, все exit заменил.

<?php
if($_SERVER['REQUEST_METHOD'] != 'POST')
{
    echo 
'<form method="post" action="">
              </form>'
;
}
else
{
    
$errors = array();
  
//удаляем лишние пробелы
    
$_POST['user_name'] = trim ($_POST['user_name']);
    
$_POST['user_pass'] = trim ($_POST['user_pass']);
    
$_POST['user_pass_check'] = trim ($_POST['user_pass_check']);
    
$_POST['user_email'] = trim ($_POST['user_email']);
     
//проверяем, не пустой ли суперглобальный массив $_POST
   
if (empty($_POST['user_name'])) exit();
    
//проверяем правильно ли заполнены обязательные поля
     
if (empty($_POST['user_name'])) {$errors[] =('Поле "логин*" не заполнено');}
     if (empty(
$_POST['user_pass'])) {$errors[] =('Поле "пароль*" не заполнено');}
     if (empty(
$_POST['user_pass_check'])) {$errors[] =('Поле "пароль еще раз*" не заполнено');}
     if(
$_POST['user_pass'] != $_POST['user_pass_check']) {$errors[] =('Пароли не совпадают.');}
     if (empty(
$_POST['user_email'])) {$errors[] =('Поле "пароль еще раз*" не заполнено');}
     
// Если введен E-mail, проверяем его на корректность
     
if (!empty($_POST['user_email']))
     {
          if (!
preg_match("|^[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,6}$|i",$_POST['user_email']))
          {
               
$errors = ('Поле "E-mail*" должно соответствовать формату somebody@somewhere.ru');
          }
     }
     if(!empty(
$errors))
     {
     echo 
'<p align="center">Некоторые поля заполнены некорректно!</p><br /><br />';
        echo 
'<ul>';
        foreach(
$errors as $key => $value)
        {
            echo 
'<li>' $value '</li>';
        }
        echo 
'</ul>';
     }
     else
    {
        
$sql "INSERT INTO
                    personal(user_name, user_pass, user_email ,user_date)
                VALUES('" 
mysql_real_escape_string($_POST['user_name']) . "',
                       '" 
sha1($_POST['user_pass']) . "',
                       '" 
mysql_real_escape_string($_POST['user_email']) . "',
                        NOW())"
;


        
$result mysql_query($sql);
        if(!
$result)
        {
            echo 
'<p align="center">Ошибка, попробуйте позже.</p>';
        }
        else
        {
            echo 
'<p align="center">Успешная регистрация. Вы можете <a href="signin.php">войти</a> :-)</p>';
        }
    }
}
?>

Поставил себе задачу как можно максимально усложнить скрипт от ввода недружелюбного кода
в базу данных. Конечно без опыта можно такого понатыкать,,,
Если Вам не трудно подскажите что убрать, и может добавить.
Приму любую критику, но будьте снисходительны...

  Ответить  
 
 автор: sim5   (25.10.2010 в 15:05)   письмо автору
 
   для: antei   (25.10.2010 в 13:00)
 

Снисходительность, это дамская черта характера ;-)

...максимально усложнить скрипт от ввода недружелюбного кода, это задача несколько иного плана.

Начать, пожалуй, нужно опять с того, что я упоминал уже ранее.
if (empty($_POST['user_name'])) exit();
Пустое значение этого поля совсем не означает, что суперглобальный массив $_POST в данном случае пустой. Это проверка на пустое значение только этого поля, но никак не массива, который никогда не будет пустой, если пришли поля формы, пусть и пустые. Вы уж ставя такие комментарии для себя, разбирайтесь, что на самом деле делает скрипт ваш.
И почему опять exit()? Почему это не ошибка, которую пользователь должен исправить? Вы даже не потрудились известить его об этом, а просто вывалились из диалога и все. Действительно проверить этот массив на пустые поля в нем, можно только проверив все поля, или воспользоваться функциями работы с массивами, среди которых есть масса полезных, именно для решения подобных задач. Две функции из этого набора позволяют вычесть из массива пустые поля и проверив после этого массив на пустоту.
<?
if($_POST array_diff(array_map('trim'$_POST), array(''))) {
  
//массив не пуст, работаем
  //и надобность в операциях $_POST['user_name'] = trim ($_POST['user_name']);
  //и т.д. отпадает, теперь остается проверка только на корректность ввода
} else {
  
//массив не имеет значений, форма не имеет ни одного заполненного поля
}

Единственно, что нужно учитывать то, что и кнопка SUBMIT может иметь имя, а значит передаваться на сервер, поэтому ее либо сразу удалить из массива перед проверкой, либо не отправлять на сервер. Если форма имеет некое скрытое поле, значит, его запомнить в переменной и удалить из массива.
Сама структура скрипта неверна у вас, если только тут не показан вывод формы по умолчанию и по наличию ошибок. Иначе вывод ошибок ни к чему. Вы должны возвращать форму пользователю при ошибках ввода, и выводом самих ошибок, у вас должен быть диалог с пользователем, а не игра "Отгадай, что сейчас произойдет?". При этом значениям полей формы присваивать введенные пользователем данные, чтобы не набирать ему их вновь.

Пароль не хранят в открытом виде, хранят его хеш – md5().

  Ответить  
 
 автор: Лена   (25.10.2010 в 16:53)   письмо автору
 
   для: sim5   (25.10.2010 в 15:05)
 

>Единственно, что нужно учитывать то, что и кнопка SUBMIT может иметь имя, а значит передаваться на сервер, поэтому ее либо сразу удалить из массива перед проверкой, либо не отправлять на сервер.

Как можно значение кнопки не передавать на сервер? Указывать ей value='' и вместо самой кнопки ставить картинку с надписью?

  Ответить  
 
 автор: Trianon   (25.10.2010 в 17:03)   письмо автору
 
   для: Лена   (25.10.2010 в 16:53)
 

не указывать name

  Ответить  
 
 автор: sim5   (25.10.2010 в 17:04)   письмо автору
 
   для: Лена   (25.10.2010 в 16:53)
 

Достаточно имя и id этой кнопки не указывать и вы ее не получите, и заморачиваться с картинками не нужно будет. Поля формы не имеющие имен на сервер не передаются.
Да и соль не в ней, честно говоря, все слова эти лишь для того, чтобы автор темы задумался. А если подумает, то будет знать, как без труда вырезать ее и иные "мешающие".

  Ответить  
 
 автор: classic1698@yandex.ru   (11.12.2013 в 17:16)
 
   для: sim5   (25.10.2010 в 15:05)
 

ннн

  Ответить  
 
 автор: parsek   (11.12.2013 в 17:21)
 
   для: sim5   (25.10.2010 в 15:05)
 

Скажите пожалуйста а почему выдаётся ошибка на эту строку rn
if($_POST = array_diff(array_map('trim', $_POST), array(''))) {
rnследующего вида:rn
Warning: trim() expects parameter 1 to be string, array given in /var/***/vhosts/.... on line 4

  Ответить  
 
 автор: psychomc   (11.12.2013 в 17:25)   письмо автору
 
   для: parsek   (11.12.2013 в 17:21)
 

у вас там скорее всего подмассивы есть в $_POST, поэтому. попробуйте сделать рекурсивную array_map или напишите свою trim

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования