Php - проблема с оператором if, связанным с экземпляром переменной сеанса, если установлен - PullRequest
0 голосов
/ 23 ноября 2011

У меня проблемы с составлением сценария, который перечисляет различную информацию о деловых контактах.

Как правило, пользователь может либо ввести название компании, либо выбрать из набора или категорий, а затем нажать кнопку отправки, после чего начинается поиск результатов, хранящихся в базе данных mysql. Эта часть работает нормально, так как пользователь может ввести имя или выбрать категорию, а затем нажать кнопку, чтобы просмотреть таблицу с результатами поиска. Эти результаты разбиты на наборы по 6.

Вот код для разметки формы:

$pageContent = '
    <div class="content">
    <h1>Browse Listings</h1>
    <div class="searchBox">
    <form method="post" action="'.$_SERVER['PHP_SELF'].'" name="search">
        Enter a Business Name: <input name="bizName" type="text" size="25" placeholder="Search..." />
        or Select a Category:   <select name="bizCategory">
                                <option>Choose</option>
                                <option>Accomodation</option>
                                <option>Retail</option>
                            </select>
        <button type="submit" name="searching" class="search" value="Search">Search</button>
    <!-- end .searchBox --></div>
    <br />
';

Вот код, который касается случая, когда пользователь нажимает на Search, когда он вводит имя:

if ((isset($_POST['searching']) && $_POST['searching'] == "Search") || isset($_SESSION['bizFind']))
{
    if ((isset($_POST['bizName']) && $_POST['bizName'] == "") && $_POST['bizCategory'] == "Choose")
    { 
        $pageContent .= '
        <p>You forgot to enter a business name, or select a search category.</p>
        ';
    } else {

        ...

        if (((isset($_POST['bizName']) && $_POST['bizName'] !== "") && $_POST['bizCategory'] == "Choose") || (isset($_SESSION['bizFind']) && !in_array($_SESSION['bizFind'], array("", "Accomodation", "Retail"))))
        {

        if ((isset($_SESSION['bizFind']) && !in_array($_SESSION['bizFind'], array("", "Accomodation", "Retail"))) && !isset($bizFind))
        {
            $bizFind = $_SESSION['bizFind'];
        }
        else
        {
            $bizFind = $_POST['bizName'];
        }

С акцентом на этой строке, являющейся фактическим экземпляром:

    if (((isset($_POST['bizName']) && $_POST['bizName'] !== "") && $_POST['bizCategory'] == "Choose") || (isset($_SESSION['bizFind']) && !in_array($_SESSION['bizFind'], array("", "Accomodation", "Retail"))))

Теперь, когда пользователь уходит со страницы и возвращается назад, значение поиска сохраняется и отображаются результаты.

Но по какой-то причине я не могу понять заявление пользователя, нажимающего Search после выбора категории.

Я пробовал это:

    if ((isset($_POST['bizCategory']) && $_POST['bizCategory'] !== "Choose") || (isset($_SESSION['bizFind']) && ($_SESSION['bizFind'] == "Accomodation" || $_SESSION['bizFind'] == "Retail"))
    {
        if ((isset($_SESSION['bizFind'])  && ($_SESSION['bizFind'] == "Accomodation" || $_SESSION['bizFind'] == "Retail")) && !isset($bizFind))
        {
            $bizFind = $_SESSION['bizFind'];
        }
        else 
        {
            $bizFind = $_POST['bizCategory'];
        }

Это сработает, если выбрана категория, и пользователь нажмет Search, но не сработает, если была установлена ​​переменная сеанса, и пользователь вернулся обратно в область списка.

Это также приводит к проблеме с подкачкой, когда выбрана категория поиска.

Если используется название компании, подкачка работает нормально, но когда выбрана категория и пользователь пытается перейти к следующей странице результатов, данные не возвращаются, так как переменная $bizFind (строка поиска) имеет не был установлен или не имеет значения.

Если у кого-то есть какие-либо предложения или предложения для меня, это ... было бы очень признательно.

Но вопрос в том, что я делаю не так со вторым экземпляром, что сценарий не запускается только наличием переменной сеанса (строки поиска).

Спасибо !!

1 Ответ

1 голос
/ 23 ноября 2011

Фу, там много чего можно пройти! Я бы сказал, для начала, упростить ваши звонки. Вы можете сделать это двумя способами - сначала написать функцию, которая выполняет isset-and-retrieve:

function getPost($v)
{
    return isset($_POST[$v]) ? $_POST[$v] : null;
}

Затем вы можете поменять это:

if (isset($_POST['bizCategory']) && ($_POST['bizCategory'] !== "Choose")) ...

с этим:

$bizCat = getPost('bizCategory');
if ($bizCat && ($bizCat != 'Choose')) ...

Кроме того, учитывая, что у вас довольно сложные выражения в скобках, сделайте что-то вроде этого:

// Just a random example!
$bizFindSession = (bool) getSession('bizFind');
$bizCatPosted = ...
if (!bizFindSession && $bizCatPosted) ...

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

Наконец, не забывайте время от времени делать print_r($_POST); exit(); в стратегических точках - вы можете заглянуть туда, где работает ваше приложение.

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