【问题标题】:Cant escape get and use it in query无法逃脱获取并在查询中使用它
【发布时间】:2015-12-23 23:36:16
【问题描述】:

我在当前的分页中使用了一个 get 参数,它工作正常。但是,今天我碰到了 SQL 注入的想法,因此我尝试了 mysqli_real_escape_string 。当我刷新页面时,在使用该 get 参数的查询上使用 fetch_array 似乎有问题。

我得到的错误:

Fatal error: Call to a member function fetch_array() on boolean in C:\xampp\htdocs\index.php on line 106

第 106 行:

while($fetchlistquery = $Listquery->fetch_array()) {

完整代码sn-p:

// Prepare pagination
    $getPage = $LibraryUser->mysqli->real_escape_string($_GET["page"]); 
    if(isset($getPage)) { $page  = $getPage; } else { $page = 1; }; 
    $start_from = ($page-1) * 5; 

// Get articles
    $Listquery = $LibraryArticle->mysqli->query("SELECT * FROM site_articles ORDER BY id DESC LIMIT $start_from, 5");
    while($fetchlistquery = $Listquery->fetch_array()) {

更新:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-5, 5' at line 1

仅当您不在实际页面(如 ?page=1 或 ?page=2)中时才会发生这种情况。

知道如何让它工作吗?

【问题讨论】:

  • 看看mysqli_error,看看你在query调用中遇到了什么错误。
  • 试试var_dump($LibraryArticle->mysqli->error)
  • @JonStirling 您的 SQL 语法有误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 '-5, 5' 附近使用正确的语法 - 这有点奇怪,因为如果我不逃避 GET,我不会收到任何错误...
  • 听起来$page 被设置为 0(或错误)。
  • @JonStirling 更新了我的帖子。只有第 1 页出现该错误,第 2 页和转发工作正常...

标签: php mysqli pagination


【解决方案1】:

在执行查询之前尝试检查$page 的值。并避免使用 *,使用正确的列名。

if ($start_from >= 0)
    $query = "SELECT * FROM site_articles ORDER BY id DESC LIMIT $start_from, 5";
else
    $query = "SELECT * FROM site_articles ORDER BY id DESC LIMIT 0, 5";

// Get articles
    $Listquery = $LibraryArticle->mysqli->query($query);
    while($fetchlistquery = $Listquery->fetch_array()) {

【讨论】:

  • 验证$start_from
  • 啊,我验证了 $start_from,如果它低于 0,则将其设置为 0!谢谢!
  • 如果$_GET['page']'=0 then $start_page' 是(0-1)*5 = -5。如果$_GET['page']'=1 this is $start_page = (1-1)*5 = 0`。 if $_GET['page']'=2 then $start_page = (2-1)*5 = 5` 如果您没有根据上述等式获得价值,请尝试 var_dump 不同级别的值。
【解决方案2】:

您在错误的地方使用了isset() 函数。您应该首先检查是否设置了$_GET['page']
$LibraryUser->mysqli->real_escape_string($_GET["page"]) 在没有$_GET['page'] 时返回"",然后将其设置为$getPage 的值。所以你的isset($getPage) 总是TRUE,这是主要问题。首先修复它,它会工作。

if(isset($_GET["page"])) {
   $getPage = $LibraryUser->mysqli->real_escape_string($_GET["page"]); 
} else {
   $getPage = 1;
}
$page =  $getPage;

【讨论】:

    猜你喜欢
    • 2021-10-22
    • 1970-01-01
    • 2021-04-14
    • 2019-12-25
    • 2016-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多