【问题标题】:Pagination / Array and query分页/数组和查询
【发布时间】:2018-09-04 17:46:06
【问题描述】:

对 PHP 和 Mysql 非常陌生,我正在尝试帮助儿子完成一个需要提交带有复选框的表单的项目,该复选框查询数据库表中名为“item_id”的特定列,其中包含增量整数。

我们已经成功创建了一个带有名为“类别”的复选框并使用如下内爆的数组:

$categories = implode(",",$_GET['category']);

我们可以使用这个查询数据库

$data = mysql_query("SELECT * FROM clients 
                     WHERE upper($field) LIKE'%$find%' AND item_id IN ($categories)
                     ORDER BY item_updated DESC LIMIT $offset, $rowsperpage;");

这很好用,我们可以回显看起来运行良好的输出,并且根据选择的复选框包含多个类别。

我们还有一个计数查询来生成行计数并生成一些我们通过教程脚本实现的分页,该脚本也可以工作。

我们遇到的问题是,如果所有记录都从数据库返回,分页链接工作正常,但是为了对来自 implode 的多个类别的搜索结果进行分页,我从 echo'd 调用脚本<a href= 再次与所有适当的搜索字符串链接,但是当我尝试包含类别时,它们没有被识别,因为我假设我正在尝试内爆一个不存在的数组。

即如果我的特定分页链接的代码看起来像

echo " <a href='{$_SERVER['PHP_SELF']}?currentpage=1&find=$find&category=$categories'><<</a> "; 

例如,链接的结果类别部分看起来像 category=5,2,当单击时,不会返回任何结果。我认为这是因为我试图内爆 5,2 而不是表单提交的数组。

如果有人能阐明我需要做些什么才能使这项工作正常进行,将不胜感激。不确定我是否需要另一个没有内爆的字符串开始或使用 arrayslice 等来解决它。在没有成功的情况下,尽可能多地阅读。

非常感谢。

【问题讨论】:

  • 您的代码容易受到 SQL 注入攻击,并使用已弃用的 mysql_* 函数。您应该改用准备好的语句。
  • 调查准备好的语句并减轻注入攻击。

标签: php arrays pagination


【解决方案1】:

从您构建超链接的方式来看,$_GET['category'] 似乎只是一个字符串。

如果您将类别显示为 &category[]=5&category[]=2,您将收到一个数组。

但在您的情况下,最简单的技巧是完全使用 implode。因为 $_GET['category'] 已经将 "5,2" 作为字符串返回。 (考虑urlencode

现在可能有点吃不消,但也可以考虑使用prepared statements


编辑: 根据您的评论,您似乎希望使用类别数组来维护。

我会给你两种方法来实现它。


第一种方式考虑到您对超链接的使用:

$categories = [];
foreach($_GET['category'] as $cat)
{
    array_push($categories, 'category[]=' + urlencode($cat));
}

echo " <a href='{$_SERVER['PHP_SELF']}?currentpage=1&find=$find&" 
. implode('&',$categories) . "'>&lt;&lt;</a> "; 

致那些问“为什么不使用 http_build_query?”的人:关联数组只能出现一个特定键。


第二种方法是使用method="get"action="{$_SERVER['PHP_SELF']}" 的表单

然后您会将所有类别作为隐藏输入回显

$categories = [];
foreach($_GET['category'] as $cat)
{
    echo '<input type="hidden" name="category" value="' . htmlentities($cat) . '"/>'
}

然后有按钮input type="submit" value="1" name="currentpage" 然后,Web 浏览器将为您构建 URL。 表单最酷的地方在于,除非用户与之交互,否则不会将复选框和提交等输入类型发送到服务器

【讨论】:

  • 谢谢您 - 将调查准备好的陈述。我尝试在 $_GET['category'] 之前删除 implode 函数,但如果我这样做然后回显 $categories 我只会在浏览器中显示“数组”。如果我将内爆保留在那里并回显它,我确实会看到以下结构 5,2,并且我的查询仅使用这两个类别编号获得结果。浏览器还在 URL 栏中显示 &category[]=5&category[]=2。有没有办法从超链接维护 &category[]=5&category[]=2 结构,或者只能从表单帖子中完成?
  • 大约一个小时前,我终于破解了一个解决方案,该解决方案通过根据我最初是提交表单还是单击分页链接运行不同的查询来工作。我在链接中创建了一个变量,当点击它们时设置为 1,提交表单时设置为 0。这样做我可以在点击分页链接时绕过 implode 语句。您的解决方案更加优雅并且有效,所以如果我有时间的话,我会完全整合它。感谢您的时间和专业知识。
  • 我不建议使用我给您的示例来构建最终解决方案,而是将其用作垫脚石,最终达到您拥有可以通过 ajax 分页和过滤的表格的地步。我会说你是正确的,因为你看到了基本机制,即发布与获取,数据在服务器与客户端上的外观等。
猜你喜欢
  • 2016-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-29
  • 2021-11-28
  • 2012-08-27
  • 1970-01-01
  • 2021-11-21
相关资源
最近更新 更多