Перейти к содержимому

Сервис обмена электронных валют


Проверяем переменную с помощью isset()

#1 Banderas

Banderas
  • Пользователь
  • 1 168 сообщений
  • Репутация: 1
0

Отправлено 04 Январь 2011 - 13:21

Проверяю данные на заполнение через isset(var string, var string, ...). В функцию isset() можно ввести несколько переменных, и если хотябы одна из них не работает (её нет) то функция выдает ELSE. Если все переменные есть - TRUE.

Почему тогда функция не работает. если я не заполнил хотябы одно поле? Сам код (обработчик)
<?php
$D_ROOT = $_SERVER['DOCUMENT_ROOT'];
require('functions.txt');
$fio = $_POST['fio'];
$mail = $_POST['mail'];
$text = $_POST['text'];
$but_on = $_POST['good'];

if (!isset($but_on, $fio, $mail, $text)) {
echo 'Вы попытались зайти на сайт напрямую или не заполнили поля ввода.';
form('feedback.php.', 'Заполнить данные'); # самописная функция для создания кнопок, полей
exit;
} else {
$date = date('H:i:s jS');
echo 'Сообщение отправлено в '.$date;
}

if (isset($date)) {
if (!preg_match("/^[a-zA-Z0-9_\-.]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-.]+$/", $mail)) {
echo 'Не правильно ввели адрес элекстронной почты';
exit;
}
$data = $date.' || '.
$fio.' || '.
$mail.' || '.
$text."\r\n";
}
$fp = fopen("$D_ROOT/../www/orders/feedback.txt", 'a+b');
fwrite($fp, trim($data), strlen($data));
fclose($fp);
?>


Формы
<html>
<head>
<title>Обзор заказов</title>
</head>
<body>
<h2>Автозапчасти от Боди;)</h2>
<h3>Обратная связь</h3>
<form action='fb_handler.php' method='post'>
Введите свои инициалы
<br><input type='text' name='fio' />

<br>Адресс e-mail
<br><input type='text' name='mail' />

<br>Введите текст сообщения
<br><textarea name='text'></textarea>

<p><input type='submit' name='good' value='Отправить' />
<input type='reset' value='Резетнуть?' />
</form>
</body>
</html>


пс. знаю что код не рациональный, но я ещё не приступал к оптимизации и отладки

 

 

  • 0


#2 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 04 Январь 2011 - 15:25

Ф-ция isset() проверяет существование переменной. А немного выше такие переменные были назначены:
$fio = $_POST['fio'];
$mail = $_POST['mail'];
$text = $_POST['text'];
$but_on = $_POST['good']

Соответственно, данные переменные существуют (и не важно пусты они или нет) ;) и, соответственно, будет срабатывать блок условия иначе. Правильнее будет проверять переменные на пустоту. Например, так:
if (!empty($_POST['fio']))$fio = $_POST['fio'];;
if (!empty($_POST['mail']))$mail = $_POST['mail'];
if (!empty($_POST['text']))$text = $_POST['text'];

$good (нажата ли кнопка) вообще лучше проверять на существование в самом начале скрипта и, если ее не существует, т.е., кнопка не нажата, то просто делать редирект с выводом соответствующего сообщения и прерывать выполнение скрипта:
if(!isset($_POST['good'])){
header('Refresh: 3; URL=адрес перенаправления');
echo 'Вход сюда только со страницы с формой.';
exit;
}
$D_ROOT = $_SERVER['DOCUMENT_ROOT'];
require('functions.txt');
if (!empty($_POST['fio']))$fio = $_POST['fio'];;
if (!empty($_POST['mail']))$mail = $_POST['mail'];
if (!empty($_POST['text']))$text = $_POST['text'];
...

  • 0

#3 yury

yury
  • Пользователь
  • 629 сообщений
  • Репутация: 176

Отправлено 04 Январь 2011 - 15:30

Banderas,

