|
|
|
| Пытаюсь немного усовершенствовать скрипт регистрации,
и локалка выдает ошибку:
Скрипт такой:
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>';
}
}
|
Может подскажите проблему.
В упрощенном варианте все работает. | |
|
|
|
|
|
|
|
для: antei
(23.10.2010 в 14:11)
| | Это как может быть такая логика - "удаляем лишние пробелы" элементов массива POST, а затем "проверяем, не пустой ли суперглобальный массив $_POST"?
Это - if (empty($_POST['user_name'])) и есть проверка пуст ли массив POST?
И почему везде выход, почему не возвращается форма пользователю для работы над ошибками?
else это не тег, и написаны все ваши else (структура кода) неверно, вот и ошибка. | |
|
|
|
|
|
|
|
для: 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 - подскажите пожалуйста правильный вариант
для исправления ошибки...??? | |
|
|
|
|
|
|
|
для: antei
(23.10.2010 в 20:02)
| | Книжки оно конечно хорошо, но думать должны вы, а не книги за вас. Ваш код будет получаться ровно таким, как вы думаете, вы ведь в код закладываете логику своих мыслей.
Если вам надо принять некое решение по наличию пустого массива POST, то значит проверяйте это сразу, иначе какой смысл у элементов такого массива удалять "лишние" пробелы? Такую операцию можно записать одной строкой, если использовать функцию пересечения массивов.
То же самое и удаление этих самых "лишних" пробелов - пишется одна строка:
<?
$_POST = array_map("trim", $_POST);
| И у всех элементов массива будут удалены крайние пробелы. Функций работы с массивами много, полезно бы заглядывать в этот раздел мануала, так как с массивами придется работать часто, и эти функции упростят задачу и облегчат код ваш в плане восприятия.
Не знаю о каких комбинациях в учебнике речь, но вы тегом назвали условие else. Касаемо как правильно писать, то возьмите за правило - открывая фигурную скобку сразу жмите Enter и пишите для нее закрывающую, а уже после этого между ними пишите код. Так вы никогда не проставите лишнию скобку и не забудете о нужной. Делайте отступы для вложенных блоков (скобок). Какой стиль написания скобок, это уже не так важно, лично я предпочитаю стиль JavaScript, как более компактный. Прочтите об if... elseif... else, у вас с этим проблема или со скобками.
Впредь - не только обрамляйте код свой тегами [сode][/сode], но и добавляйте первой строкой РНР тег, чтобы код был подсвечен, разбираться в серости да еще уставшими глазами трудно. | |
|
|
|
|
|
|
|
для: 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>';
}
}
?>
|
Кстати, если у вас есть админ доступ, то удалите предыдущие блоки без подсветки,
дабы не засорять базу, или все удалите.
Спасибо. | |
|
|
|
|
|
|
|
для: 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 неоправданный - вы должны вести диалог с пользователем, а не ставить его в раскоряку. И занимайтесь оптимизацией кода - используйте функции работы с массивами. | |
|
|
|
|
|
|
|
для: sim5
(23.10.2010 в 23:04)
| | думаю следует указать на существование функции filter_var
<?php
if($_SERVER['REQUEST_METHOD'] != 'POST') {
require 'forma.php';
} else {
|
интересный стиль | |
|
|
|
|
|
|
|
для: Красная_шляпа
(23.10.2010 в 23:15)
| | В этом случае лучше использовать filter_var_array, но прежде чем это использовать, нужно научиться понимать то, чего пытаемся делать, и на простых вещах, чай пример то из книги.... | |
|
|
|
|
|
|
|
для: sim5
(23.10.2010 в 23:36)
| | ну вот, при всем почтении, array_map как-то к простым вещам и начальной учебе... как-то со скриптом. | |
|
|
|
|
|
|
|
для: Trianon
(23.10.2010 в 23:55)
| | Так вот я о чем и говорю, пусть с простым сперва разберется, что к чему, и что выбросить можно безболезненно. ) | |
|
|
|
|
|
|
|
для: 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>';
}
}
}
?>
|
Поставил себе задачу как можно максимально усложнить скрипт от ввода недружелюбного кода
в базу данных. Конечно без опыта можно такого понатыкать,,,
Если Вам не трудно подскажите что убрать, и может добавить.
Приму любую критику, но будьте снисходительны... | |
|
|
|
|
|
|
|
для: 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(). | |
|
|
|
|
|
|
|
для: sim5
(25.10.2010 в 15:05)
| | >Единственно, что нужно учитывать то, что и кнопка SUBMIT может иметь имя, а значит передаваться на сервер, поэтому ее либо сразу удалить из массива перед проверкой, либо не отправлять на сервер.
Как можно значение кнопки не передавать на сервер? Указывать ей value='' и вместо самой кнопки ставить картинку с надписью? | |
|
|
|
|
|
|
|
для: Лена
(25.10.2010 в 16:53)
| | не указывать name | |
|
|
|
|
|
|
|
для: Лена
(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
|
| |
|
|
|
|
|
|
|
для: parsek
(11.12.2013 в 17:21)
| | у вас там скорее всего подмассивы есть в $_POST, поэтому. попробуйте сделать рекурсивную array_map или напишите свою trim | |
|
|
|
|