Php - 如果设置了与会话变量实例相关的if语句,则会出现问题

时间:2011-11-22 20:24:54

标签: php session variables if-statement

我无法整理列出各种商业联系信息的脚本。

基本上,用户可以输入商家名称,也可以从一个或多个类别中选择,然后单击提交按钮,然后开始搜索存储在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 个答案:

答案 0 :(得分:1)

Phew,在那里趟过很多东西!我会先说,简化你的通话。您可以通过两种方式执行此操作 - 首先编写一个执行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) ...

您将发现您的陈述将(a)更少括号,(b)更容易理解。如果你对变量名使用简单易读的英语,那就更好了(因为如果语句可以像英语句子一样被读出来)。

最后,不要忘记在战略点不时做print_r($_POST); exit(); - 你可以偷看你的应用程序出错的地方。