Почему тогда функция не работает. если я не заполнил хотябы одно поле?

Ну так вы же сами заполнили переменные, которые проверяете:
$fio = $_POST['fio'];
$mail = $_POST['mail'];
$text = $_POST['text'];
$but_on = $_POST['good'];
они не могут быть не установлены, после этих присваиваний.
Вам следует проверять установлены ли $_POST['fio'], $_POST['mail'] и т.д. и пустая или нет передана строка через них.
  • 0

#4 Banderas

Banderas
    Topic Starter
  • Пользователь
  • 1 168 сообщений
  • Репутация: 1

Отправлено 05 Январь 2011 - 02:17

Всем спасибо, забыл об empty()
Вопросик, почему не перекидывает но новую строку при записи в файл? Вроде должно все правильно работать, в $data указал переход строки \r\n, но записывает все вот так вот

00:09:32 5th || Дроворуб Виктор Медведевич || medvedev@yandex.ru || Я сейчас смотрю фильм Елки!01:07:56 5th || Вольский Владислав Сергеевич || vladserg@mail.ru || Печальная история...((01:09:34 5th || Вольский Владислав Сергеевич || vladserg@mail.ru || Печальная история...((01:09:36 5th || Вольский Владислав Сергеевич || vladserg@mail.ru || Печальная история...((


В чем проблема?
  • 0


#5 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 05 Январь 2011 - 11:15

Проблема вот в этой строке:
fwrite($fp, trim($data), strlen($data));

Данная ф-ция - fwrite() - должна иметь 2 параметра: куда записываем (дескриптор) и что записываем, а здесь указано 3. К тому же, первый обработан ф-цией trim(), которая обрежет строку и уже, скорее всего, сделает невозможным перенос, поскольку он будет также вырезан (это надо будет проверить, но скорее всего так). strlen($data) - вот это вообще не понятно к чему? Мало того, что этот параметр лишний, так он к тому же еще и бесполезен, поскольку просто возвращается длина строки безо всякого вывода. В общем, правильно так:
fwrite($fp, $data);

  • 0


#6 Banderas

Banderas
    Topic Starter
  • Пользователь
  • 1 168 сообщений
  • Репутация: 1

Отправлено 05 Январь 2011 - 11:28

matroskin8, спасибо!
trim() действительно удаляла символы переноса строки и символ возврата карeтки. Зато можно использовать ltrim() который работает аналогично trim(), но удаляет все символы слева, тоесть в конце \r\n не удалиться ;)
  • 0

#7 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 05 Январь 2011 - 11:44

Пожалуйста ;)
Если так боишься пробелов, то лучше их сначала удалить функцией trim(), а затем добавить к переменной перенос, потому как ltrim() выглядит тогда как полумера:

$data = $date. ' || ' . $fio. ' || ' .$mail. ' || ' .$text;
$data = trim($data);
$data .= "\r\n";
...
fwrite($fp, $data);


  • 0


#8 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 19 Январь 2011 - 11:57

Banderas, немного пооффтопим, но по делу.

Можно уже приучать себя не выносить обработку действий в отдельный файл, а перенаправлять пользователя на эту же страницу или на основной скрипт с параметрами. Обработка данных идет перед выводом, вот и всё. В обработке данных могут выставляться нужные данные, формироваться ошибки. А скрипт ниже уже при выводе сам должен определить, что ему вывести - ошибки, форму, текст и т.д. В зависимости от сложившейся ситуации.
Пойми, структура перенаправлений она конечно хороша, но вот незадача, ты отправил пользователя на файл с обработкой, но после обработки ты точно не знаешь куда направить пользователя. Конечно ты можешь прямо в файле обработчике сформировать путь на возвратную страницу. Но тут не будет никакой логики - почему, куда и зачем.
Возможно я не прав, тогда меня кто-нибудь поправит ;)
  • 0

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Оформление форума – IPBSkins.ru