【问题标题】:How to create a Profile URL for a user using $_GET['id']如何使用 $_GET['id'] 为用户创建个人资料 URL
【发布时间】:2010-08-04 14:44:22
【问题描述】:

如果我正确执行以下步骤,有人可以告诉我:

当用户想要在网站上注册时,register.php 会处理他/她的请求。下面是来自register.php的部分代码:

$sql="INSERT INTO Members (fldFullName, fldEmail, Password, Gender, DOB)
VALUES
('$fname','$email','$pass', '$gender', '$date')";

特别是当我编写上面的代码时,我对 PHP/MySQL 有点陌生,现在仍然是。因此,我通过 phpmyadmin 在表格中手动创建了上述所有字段。此外,我还通过 phpmyadmin 手动添加了 ID 字段,作为带有 auto incrementprimary key 的第一个字段。为什么我手动做,我不记得原因。但我很确定这可能是我遇到问题的原因。

我想要做的是,当用户在网站上注册时,我希望为他/她创建一个个人资料 URL。例如,表中的字段可以命名为ProfileURL,而实际值可以是http://www.domain.com/profile.php?id=1,其中id 继承自表中的实际ID。我怎样才能用上面的代码做到这一点?当我决定通过 phpmyadmin 手动保存所有字段时,我做错了什么吗?注意:我也一直在通过 phpmyadmin 手动创建表、数据库和字段。但是,它的值当然是INSERTed。我是否走在正确的轨道上?

谢谢。

【问题讨论】:

    标签: php mysql get


    【解决方案1】:

    如上所述,您无需将配置文件 URL 保存到数据库中。我猜所有的个人资料 URL 都会遵循某种标准形式(即www.example.com/profile.php?id=1)?

    好吧,如果您将所有这些都保存在数据库中,然后您决定将格式更改为 www.example.com/profile/1 之类的格式,那么您的数据库中将会有很多过时的数据。您将不得不遍历每条记录并对其进行更新,这对于具有数百万行的数据库表可能很危险。

    因此,解决方案是有一个带参数的脚本。说profile.php。如上所述,您将使用 $_GET 数组中的数据检查配置文件:

    <?php
    if (isset($_GET['id'])) {
        $id  = mysql_real_escape_string($_GET['id']);
        $sql = "SELECT * FROM members WHERE id = '$id' LIMIT 1";
        $res = mysql_query($sql);
        if (mysql_num_rows() > 0) {
            $member = mysql_fetch_object($res);
            // handle displaying of member's profile here
        }
        else {
            // member does not exist with ID
        }
    }
    ?>
    

    这样,如果您决定更改脚本名称或使用搜索引擎友好的 URL,则无需更改数据库结构。

    【讨论】:

      【解决方案2】:

      profile.php 中,检查$_GET['id'],如果存在,使用SELECT 查询数据库中的相同ID。它看起来像这样。

      <?php
      if (isset($_GET['id']))
      {
          $id = (int) $_GET['id'];
          $sql = 'SELECT * FROM Members WHERE ID = ' . $id;
      
          // Then the rest of the code to check the results goes here
      }
      ?>
      

      ID 为 1 的用户是profile.php?id=1

      【讨论】:

        【解决方案3】:

        你做得对。现在这样写 SQL:

        $sql = sprintf("SELECT * FROM Members WHERE ID=%d", mysql_real_escape_string($_GET['id']));
        

        您将能够通过 $_GET['id'] 获取用户数据。请记住使用 mysql_real_escape_string 来保护您的查询免受 SQL 注入。 sprintf 也是替换正确数据类型(如数字或字符串)的好方法。

        【讨论】:

        • 这里的 mysql_real_escape_string 是什么?
        • 转义值并使其对查询安全,尽管sprintf() 函数会根据%d 分隔符自动检查参数是否为数字。
        • @col.弹片以防止 SQL 注入攻击。由于使用 index.php?id=1 并依赖 $_GET['id'] = 1 作为值,如何阻止站点用户将 ?id=1 更改为恶意内容。见:unixwiz.net/techtips/sql-injection.html
        • @Chris 有趣的链接,但他们没有说明 mysql_real_escape_string 在这种特殊情况下如何提供帮助。你能解释一下吗?它是如何工作的
        • escape_string 函数对给定文本字符串中的字符进行转义以“清理”它们。该链接是关于 sql 注入的,转义字符串是一种使给定字符串 $_GEt['id']=1 安全发送到 MySQL db 进行处理的方法。如果它没有被转义,您可以让用户将 id=1 更改为 id="" 这将在您的服务器上执行,而不是您想要的查询,即在数据库中查找 id=1 的人.
        【解决方案4】:

        您不注意保存个人资料网址。
        您必须动态构建它。
        因为大部分 url 保持不变,只有 id 正在改变。
        因此,从数据库中获取 id 并将其添加到 url。

        【讨论】:

          猜你喜欢
          • 2013-08-25
          • 1970-01-01
          • 1970-01-01
          • 2010-12-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多