【问题标题】:php url parametersphp url 参数
【发布时间】:2008-11-19 06:18:30
【问题描述】:

我在我的网站上工作,我正在尝试获取 url 参数“page”,它是一个整数,它告诉在 MySQL 数据库中读取哪个条目,该数据库保存所有页面的 HTML。这是我的代码,出于安全原因删除了 MySQL 用户名和密码:

  if ($_GET["page"]) {
  $con = mysql_connect("localhost","username","password");
  if (!$con)
  {
    die('Could not connect: ' . mysql_error());
  }
  mysql_select_db("jmurano_pages", $con);
  $title=mysql_query("SELECT title FROM pageContent WHERE pageID=" . $_GET['page']);
  echo "<title>" . $title . "</title>\n";
  echo "</head>\n";
  echo "<body>\n";
  $content = mysql_query("SELECT content FROM pageContent WHERE pageID=" . $_GET['page']);
  echo $content;
  echo "\n</body>\n</html>";
}

这会将标题设置为“资源 ID #2”,将内容设置为“资源 ID #3”。我想不出我做错了什么。


我还是一头雾水。我是一个完整的 PHP 新手。我究竟需要做什么才能访问内容和标题?

【问题讨论】:

标签: php mysql


【解决方案1】:

除了注入漏洞(见 John 的回答),您应该使用 mysql_query 获取标题

 $res = mysql_query("SELECT title FROM pageContent WHERE pageID=" . $escapedpage);
 $title = mysql_fetch_assoc($res);
 $title = $title['title']
 $res2 = mysql_query("SELECT content FROM pageContent WHERE pageID=" . $escapedpage);
 $content = mysql_fetch_assoc($res2);
 $content = $content['content'];

但是我认为如果您遵循在线 mysql php 教程将是明智的。

编辑
更好的是像这样使用 1 mysql_query:

$res = mysql_query("SELECT title, content FROM pageContent WHERE pageID=" . $escapedpage);
$row = mysql_fetch_assoc($res);
$title = $row['title'];
$content = $row['content'];

这将节省您的脚本时间和资源,因为只需要一个 mysql 查询。
这个教程还不错:http://www.freewebmasterhelp.com/tutorials/phpmysql

【讨论】:

  • 是的,应该可以解决它。 OP 没有从资源中获取数据,而是使用 $content 资源句柄作为变量。句柄是一个难以掌握的概念,但它们肯定很有帮助。 :)
【解决方案2】:

你显然有很多东西要学(我们都必须从某个地方开始!),所以关于 SO 的单一答案将无法教会你一切,但这里有一个初学者:

当您在 SELECT 查询上运行 mysql_query 时,它将返回以下两种情况之一:

  • 如果您的查询中有错误,它将返回 false
    • 有关此错误的详细信息,请致电mysql_error()
  • 如果查询正常,它将返回一个资源
    • 使用此资源,您可以调用其他 mysql 函数来查找有关您刚刚使用 SELECT 创建的数据集的信息。
    • mysql_fetch_assoc() 将从您的查询中返回一行的关联数组。
      • 这样做可以看到:$row = mysql_fetch_assoc($resource); print_r($row);
    • 再次调用它以检索下一行。
    • 当没有更多行时,mysql_fetch_assoc() 将返回 false。
      • 因此您可以编写这样的循环:
        while ($row = mysql_fetch_assoc($resource)) { // do stuff }

【讨论】:

    【解决方案3】:

    您应该在一个查询中检索两个字段,因为这样可能会更快。还假设 pageID 始终是整数,您应该首先将其转换为整数以防止 SQL 注入。我会使用类似的东西:

    <?php
    if (isset($_GET["page"])) {
        $con = mysql_connect("localhost","username","password");
        if (!$con) {
            die('Could not connect: ' . mysql_error());
        }
        mysql_select_db("jmurano_pages", $con);
    
        $pageId = (int) $_GET['page'];
    
        $result = mysql_query('SELECT title, content FROM pageContent WHERE pageID= ' . $pageId);
    
        if (!$result) {
            die(mysql_error());
        }
    
        $row = mysql_fetch_assoc($result);
    
        if (!$row) {
            die('page not found');
        }
    
        echo "<title>" . $row['title'] . "</title>\n";
        echo "</head>\n";
        echo "<body>\n";
        echo $row['content'];
        echo "\n</body>\n</html>";
    
    } else{ 
        //what are you going to do if page is not passed?
    }
    ?>
    

    注意

    • 您可能希望将数据库连接代码放在一个单独的位置,这样您就不必将它复制到多个页面上
    • 您可能应该阅读有关 SQL 注入以及如何保持 HTML 和 PHP(表示和逻辑)分离的一些方法,否则您可能会得到非常混乱的代码

    【讨论】:

      【解决方案4】:

      这是一些伪代码。

      $result = mysql_query($sql);
      
      //for each row in the result, do stuff with it...
      while ($row = mysql_fetch_array($result)){
        $title = $row["title"];
        $content = $row["content"];
      
        //this will show you the row data visually
        //var_dump($row);
      }
      

      作为 PHP 新手,学习调试(必要时使用 var_dump)、阅读文档和阅读教程。

      另外,网上也有海量的php+mysql教程...google "php and mysql"

      祝你好运!

      【讨论】:

        【解决方案5】:

        另外,您有一个 SQL 注入漏洞...永远不要将 $_GET、$_POST 或其他用户提供的变量直接放入查询中。

        你应该这样做:

        $page = $_GET["page"];
        $escaped_page = mysql_real_escape_string($page);
        

        并将 $escaped_pa​​ge 放入您的查询中。

        【讨论】:

        • 甚至更好: $page = isset($_GET["page"]) ? intval($_GET["page"]) : -1;
        • 这是个好建议,但我不赞成,因为它甚至没有尝试回答这个问题。
        【解决方案6】:

        还有一件事..您可以在一个查询中同时选择标题和内容:

        选择标题,内容来自 ....

        【讨论】:

          【解决方案7】:

          您应该阅读手册http://de.php.net/mysql_query

          返回值

          对于SELECTSHOWDESCRIBEEXPLAIN 和 其他返回结果集的语句, mysql_query() 成功返回资源, 或 FALSE 错误。

          对于其他类型的 SQL 语句, INSERT, UPDATE, DELETE, DROP, 等等, mysql_query() 成功时返回 TRUE,错误时返回 FALSE。

          返回的结果资源应该传递给mysql_fetch_array(), 和其他处理结果表的函数,以访问返回的数据。

          【讨论】:

            猜你喜欢
            • 2010-12-19
            • 2023-03-08
            • 2020-11-26
            • 2011-05-12
            • 2011-11-06
            • 2016-03-31
            • 2018-04-17
            • 2017-04-22
            • 2013-07-13
            相关资源
            最近更新 更多