【问题标题】:pagination and php session vars分页和 php 会话变量
【发布时间】:2011-12-01 03:17:05
【问题描述】:

我这里只有一个简单的问题是描述:

我正在为我的网站制作新闻存档页面,使用开始日期、结束日期和新闻类别作为搜索参数对存档进行搜索。表单值存储在 $_SESSION 变量中,然后它们作为数组传递以用于分页和其他目的。 我的问题是,如果用户出于某种原因再次进入主存档搜索页面进行新搜索,如何防止在主存档搜索页面上显示搜索结果。

这是代码

<?php 
session_start();
if (isset($_POST['submit'])) {
    //get data from the form
    $archFld_1 = $_POST['archiveFld1'];
    $archFld_2 = $_POST['archiveFld2'];
    $archFld_3 = $_POST['archiveFld3'];
   //just some check on fields
   if (strlen($archFld_1) > 10) { $archFld_1 = ""; }
   if (strlen($archFld_2) > 10) { $archFld_2 = ""; }
   //save them as a array and store to session var
   $_archValues = array($archFld_3, $archFld_1, $archFld_2);
   $_SESSION['storeValues'] = $_archValues;
}
if (isset($_SESSION['storeValues'])) {
    //check params for search
    //set cat for query
    if ($_SESSION['storeValues'][0] > 0) { $valCat = "AND newsCat=".     $_SESSION['storeValues'][0] ." "; } else { $valCat = ""; }
    //set date for query
    if(($_SESSION['storeValues'][1] != "" ) && ($_SESSION['storeValues'][2] == "")) {
        $DateStart = $_SESSION['storeValues'][1];
        $valDate = " AND STR_TO_DATE(newsDate, '%d-%m-%Y') >= STR_TO_DATE('$DateStart', '%d-%m-%Y') ";
    }
    if(($_SESSION['storeValues'][2] != "") && ($_SESSION['storeValues'][1]=="")) {
        $DateEnd = $_SESSION['storeValues'][2];
        $valDate = " AND STR_TO_DATE(newsDate, '%d-%m-%Y') <= STR_TO_DATE('$DateEnd', '%d-%m-%Y') ";
    }
    if(($_SESSION['storeValues'][1]!="") && ($_SESSION['storeValues'][2] != "")) {
        $DateStart = $_SESSION['storeValues'][1];
        $DateEnd = $_SESSION['storeValues'][2];
        $valDate = " AND STR_TO_DATE(newsDate, '%d-%m-%Y') BETWEEN STR_TO_DATE('$DateStart', '%d-%m-%Y') AND STR_TO_DATE('$DateEnd', '%d-%m-%Y') ";
    }
    //query string and stire it to session
    $archQuery_string = $valCat.$valDate;
    $_SESSION['storeQuery'] = $archQuery_string;
}
//pagination start
$page = $_GET['id'];
$perPage = 10;
$result = wbQuery("SELECT * FROM wb_news WHERE newsLang=1 ". $_SESSION["storeQuery"] ."ORDER BY newsId DESC"); 
$totalPages = mysql_num_rows($result);
if(!$page)
$page = 1;
$start = ($page - 1)*$perPage;
?>
    <div id="sps_middle">
        <div class="sps_cnt">
            <div id="sps_middle_ly1">
                <div class="sps_cnt_small">
                    <div class="sps_page_title"><h3><?php echo $wb_lng['txtArchiveTitle']; ?></h3></div>
                        <div class="sps_pages_cnt" style="padding-top: 10px; float: left; margin-bottom: 15px;">
                            <div class="sps_middle_col01">
                                <div style="float: left;">
                                <p>
                                    <?php echo $wb_lng['txtArchiveInfo']; ?>
                                </p>
                                    <form action="<?php $PHP_SELF; ?>" method="post" name="archiveForm" class="archiveForm">
                                        <ul>
                                            <li>
                                                <input name="archiveFld1" type="text" id="archiveFld1" value="<?php echo $wb_lng['txtArhivaFld_01']; ?>" />
                                                <input name="archiveFld2" type="text" id="archiveFld2" value="<?php echo $wb_lng['txtArhivaFld_02']; ?>" />
                                                <select name="archiveFld3">
                                                    <option value="0"><?php echo $wb_lng['txtArhivaFld_07']; ?></option>
                                                    <option value="0" ><?php echo $wb_lng['txtArhivaFld_06']; ?></option>
                                                    <option value="1"><?php echo $wb_lng['txtArhivaFld_03']; ?></option>
                                                    <option value="2"><?php echo $wb_lng['txtArhivaFld_04']; ?></option>
                                                    <option value="3"><?php echo $wb_lng['txtArhivaFld_05']; ?></option>
                                                </select>
                                            </li>
                                            <li style="float: right;">
                                                <input name="reset" type="reset" class="sps_archiveform_btn" value="<?php echo $wb_lng['txtArchiveFormReset']; ?>"/>
                                                <input name="submit" type="submit" class="sps_archiveform_btn" value="<?php echo $wb_lng['txtArchiveFormSend']; ?>"/>
                                            </li>
                                        </ul>
                                    </form>
                                </div>
                                <hr />
