【问题标题】:Check if $_REQUEST url exists in database检查数据库中是否存在 $_REQUEST url
【发布时间】:2015-09-01 04:13:39
【问题描述】:

我使用$id = intval( $_REQUEST['id'] ); 来获取我网站上新闻/帖子的ID,新闻的链接是article.php?id=XXX。因此,当有人键入 ?id=1 并且没有任何内容时,它是空的,没有帖子,它应该转到索引页面(index.php)而不是显示空白页面。可能吗?我已经通过 isset 尝试了一些东西,但它没有奏效。谁能帮帮我,拜托。

if($ArticleSQL = $mysqli->query("SELECT * FROM articles WHERE id='$id' ")){
...
}

【问题讨论】:

  • else {header("Location: /");}
  • 还要小心:你在这里实现了一个 sql 注入漏洞。您想利用mysqli 提供的“准备好的语句”和“参数绑定”的优势来解决这个问题(提示:id='$id' 真的邪恶...)。
  • 我猜你有一些选择。首先:检查getisset($_GET['id'])是否存在,如果不存在,使用header("Location: index.php")。第二:通过 POST 发送 id,但这不是一个好的选择。第三:检查你是否从你的 db 得到任何回报,如果没有使用header("Location: index.php").
  • @arkascha 我正在学习,我还不知道使用准备好的语句,但我读到如果它只是数字,则不能注入 SQL。
  • @arkascha 我同意添加更多典型的 SQL 注入预防,但 OP 使用 intval 来确保输入是数字/整数。这不是典型的解决方案,但我想说 OP 意识到了威胁。

标签: php


【解决方案1】:

您可以通过$ArticleSQL->num_rows查看结果数量。

所以你的代码现在是:

$ArticleSQL = $mysqli->query("SELECT * FROM articles WHERE id='$id' ");

if($ArticleSQL->num_rows > 0) {
    $article = $ArticleSQL->fetch_array();

    //show the article here

} else {

    //redirection:
    header("Location: index.php");
}

【讨论】:

    【解决方案2】:

    您需要检查查询是否找到任何内容。您的代码只是检查查询是否成功。不返回任何行的查询不是失败。这是一个完全有效的结果集,其中恰好没有行。

    $result = $mysqli->query(...);
    if ($result->num_rows > 0) { ... found something ... }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-22
      • 2012-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多