Я прочитал множество вопросов о перенаправлении обратно в форму после выполнения проверки на стороне сервера (при условии, что в форме есть ошибки) и отображении ошибок, но я не нашел ничего, связанного с моей конкретной проблемой. У меня есть простой фронт-контроллер, который использует .htaccess для перенаправления http-запросов в index.php. Это настройка; вот моя ситуация:
register.php - это форма регистрации, которая публикуется на validate_registration.php. У меня есть код в форме, которая отображает переменные php (который не будет установлен, если скрипт проверки не запущен). Я использую это в конце validate_registration.php:
header("Location: http://www.example.com/register.php");
К сожалению, код для отображения ошибок в register.php просто ничего не делает. Это теряется в моем фронт-контроллере? Мой код .htaccess такой:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond $1 !^(index\.php|ajax|css|error|form|img|js|robots\.txt|securimage|submit)
RewriteRule ^(.*)$ index.php?url=$1 [PT,L]
</IfModule>
и мой фронт-контроллер такой (в основном, это чрезвычайно просто с оператором switch, потому что мне абсолютно не нужно ничего более сложного, масштабируемого и т. Д.):
$url = $_GET['url'];
require_once("header.php");
echo '<body>';
require_once("banner.php");
require_once("navigation.php");
require_once("login_bar.php");
echo '<div id="main">';
switch ($url) {
case('register.php'):
require_once('register.php');
break;
default:
require_once('error404.php');
break;
}
echo '</div>'; //Closing div tag for the id="main" section
require_once("$template_directory/general/footer.php");
echo '</body>';
Извините за длинный вопрос; Я не могу исправить это! validate_registration.php перенаправляет в register.php просто отлично, но переменные, похоже, не проходят через фронт-контроллер. Кроме того, эта форма должна работать без включенного Javascript, поэтому, к сожалению, AJAX не вариант.
EDIT:
Вот код формы с сообщениями об ошибках; сейчас все просто, потому что я только проверяю это.
<?php
$allowed_fields = array("reg_username",
"reg_password",
"reg_confirm_password",
"reg_email",
"reg_confirm_email",
"captcha_code",
"reg_disclaimer",
);
$db_select_connection = DB::get_admin_connection();
$errors = array();
foreach ($_POST as $key => $value) {
if (in_array($key, $allowed_fields)) {
$$key = mysql_real_escape_string($value);
if ($value == "") {
$errors["$key" . "_blank"] = "The $key field is required.";
}
}
}
// Validation section
// Username
if (ctype_alnum($reg_username)) {
$errors["reg_username_invalid"] = "Username can only contain letters and numbers.";
}
// Password
if (strlen($reg_password) < 6) {
$errors["reg_password_short"] = "Password must be at least 6 characters long.";
}
if ($reg_password !== $reg_confirm_password) {
$errors["reg_password_match"] = "Passwords do not match.";
}
$legal_characters = preg_quote("~!@#$%^&*()");
$trimmed_password = preg_replace("/[^a-zA-Z$legal_characters]/", "", $reg_password);
if ($trimmed_password !== $reg_password) {
$errors["reg_pass_chars"] = "Password can only contain letters, numbers, and " . htmlentities($legal_characters, ENT_QUOTES, 'UTF-8');
}
// Email
if ($reg_email !== $reg_confirm_email) {
$errors["reg_email_match"] = "Email addresses do not match.";
}
if (!Email::validate_email($reg_email)) {
$errors["reg_email_invalid"] = "Email address is invalid.";
}
//Disclaimer check box
if ($reg_disclaimer !== "on") {
$errors["reg_disclaimer_accept"] = "You must read and accept the disclaimer to create an account.";
}
require("http://www.example.com/register.php");
?>
Код для формы просто содержит и похожие блоки кода для отображения ошибок. Здесь задействовано множество форматов и стилей, поэтому я не буду тратить пространство на всю форму.
РЕДАКТИРОВАТЬ: Кроме того, как мне отформатировать что-то как код, не помещая вручную 4 пробела перед каждой строкой? Я скопировал код непосредственно из NetBeans, моей IDE, в окно редактирования, выделил его и нажал «Код», и он все равно не позволил мне отправить свое сообщение.