"призрачная" форма представления - PullRequest
0 голосов
/ 13 ноября 2009

У меня есть регистрационная форма с 3 частями, использующая PHP:

page 1 : collects info - has client & server side validation (for blank and invalid fields)
page 2 : collect more info - has server side validation (for blank and invalid fields)
page 3 : saves (db) and sends (email) the registration information

Подробнее:

page 1 : saves all form information into session[registration] before going to page 2
page 2 : redirects to page 1 if session[registration][email] is blank
page 3 : redirects to page 1 if session[registration][email] is blank; destroys session after registration is successful

Это работало нормально в течение последних месяцев, пока вчера не было отправлено около 25 писем с интервалом в несколько секунд для каждого. Я также проверил базу данных, и эти регистрации были сохранены. И вся информация о регистрации пустая (кроме автоматически сгенерированных полей, таких как date_added)

Я озадачен, потому что отправка электронной почты и сохранение БД не должны работать из-за перенаправления.

У вас есть идеи относительно того, что только что произошло?

Спасибо

Ответы [ 3 ]

2 голосов
/ 13 ноября 2009

Как вы проверяете, что поля данных не являются пустыми, прежде чем вставлять их в БД. Убедитесь, что используете empty (), чтобы убедиться, что поле пустое. Если вы используете оператор сравнения строк (т. Е. If ($ str! = "")), Он может привести к неожиданным результатам, если значение $ str равно false, null, 0 и т. Д. *

Edit: empty () описание из руководства: http://us.php.net/manual/en/function.empty.php Возвращаемые значения

Возвращает FALSE, если переменная имеет непустое и ненулевое значение.

Следующие вещи считаются пустыми:

* "" (an empty string)
* 0 (0 as an integer)
* "0" (0 as a string)
* NULL
* FALSE
* array() (an empty array)
* var $var; (a variable declared, but without a value in a class)

edit2:

isset () только проверяет, было ли переменной присвоено значение. Если переменная содержит пустую строку, isset () вернет true, потому что даже пустая строка имеет значение ('\ 0' отмечает конец строки в php).

isset () описание из руководства: http://us3.php.net/manual/en/function.isset.php

isset () вернет FALSE, если тестирует переменную, для которой установлено значение NULL. Также обратите внимание, что байт NULL ("\ 0") не эквивалентен константе PHP NULL.

комментарий от руководства:

isset не может надежно оценивать переменные с пустыми строками (необязательно NULL). то есть $ blankvar = ""; // isset вернет true на этом.

Это очень распространенная ошибка при обработке HTML-форм, которые возвращают пустые текстовые поля в скрипт. Вам лучше сделать это:

if ($ var! = "") вернуть истину; еще вернуть ложь;

Это скорее практика программирования, а не недостатки функции. Поэтому, если у вас есть привычка инициализировать переменные, вы можете столкнуться с проблемами с isset (), если ваш код или php-проект станут очень большими.

1 голос
/ 13 ноября 2009

Возможно ли, что все эти письма были сгенерированы ботом, просматривающим ваш сайт?

Можете ли вы воспроизвести проблему, вызвав curl на любой из ваших страниц?

Требуются ли для POST какие-либо действия или вы выполняете действия с GET?

1 голос
/ 13 ноября 2009

Проблема определенно на странице 3. В качестве обоснованного предположения я бы сказал, что ваша «пустая» проверка, если она ошибочна.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...