【问题标题】:mysql query safe limitmysql查询安全限制
【发布时间】:2015-09-22 16:39:43
【问题描述】:

我在这方面非常缺乏经验,所以这似乎是一个愚蠢的问题,但请多多包涵。

得到一个mysql DB 和一个查询,通过PHP PDO 看起来像这样:

SELECT p.*, group_concat( distinct c.color) as color, b.breeder_puppy_thumb , b.breeder_name
FROM puppy_list p 
JOIN puppies_join_colors pjc ON p.ID = pjc.puppy_ID 
JOIN puppy_colors c ON c.ID = pjc.color_ID 
JOIN breeder_list b ON b.ID = p.puppy_breeder_id 
WHERE p.puppy_breed = :breedName
GROUP BY p.ID
ORDER BY p.price DESC

ORDER BY 子句可以变化(可以按不同的字段排序)。

我通过AJAX 将此查询发送到PHP 文件,该文件将其发送到数据库服务器 - 所以往返,4 跳

在我的网站中,有分页,它是即时完成的,所有数据都以大 JSON 对象的形式存储在内存中 - 并且处理是在前端框架中的这个 JSON 对象上完成的(基于angularJS - 分页),无需再次查询数据库。

我的第一个问题是:给定这样的查询,返回的行数为数千(数万),对单个查询设置什么安全限制?我应该返回多少行,这样我才不会过度杀伤客户?

我的第二个问题是:我应该将部分处理从 angular 转移到后端框架还是像这样继续?

如果我的问题表述得不够好,请告诉我,我会尽力解决。

【问题讨论】:

  • 您喜欢的网站是如何做到的?默认分页 50 但可由用户调整?拥有尽可能多的服务器端。这里有很多分页示例
  • @DrewPierce 很难说。唯一比较的网站(据我所知)是 airbnb.com - 似乎他们在每个页面请求上都对数据库进行查询 - 我试图避免对每个请求执行一个,但可能是 40 步(寻找最大的安全数)。所以第 1 页、第 40 页、第 80 页 .. 将获得下一个数据块。
  • 在 s.o. 上查看 url 参数。 (我相信你有)
  • 服务器:LIMIT {[offset,] row_count ...
  • @DrewPierce 不完全适用。我正在开发的网站需要表现得(感觉)像一个单页应用程序 - stackoverflow 有部分类似的行为。意思是,当我优化我的网站时,我试图尽可能少地推动来回请求,因此为什么我在想我可以逃脱的返回数据的限制是什么——类似的事情。跨度>

标签: php mysql json angularjs


【解决方案1】:

@Radu Andrei,Drew Pierce 有一些有效的观点。

关于你的第一个问题 => 你可以做 Facebook 目前使用的“无限滚动”。这是一种显示分页的奇特方式。当用户到达底部或显示“加载更多”按钮时加载更多结果。 在此处查看示例:http://www.w3bees.com/2013/09/jquery-infinite-scroll-with-php-mysql.html

关于第二个问题 => 一个好的编程解决方案是让后端和前端都能正常工作,以防用户禁用 java 脚本。但是,现在默认启用 js。我会说保留 JS 前端并编程后端。你永远不知道用户禁用了什么。在执行此操作时始终牢记移动设备,他们可能不会欣赏每页 1000 个项目,尤其是现在,我们几乎所有的浏览都在移动设备上。

【讨论】:

  • 第一点——设计限制防止无限滚动。第二点——如果用户禁用了 JS,网站就会中断,因为它是基于 AngularJS 构建的。
猜你喜欢
  • 2017-03-31
  • 1970-01-01
  • 2010-09-14
  • 2011-02-20
  • 1970-01-01
  • 1970-01-01
  • 2019-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多