使用GET在mySql查询上使用PHP Zend_Paginator

时间:2012-05-26 06:58:57

标签: php mysql zend-framework

我正在尝试使用Zend_Paginate()在基于GET搜索字符串加载的查询上调用页面,查询基本上执行以下操作:

SELECT * FROM table WHERE column LIKE '%searchstring%' OR alt_column LIKE '%searchstring%';

通过搜索/提交文本表单调用查询时工作正常,URL返回类似于

的内容
URLINK.php?search=searchstring

然而,当试图进入下一页时,程序会将我转发回paginate备用URL(用于错误或没有页面显示) - 希望这最后一行有意义它已经晚了并且我正在尽力输入透明度。

URL.php?search=searchstring使用分页时,最好的方法是什么?

更多关于对网址的调用

//search query 
$search = searchQuery('search', 'list_sql_rows.php');
$results - searchTable($dbRead, $search);

按以下顺序使用上述变量的搜索方法

if(isset($_POST['submit_search'])) { $searchstring = $_POST['searchstring'];
if($searchstring) { header('Location: results.php?search=' . $searchstring); } }

此位效果很好,但当我尝试使用paginator调用results.php?page=2时,系统会将我还原为后退网址list_sql_rows.php,如上所述。任何想法/意见都表示赞赏。

只是为了澄清search.php页面中的搜索字段/表单,将$searchstring通过$_POST&&发送到results.php页面。 $_GET为失败安全。 get方法在URL标头中发送$searchstring,以便搜索DO的结果在第一页 results.php?search = $ searchstring 上工作。这很好用。分页似乎丢失了$searchstring,我想知道这是否是由于$_POST / $_GET在分页器开始'分页'时丢失它返回网址 results.php?page = 2 所以似乎$_GET可能不是首选方法?

更新 在写入轨道上现在paginate工作它是我的链接结构被打破。 _results_samples.php?search = robert& page = 4 _ 实际上将使用单词ROBERT

返回分页结果的第4页

解决方案通过ROCKYFORD提出的变体建议 首先持久化$searchstring的推荐方法的变体 更改为分页链接,如下所示

<a href='" . $_SERVER['PHP_SELF'] . "?search=" . $searchstring . "&page={$page}'>$page</a>

2 个答案:

答案 0 :(得分:2)

以下是正确使用分页的示例: 在行动方法:

$select = $clients->getAll();                               
$paginator = new Zend_Paginator(new Zend_Paginator_Adapter_DbSelect($select));
$paginator->setCurrentPageNumber($this->_getParam('page'));
$paginator->setItemCountPerPage(20);
$this->view->clients = $paginator;

在视图脚本中:

<?php if (count($this->clients) > 0): ?>
...
    <?php echo $this->paginationControl($this->clients, 'Sliding', 'partials/paginator.phtml'); ?>
<?php else: ?>
        <h3 class="notice">No registered clients found!</h3>
<?php endif; ?>

但即使你失败了这个变种,你总是可以尝试编写自己的组件,Zend只会帮助我们解决一些任务。

答案 1 :(得分:1)

您需要确保在请求之间保留查询字符串,使用Zend_Session_Namespace或Zend_registry。

每次Zend_Paginator使用DbTableSelect或DbSelect适配器加载页面时,它必须使用查询命中数据库,它只是更改限制选项。

或者您可以将整个查询结果转储到Zend_Paginator_Adapter_Array中,它将遍历数组。

<强> [编辑]
你将不得不在请求之间保持查询字符串,所以你可以把它放回url字符串,我通常使用Zend_Registry,但后来我使用整个MVC堆栈。您似乎没有使用整个堆栈,因此您需要另一种方法,可能$ _SESSION会起作用。我确信还有很多其他方法可以保留这些数据。

P.S。你没有提到你正在使用哪个适配器,所以我做了一些假设。

<强> [编辑] 就个人而言,我总是使用$ _post来避免这一切,但似乎只有$ _get这个问题。