<?php
if (#HERE GOES SOME CODE TO PERFORM THE CHECK!!!#) {
    //perform db query
    $result = wbQuery("SELECT * FROM wb_news WHERE newsLang=1 ". $_SESSION['storeQuery'] ."ORDER BY newsId DESC LIMIT $start, $perPage"); 
    //count rows
    $totalnews = mysql_num_rows($result);
    $count = 1;
    if($totalnews == 0) {
        //no results, say to the user
        echo "\t\t\t<div class=\"cil_news_text_big\">\n\t\t\t\t".$wb_lng['txtArchiveNoEntries']."\n\t\t\t</div>\n";
    } else {
        //we have results, yeeeeeeeeey
        while($ROWnews = mysql_fetch_object($result)){
            //set link extensions by the news cat
            switch ($ROWnews->newsCat) {
                case 1:
                    $newsCat_link = "news";
                    break;
                case 2:
                    $newsCat_link = "statements";
                    break;
                case 3:
                    $newsCat_link = "events";
                    break;
            }
            //text summary
            if (strlen($ROWnews->newsShort) > 0 ) {$newsShortTxt = strip_tags($ROWnews->newsShort);
                if ($lang_id==2) { $newsShortTxt =  wbTranslit($newsShortTxt); }
            } else {
                $newsShortTxt = strip_tags($ROWnews->newsFull);
                if ($lang_id==2) { $newsShortTxt = wbTranslit($newsShortTxt); }
            }
            $newsShortTxt = wbShorTxt($newsShortTxt, 210, "... <a title=\"".$wb_lng['txtShowMore']."\" href=\"http://".$_SERVER['HTTP_HOST']."/".$lang_link."/".$newsCat_link."/".$ROWnews->newsId."/full/\">".$wb_lng['txtShowMore']."...</a>");
            //show news
            echo "\t\t<div class=\"sps_news_list\">\n";
            echo "\t\t<div class=\"sps_news_l\">\n";
            echo "\t\t\t<img alt=\"\" src=\"http://".$_SERVER['HTTP_HOST']."/content/images/news/_thumb/".$ROWnews->newsImageThumb."\" />\n";
            echo "\t\t</div>";
            echo "\t\t<div class=\"sps_news_r\">\n";
            //transliterate title
            if ($lang_id==2) { $newsTitle =  wbTranslit($ROWnews->newsTitle); } else { $newsTitle =  $ROWnews->newsTitle; } 
            echo "\t\t\t<div class=\"sps_news_title\">\n\t\t\t\t<a title=\"".$newsTitle."\" href=\"http://".$_SERVER['HTTP_HOST']."/".$lang_link."/".$newsCat_link."/".$ROWnews->newsId."/full/\">".$newsTitle."</a>\n\t\t\t</div>\n";
            echo "\t\t\t<div class=\"sps_news_date\">\n\t\t\t\t".$ROWnews->newsDate."\n\t\t\t</div>\n";
            echo "\t\t\t<div class=\"sps_news_text_sh\">\n\t\t\t\t".$newsShortTxt."\n\t\t\t</div>\n";
            echo "\t\t</div>";
            echo "\t\t</div>";
            //show <hr /> based on $count
            if($totalnews != $count) { echo "\t\t\t<hr />\n"; }
            $count++;
        }
    }
//pagination check
if($totalPages>$perPage) {
?>
                                <hr />
                                <div class="sps_pagginate">
                                   <?PHP wbPageTurnFront($PHP_SELF."/".$lang_link."/archive/", $totalPages, $page, $perPage); ?>
                                </div>
<?php 
    }
}
?>

