Проблема с регистрацией в PHP
Я программирую систему регистрации php, где есть две точки входа (если это имеет смысл):
Если клиент хочет приобрести продукт, но не имеет учетной записи, и он сохраняет идентификатор продукта на протяжении всего процесса регистрации. Затем это позволяет обработать платеж после регистрации.
Клиент регистрируется впервые, не пытаясь купить продукт.
Это ссылки, указывающие пользователю на страницы регистрации для двух вышеуказанных методов:
1. <a href="register.php?id=<?php echo $row['product_id'] ?>"></a>
2. <a href="register.php?type=first"></a>
Это код для файла register.php:
<?php
if(empty($_GET['type'])== "first") {
header("Location: register.php?type=first&step=1");
}
if(empty($_GET['id'])) {
if($_GET['type']) {
//show the content first registration
}
header("Location: register.php?type=first&step=1");
}else{
$product_id=$_GET['id'];
header("Location: register.php?id=".$product_id."&step=1");
//show the content with the product information
}
?>
<html>...</html>
Проблемы:
При использовании 1-го метода выше php говорит, что у него есть цикл перенаправления, и я не могу решить это. Как только у нас будет эта работа, я хочу показать содержание, но это приводит ко второй проблеме.
При использовании второго метода он работает и показывает контент для первой регистрации, но не показывает никакого HTML-контента под этим кодом.
Любая помощь будет оценена.
Спасибо
ОБНОВИТЬ:
Благодаря вашим ответам я переписал это так, и теперь оно работает.
<?php
if($_GET['type'] == "first" && empty($_GET['step'])) {
header("Location: register.php?type=first&step=1");
//If user clicks on (<a href="register.php?type=first"></a>)
//show the content first registration
}elseif(empty($_GET['id']) && empty($_GET['type'])) {
header("Location: register.php?type=first&step=1");
//if user types in the address bar www.domain.co.uk/register.php
//redirect and show the content first registration
}elseif(isset($_GET['id']) && empty($_GET['step'])){
$product_id=$_GET['id'];
header("Location: register.php?id=".$product_id."&step=1");
//if the user clicks on <a href="register.php?id=<?php echo $row['product_id'] ?>"></a>
//show the content with the product information
}
?>
4 ответа
Его обновление будет работать
<?php
if($_GET['type'] == "first" && empty($_GET['step'])) {
header("Location: register.php?type=first&step=1");
}elseif(empty($_GET['id']) && empty($_GET['type'])) {
header("Location: register.php?type=first&step=1");
}elseif(isset($_GET['id']) && empty($_GET['step'])){
$product_id=$_GET['id'];
header("Location: register.php?id=".$product_id."&step=1");
}
?>
Потому что это то, что я разработал.
Более точный отступ ваших файлов может помочь в этом случае:
<?php
if(empty($_GET['type'])== "first")
{
header("Location: register.php?type=first&step=1");
exit;
}
if(empty($_GET['id']))
{
if($_GET['type'])
{
exit; //show the content first registration
}
header("Location: register.php?type=first&step=1");
exit;
}
else
{
$product_id=$_GET['id'];
header("Location: register.php?id=".$product_id."&step=1");
exit; //show the content with the product information
}
?>
<html>...</html>
Система не может добраться до html. Если $_GET["type"] не пусто, вызывается первый if или вложенный if и скрипт завершается. Если $_GET["id"] не пусто, то вложенное if может быть выполнено и скрипт завершится. Если $_GET["id"] пусто, выполняется последняя команда и сценарий завершается.
Эта строка очень интересна:
if(empty($_GET['type'])== "first")
Это говорит: "Тип пуст? затем пусто ($_GET['type'] равно true. True == "first" также верно, поэтому скрипт завершается. Это то, что вы хотели? Похоже, вы имели в виду
if (!empty($_GET['type']) && $_GET['type'] == "first")
Чтобы добраться до ваших ситуаций 1 и 2:
Ситуация 1, если она возвращается на эту страницу, переходит в финал еще. Это добавляет &step=1 к URL. Но это не меняет ситуацию, поэтому вы продолжаете добираться до этого и перенаправлять на тот же URL. Я не думаю, что вы собираетесь перейти к этому, как только вы добавили &step=1, или нет?
Ситуация 2 переходит во второе условие if, потому что $_GET["type"] не пусто, а $_GET["id"] равно, а затем выполняет вложенный оператор if для непосредственного выхода.
Я думаю, что вы имели в виду это:
<?php
if (!empty($_GET['step']) && (!empty($_GET['type']) || !empty($_GET['id'])))
{
// This is when the html should be shown, right?
// So no code here
}
/*elseif ($_GET['type'] == "first")
{
header("Location: register.php?type=first&step=1");
exit;
}*/ // Don't need this part?
elseif (!empty($_GET['id']))
{
$product_id=$_GET['id'];
header("Location: register.php?id=".$product_id."&step=1");
exit;
}
else
{
header("Location: register.php?type=first&step=1");
exit;
}
?>
<html>...</html>
Что если я пойду на шаг 10
register.php? Тип = первый шаг & =10
вам нужно указать допустимые шаги и типы, например
if($_GET['type'] == "first") { do something }
if($_GET['step'] == 1) { do something }
использование empty() не очень хорошая идея
Проблемы:
цикл перенаправления - скажем, ссылка выглядит так, когда она отображается: AB Когда пользователь щелкает по ней, она переходит на URL: http://yourhostname/register.php?id=1234 C. Это третье предложение в register.php, $ Product_id=1234. D. Вы перенаправляете браузер пользователя на http://yourhostname/register.php?id=1234. E. Браузер пользователя идет туда, и опыт в основном идет прямо к C. Снова и снова и снова.
Второй метод не показывает никакого HTML-кода, потому что он не должен это делать - перенаправление - это последнее, что вы должны отправить в ответ на любой запрос страницы - вы правильно используете "exit".
Решение: почему вы вообще перенаправляете? Вы можете заменить весь блок этим:
<?php
$type = 'first';
$step = 1;
$productId = null;
if (!empty($_GET['type'])) {
$type = $_GET['type'];
}
if (!empty($_GET['step'])) {
$step = $_GET['step'];
}
if (!empty($_GET['id'])) {
$product_id = $_GET['id'];
}
... now add your business logic code
?>