Я работаю над опросом, и я почти готов, но есть одно требование, которое действительно съело меня.
Пользователь может провести опрос, и есть 6 разных наборов вопросов, и каждый набор вопросов находится в группе вопросов от 1 до 6. Когда пользователь задает вопрос 1-4 и выходит из системы, он/она должен вернуться в систему и перенаправить в группу вопросов 5. До сих пор мой код работает и перенаправляется на первые три страницы (вопросы1.php, people.php и environment.php), но отказ для остальных.
Я думаю, что проблема - это мой if elseif statement. Любая помощь для достижения желаемого результата будет действительно оценена. Ура!
Вот код
if ($row['userid']==$user){
while($row = mysql_fetch_assoc($result_set)){
if($row['question_group_id']==1 && $row['choosen']==1){
header("location:people.php");
}
elseif($row['question_group_id']==2 && $row['choosen']==1){
header("Location:environment.php");
}
elseif($row['question_group_id']==3 && $row['choosen']==1){
header("Location:widerorganization.php");
}
elseif($row['question_group_id']==4 && $row['choosen']==1){
header("Location:procurement.php");
}
elseif($row['question_group_id']==5 && $row['choosen']==1){
header("Location: communication.php");
}
elseif($row['question_group_id']==6 && $row['choosen']==1){
header("Location: notificationpage.php");
}}}
else {
header("Location:questions1.php");
}
Это вопрос рендеринга чистых кодов.
Я просто переформатировал ваш код. Вот ваш код до:
if ($row['userid']==$user)
{
while($row = mysql_fetch_assoc($result_set))
{
if ($row['question_group_id']==1 && $row['choosen']==1)
{
header("location:people.php");
}
else if($row['question_group_id']==2 && $row['choosen']==1)
{
header("Location:environment.php");
}
else if ($row['question_group_id']==3 && $row['choosen']==1)
{
header("Location:widerorganization.php");
}
else if ($row['question_group_id']==4 && $row['choosen']==1)
{
header("Location:procurement.php");
}
else if ($row['question_group_id']==5 && $row['choosen']==1)
{
header("Location: communication.php");
}
else if ($row['question_group_id']==6 && $row['choosen']==1)
{
header("Location: notificationpage.php");
}
}
}
else
{
header("Location:questions1.php");
}
Решение: Так как каждое состояние имеет предсказуемый характер, то почему бы нам не поставить эти страницы в ассоциативный массив вместо создания утомительного, if
условие? Во всяком случае, это моя предлагаемая настройка вашего кода.
<?php
$locations = array(
// Question Group ID => Landing page
1 => 'people.php',
2 => 'environment.php',
3 => 'wideorganization.php',
4 => 'procurement.php',
5 => 'communication.php',
6 => 'notificationpage.php'
);
if ($row['userid']==$user)
{
while($row = mysql_fetch_assoc($result_set))
{
// Here the Question Group ID
$questionGroupID = $row['question_group_id'];
// Now we determine here
if (isset($locations[$questionGroupID]) && $row['choosen'] == 1)
{
// Defined from the associative array above
header(sprintf("location:%s", $locations[$questionGroupID]));
exit();
}
}
}
else
{
header("location:questions1.php");
}
Теперь его намного легче отлаживать. Попробуйте этот код;)
people.php
, это означает, что значение столбца question_group_id
равно 1. Для всех будет полезнее, если вы покажете запрос Вы использовали и структуру исходной таблицы из базы данных.
Здесь ваш код отформатирован без цикла и с оператором switch
, как вы просили. Это может не работать напрямую, потому что все еще слишком много неопределенностей в отношении содержимого $newrow
и источника $row
. Но это отличное начало и действительно полезно для отладки. Оператор switch
позволяет вам сделать некоторые изменения в каждом случае (как и до того, как вы изменили свой вопрос).
$page = 'questions1.php';
if ($row['userid'] == $user):
$newrow = mysql_fetch_assoc($result_set);
if ($newrow['choosen'] == 1):
switch ($newrow['question_group_id']):
case 1:
$page = 'people.php';
break;
case 2:
$page = 'enviroment.php';
break;
case 3:
$page = 'widerorganization.php';
break;
case 4:
$page = 'procurement.php';
break;
case 5:
$page = 'communication.php';
break;
case 6:
$page = 'notificationpage.php';
break;
endswitch;
endif;
endif;
header("Location: {$page}");
exit;
header()
некоторый код все еще может быть выполнен. Чтобы предотвратить это, добавьтеexit();
после каждогоheader()
$row
вне вашего оператораwhile
, затем перезаписываете его и используете снова в последнемelseif
.