有什么想法吗? Tnx :)

【问题讨论】:

  • 您是否尝试过再添加一个会话来标记已进行搜索?就像一个“HasSearched”会话变量,它在页面首次加载时以默认值 0 开头(首先通过 isset 检查),然后在进行搜索后将其设置为 1。然后放置代码以检查它是否已经为 1,然后不要'不显示结果,因为这将是一个新的搜索...
  • 只是为了确认.. 您在每个页面的搜索结果(如果有)的顶部显示搜索表单,是吗?是的,我认为这里的代码分组需要修复..
  • 是的,你是对的!有搜索结果时,分页的每一页都会显示表单。
  • 更新了我的帖子,请看一下运行后结果如何...

标签: php session pagination


【解决方案1】:

您是否可能正在寻找类似的东西?:

# start of page:
if (!isset($_SESSION['HasSearched']) {
    $_SESSION['HasSearched'] = 0;
}

// ...
// ...
// ...

# when you execute code for displaying search results
# check first if the session has been set:
if ($_SESSION['HasSearched'] == 0) {
    # proceed with search code
    # then set it to 1 since a search has been performed just now
    $_SESSION['HasSearched'] = 1;
} else {
    # this means a search had been previously made.
    # based on your requirement, no results should be displayed
    # since the assumption would be that a new search would be put in place

    # code to display fresh page with search form goes here

    # reset the session variable's value
    $_SESSION['HasSearched'] = 0;
}

如果没有,请告诉我们..

[编辑] 基于帖子的新信息:

你能试试这个吗?:

<?php 
session_start();
# check if the form was submitted
if (isset($_POST['submit'])) {
    //get data from the form
    $archFld_1 = $_POST['archiveFld1'];
    $archFld_2 = $_POST['archiveFld2'];
    $archFld_3 = $_POST['archiveFld3'];
    //just some check on fields
    if (strlen($archFld_1) > 10) { $archFld_1 = ""; }
    if (strlen($archFld_2) > 10) { $archFld_2 = ""; }
    //save them as a array and store to session var
    $_archValues = array($archFld_3, $archFld_1, $archFld_2);
    $_SESSION['storeValues'] = $_archValues;
    $newSearch = 0;
} else if (isset($_GET['newSearch'])) {
    if ($_GET['newSearch'] == 1) {
        # new search requested by user (clicked link at the end (for now))
        $_SESSION['storeValues'] = NULL;
        $newSearch = 1;
    }
} else {
    # this may mean that the form was not submitted, nor was the `new search` link clicked
}

# let's check if we are just refreshing or taking from a new page or not
if (isset($_SESSION['storeValues'])) {
    //check params for search
    //set cat for query
    if ($_SESSION['storeValues'][0] > 0) { $valCat = "AND newsCat=".     $_SESSION['storeValues'][0] ." "; } else { $valCat = ""; }
    //set date for query
    if(($_SESSION['storeValues'][1] != "" ) && ($_SESSION['storeValues'][2] == "")) {
        $DateStart = $_SESSION['storeValues'][1];
        $valDate = " AND STR_TO_DATE(newsDate, '%d-%m-%Y') >= STR_TO_DATE('$DateStart', '%d-%m-%Y') ";
    }
    if(($_SESSION['storeValues'][2] != "") && ($_SESSION['storeValues'][1]=="")) {
        $DateEnd = $_SESSION['storeValues'][2];
        $valDate = " AND STR_TO_DATE(newsDate, '%d-%m-%Y') <= STR_TO_DATE('$DateEnd', '%d-%m-%Y') ";
    }
    if(($_SESSION['storeValues'][1]!="") && ($_SESSION['storeValues'][2] != "")) {
        $DateStart = $_SESSION['storeValues'][1];
        $DateEnd = $_SESSION['storeValues'][2];
        $valDate = " AND STR_TO_DATE(newsDate, '%d-%m-%Y') BETWEEN STR_TO_DATE('$DateStart', '%d-%m-%Y') AND STR_TO_DATE('$DateEnd', '%d-%m-%Y') ";
    }
    //query string and stire it to session
    $archQuery_string = $valCat.$valDate;
    $_SESSION['storeQuery'] = $archQuery_string;
} else {
    $_SESSION['storeQuery'] = '';
}

?>
    <div id="sps_middle">
        <div class="sps_cnt">
            <div id="sps_middle_ly1">
                <div class="sps_cnt_small">
                    <div class="sps_page_title"><h3><?php echo $wb_lng['txtArchiveTitle']; ?></h3></div>
                        <div class="sps_pages_cnt" style="padding-top: 10px; float: left; margin-bottom: 15px;">
                            <div class="sps_middle_col01">
                                <div style="float: left;">
                                <p>
                                    <?php echo $wb_lng['txtArchiveInfo']; ?>
                                </p>
                                    <form action="<?php $PHP_SELF; ?>" method="post" name="archiveForm" class="archiveForm">
                                        <ul>
                                            <li>
                                                <input name="archiveFld1" type="text" id="archiveFld1" value="<?php echo $wb_lng['txtArhivaFld_01']; ?>" />
                                                <input name="archiveFld2" type="text" id="archiveFld2" value="<?php echo $wb_lng['txtArhivaFld_02']; ?>" />
                                                <select name="archiveFld3">
                                                    <option value="0"><?php echo $wb_lng['txtArhivaFld_07']; ?></option>
                                                    <option value="0" ><?php echo $wb_lng['txtArhivaFld_06']; ?></option>
                                                    <option value="1"><?php echo $wb_lng['txtArhivaFld_03']; ?></option>
                                                    <option value="2"><?php echo $wb_lng['txtArhivaFld_04']; ?></option>
                                                    <option value="3"><?php echo $wb_lng['txtArhivaFld_05']; ?></option>
                                                </select>
                                            </li>
                                            <li style="float: right;">
                                                <input name="reset" type="reset" class="sps_archiveform_btn" value="<?php echo $wb_lng['txtArchiveFormReset']; ?>"/>
                                                <input name="submit" type="submit" class="sps_archiveform_btn" value="<?php echo $wb_lng['txtArchiveFormSend']; ?>"/>
                                            </li>
                                        </ul>
                                    </form>
                                </div>
                                <hr />
<?php

//pagination start 
$page = $_GET['id'];
$perPage = 10;
$result = wbQuery("SELECT * FROM wb_news WHERE newsLang=1 ". $_SESSION["storeQuery"] ."ORDER BY newsId DESC"); 
$totalPages = mysql_num_rows($result);
if (!$page) {
    $page = 1;
}
$start = ($page - 1)*$perPage;

if ($newSearch == 0) {
    //perform db query
    $result = wbQuery("SELECT * FROM wb_news WHERE newsLang=1 ". $_SESSION['storeQuery'] ."ORDER BY newsId DESC LIMIT $start, $perPage"); 
    //count rows
    $totalnews = mysql_num_rows($result);
    $count = 1;
    if($totalnews == 0) {
        //no results, say to the user
        echo "\t\t\t<div class=\"cil_news_text_big\">\n\t\t\t\t".$wb_lng['txtArchiveNoEntries']."\n\t\t\t</div>\n";
    } else {
        //we have results, yeeeeeeeeey
        while($ROWnews = mysql_fetch_object($result)){
            //set link extensions by the news cat
            switch ($ROWnews->newsCat) {
                case 1:
                    $newsCat_link = "news";
                    break;
                case 2:
                    $newsCat_link = "statements";
                    break;
                case 3:
                    $newsCat_link = "events";
                    break;
            }
            //text summary
            if (strlen($ROWnews->newsShort) > 0 ) {$newsShortTxt = strip_tags($ROWnews->newsShort);
                if ($lang_id==2) { $newsShortTxt =  wbTranslit($newsShortTxt); }
            } else {
                $newsShortTxt = strip_tags($ROWnews->newsFull);
                if ($lang_id==2) { $newsShortTxt = wbTranslit($newsShortTxt); }
            }
            $newsShortTxt = wbShorTxt($newsShortTxt, 210, "... <a title=\"".$wb_lng['txtShowMore']."\" href=\"http://".$_SERVER['HTTP_HOST']."/".$lang_link."/".$newsCat_link."/".$ROWnews->newsId."/full/\">".$wb_lng['txtShowMore']."...</a>");
            //show news
            echo "\t\t<div class=\"sps_news_list\">\n";
            echo "\t\t<div class=\"sps_news_l\">\n";
            echo "\t\t\t<img alt=\"\" src=\"http://".$_SERVER['HTTP_HOST']."/content/images/news/_thumb/".$ROWnews->newsImageThumb."\" />\n";
            echo "\t\t</div>";
            echo "\t\t<div class=\"sps_news_r\">\n";
            //transliterate title
            if ($lang_id==2) { $newsTitle =  wbTranslit($ROWnews->newsTitle); } else { $newsTitle =  $ROWnews->newsTitle; } 
            echo "\t\t\t<div class=\"sps_news_title\">\n\t\t\t\t<a title=\"".$newsTitle."\" href=\"http://".$_SERVER['HTTP_HOST']."/".$lang_link."/".$newsCat_link."/".$ROWnews->newsId."/full/\">".$newsTitle."</a>\n\t\t\t</div>\n";
            echo "\t\t\t<div class=\"sps_news_date\">\n\t\t\t\t".$ROWnews->newsDate."\n\t\t\t</div>\n";
            echo "\t\t\t<div class=\"sps_news_text_sh\">\n\t\t\t\t".$newsShortTxt."\n\t\t\t</div>\n";
            echo "\t\t</div>";
            echo "\t\t</div>";
            //show <hr /> based on $count
            if($totalnews != $count) { echo "\t\t\t<hr />\n"; }
            $count++;
        }
    }
    //pagination check
    if($totalPages>$perPage) {
?>
                                <hr />
                                <div class="sps_pagginate">
                                   <?PHP wbPageTurnFront($PHP_SELF."/".$lang_link."/archive/", $totalPages, $page, $perPage); ?>
                                </div>
<?php 
    }
}

# placing this code for your testing: i'm currently thinking that you'll need a user-ended trigger that a new search is desired
echo '<br /><a href=\'' . $_SERVER['PHP_SELF'].'?newSearch=1' . '\'> Perform a new search </a><br />';

?>

我想我可能会有点困惑,但如果你不介意的话,不妨试一试。

【讨论】:

  • 谢谢您,Nonym :) 我会立即尝试并告诉您是否有效!
  • 不,我试过了。它没有效果。我将编辑我的问题并通过代码,这可能会让您更好地了解问题。
  • 是的,这行得通!看起来像新搜索的用户端触发器将是解决方案,我认为其他任何事情都需要一些 java 脚本或其他东西......谢谢你帮助我,Nonym :) 我欠你一杯!
猜你喜欢
  • 2012-04-30
  • 1970-01-01
  • 1970-01-01
  • 2021-09-02
  • 1970-01-01
  • 2012-08-03
  • 2013-05-01
相关资源
最近更新 更多