【问题标题】:inserting variable into database with php用php将变量插入数据库
【发布时间】:2011-12-29 18:58:08
【问题描述】:

我正在编辑用户登录系统的一部分,但我对一个问题感到非常困惑。我试图允许用户使用他们的电子邮件作为查找参考来更改他们的用户名。由于某种原因,我无法正确设置 $email 变量。当我将变量 $email 更改为我知道在我的数据库中的地址时(意味着我删除 $email 并将其更改为存在的地址),用户名已正确更改。当我把它换回 $email 时,什么也没有发生。

奇怪的是,当我回显 $email 时,会显示正确的电子邮件地址。我不明白为什么它不会让我这样做,尽管它得到了正确的回响。尽管显示了电子邮件地址,但是否可能不是字符串?

我了解 sql 注入。我现在只是想让代码尽可能简单,这样我就可以先让功能正常工作。

<?
if (isset($_POST['submit'])) {
    $email = $user->get_email($username);
    $newuser = $_POST['newusername'];
    $server = 'localhost';
    $usern = 'root';
    $pass = '';
    $connection = mysql_connect($server, $usern, $pass) or die(mysql_error());
    mysql_select_db(testdb, $connection) or die(mysql_error());
if(isset($username)) {
    mysql_query("UPDATE users SET username='$newuser' WHERE email = '$email'") or    die(mysql_error());
}
}
?>

另外,当我更改查询语句以使参考值为用户 ID 时,用户名被正确插入。由此我知道 $email 没有正确设置。

mysql_query("UPDATE users SET username='$newuser' WHERE userid = '$userid'") or    die(mysql_error());

【问题讨论】:

  • 为什么不使用WHERE 中的id 字段?这不仅更简单,而且更安全、更快捷。
  • 这里到处都是SQL注入!请清理您的输入!
  • 这就是我要做的。我只是想弄清楚为什么电子邮件不起作用。这真的让我很烦恼,将来可能会对我有所帮助。
  • @user1104854 再次嗨。请不要在 Stack Overflow 上重新提问。它很可能作为副本关闭。相反,请编辑您之前的问题以澄清它。这样做会将其移动到活动问题中,并且会再次被其他人看到。
  • 迈克尔,我试图删除该帖子,但我不得不标记它并要求版主删除它。我发现了这个问题的一部分,但我觉得添加更多只会导致更多的混乱和更少的找到原因的机会。

标签: php mysql function object


【解决方案1】:
if(isset($username)) {
    mysql_query("UPDATE users SET username='$newuser' WHERE email = '$email'") or die(mysql_error());
}

您在代码的哪个位置设置了$username 变量?如果未设置,您的更新将不会运行。您可能应该返回并检查您的变量名称,并确保它们在整个页面的其余部分保持一致(并设置)。

【讨论】:

  • 我没注意到,但是改成$​​newuser还是不影响结果。
【解决方案2】:

听起来您的 get_email() 函数返回了错误的地址。 您确定您的身份验证系统在所有其他方面都正常工作吗?

当你这样做时会发生什么:

echo "UPDATE users SET username='$newuser' WHERE email = '$email'";

此外,您还需要清理 $newuser 的输入以避免 SQL 注入。就像其中一位 cmets 所说,您应该使用用户 ID 而不是电子邮件。我不确定您使用的是什么身份验证类,但您应该能够找到类似 $user->returnID() 的内容并使用它进行更新。

【讨论】:

  • 我明白了,我将使用 userid 作为参考。本来我是这样的,意识到我应该用ID,现在我只是烦我不知道为什么我不能用电子邮件。
【解决方案3】:

无论如何建议添加

$email = mysql_real_escape_string($email);

也许这就是问题

【讨论】:

    【解决方案4】:

    我应该使用以下内容:

    <?
    if ($_SERVER['REQUEST_METHOD'] == 'POST') {
        $email = $user->get_email($username); // where does $username come from anyway? and where are you initiating the $user object?
        $newuser = $_POST['newusername'];
        $server = 'localhost';
        $usern = 'root';
        $pass = '';
        $connection = mysql_connect($server, $usern, $pass) or die(mysql_error());
        mysql_select_db(testdb, $connection) or die(mysql_error());
        if(isset($newuser)) {
            $newuser = mysql_real_escape_string($newuser);
            $email = mysql_real_escape_string($email);
            mysql_query("UPDATE users SET username='" . $newuser . "' WHERE email = '". $email ."'") or    die(mysql_error());
        }
    }
    ?>
    

    mysql_real_escape_string() 创建一个新字符串。它将转义字符,这些字符在放入时可能会损坏您的数据库。(称为:SQL 注入)

    有关 SQL 注入的示例,可让您了解它是什么,以及如何使用和保护它: http://www.unixwiz.net/techtips/sql-injection.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-09
      • 2017-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多