【问题标题】:PHP MySQLi Pagination LIMIT, WHERE and ORDER BY `date` DESC problemsPHP MySQLi 分页限制、WHERE 和 ORDER BY `date` DESC 问题
【发布时间】:2017-07-06 22:28:20
【问题描述】:

我正在创建非盈利项目,并且存在分页问题。第一个想法是“加载更多”

  MySQLi connection:


$mysqli = new mysqli('localhost','root','','tablename');
if ($mysqli->connect_error) {
    die('Error : ('. $mysqli->connect_errno .') '. $mysqli->connect_error);
}
/* Change character set to utf8 */
if (!$mysqli->set_charset("utf8")) {
    printf("Error loading character set utf8: %s\n", $mysqli->error);
    exit();
}

  Paggination:

  $items_per_page = 5;  
  $login = $_SESSION['login'];
  $per_page = $items_per_page;
  if (isset($_GET['page'])) {
  $page = $_GET['page'];
  }else {
  $page = 1;
  }
  $start_from = ($page-1) * $per_page;
  //Selecting the data from db   
  $date = $mysqli->query("SELECT post_id FROM posts WHERE posts_author = '.$login.' ORDER BY `date` DESC LIMIT $start_from, $per_page");
  while($row = $date->fetch_array()){
  echo $row["post_id"];
  }
  //



  //Select all from DB
  $query = $mysqli->query("SELECT post_id FROM posts WHERE posts_author='$login' ORDER BY date DESC");
  $result = mysqli_query($mysqli, $query);
  $total_records = mysqli_num_rows($result);
  $total_pages = ceil($total_records / $per_page);
  //Going to first page
  echo '<a href="' .ABSOLUTE_URL. '/post/1">first page</a> '; 
  for ($i=1; $i<=$total_pages; $i++){
  echo '<a href="' .ABSOLUTE_URL. '/post/'.$i.'">'.$i.'</a> ';
  };
  // Going to last page
  echo '<a href="' .ABSOLUTE_URL. '/post/'.$total_pages.'">last page</a> ';

【问题讨论】:

  • “这也可以通过使用 SQL 注入来利用?”——当然可以。为什么你甚至要问这个——你没有读过 SQL 注入的问题到底是什么吗?如果您费心去理解这一点,您就会知道所示代码是易受攻击的。 “如何修复此代码?” – 肯定不是,只需将其转储到此处,以便我们首先找出问题所在。请去阅读How to Ask,然后给我们一个正确的问题描述。
  • 我看不出投反对票的原因,他在那边寻求一点帮助,我猜你们所有人投反对票只是为了寻找徽章..
  • 在选择所有记录后,不要执行mysqli_num_rows($result);,而是执行SELECT COUNT(1) FROM posts WHERE posts_author=? 并获得结果。这也是开始使用参数化查询和准备好的语句的好地方。因为您的代码很容易迁移到使用它,您不必担心 SQL 注入。

标签: php mysqli pagination


【解决方案1】:

您的代码可以被利用, 你应该考虑使用mysqli_real_escape_stringhttp://php.net/manual/en/mysqli.real-escape-string.php

对于错误,我在这里看到它:

//Selecting the data from db   
  $date = $mysqli->query("SELECT post_id FROM posts WHERE posts_author = '.$login.' ORDER BY `date` DESC LIMIT $start_from, $per_page");
  while($row = $date->fetch_array()){
  echo $row["post_id"];
  }

'.$login.' 使用带点的单引号而不是双引号,您的查询应该可以正常执行。

如果您遇到其他问题,请更新答案您在哪里卡住了,什么不起作用以及您尝试了什么。

【讨论】:

    猜你喜欢
    • 2015-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    相关资源
    最近更新 更多