【问题标题】:Updating a mysql database [closed]更新mysql数据库[关闭]
【发布时间】:2013-08-04 09:54:39
【问题描述】:

我正在尝试编辑 Mysql 数据库。谁能告诉我为什么这不起作用,它没有更新任何东西

mysqli_query($con,"UPDATE Users SET day_started=1 WHERE email='$user_data['email']'");

$user_data['email'] 工作我检查了它。我尝试回应它,它确实回应了我想要的价值。我还检查了数据库以及电子邮件字段中我想要的值。

感谢您的帮助:)

【问题讨论】:

  • mysqli_error() 说什么?您是否回显了查询以确保它是正确的?你有没有从命令行运行它?您确定有符合该条件的行吗?
  • $con 是正确的连接处理程序吗?
  • 由于email='$user_data['email']'可能会出现#1064错误
  • 使用准备好的/参数化的查询。您正在向 SQL 注入攻击敞开大门。

标签: php mysql


【解决方案1】:

这是因为单引号匹配最接近它的。 所以在您的代码email='$user_data['email']' 中,'$ 中的第一个单引号恰好与 ['email 中的单引号匹配。为了避免这种情况,您可以像这样修改您的 sql 代码:

"UPDATE Users SET day_started=1 WHERE email='$user_data[email]'",this really works.

或者只是这样做:

$post_email = $user_data['email'];
"UPDATE Users SET day_started=1 WHERE email='$post_email'";

【讨论】:

    【解决方案2】:

    这不起作用的原因是因为您在字符串中使用了数组的一部分。为此,您有几个选择:

    1. 在它周围使用花括号:

      "UPDATE Users SET day_started=1 WHERE email='{$user_data['email']}'"

    2. 串联:

      "UPDATE Users SET day_started=1 WHERE email='".$user_data['email']."'"

    3. 使用临时变量:

      $email = $user_data['email'];

      然后在你的字符串中:

      "UPDATE Users SET day_started=1 WHERE email='$email'"

    4. (奖金,我自己刚学会的)删除email周围的引号:

      "UPDATE Users SET day_started=1 WHERE email='$user_data[email]'"

      这确实让我感到惊讶,并且不会发出通知/警告。但是,以下确实会产生通知,所以要小心(它需要在双引号字符串中,或​​者可能是 heredoc):

      echo $user_data[email];

      注意:使用未定义的常量电子邮件 - 假定为“电子邮件”

    但是,即使您提出这个问题,也会带来一些很大的问题。首先,您应该打开error_reporting。因此,如果发生任何错误,如果一切顺利,它就会对你大喊大叫。其次,你应该do the same for mysqli。最后,如果您使用 mysqli,请使用 prepared statements。这正是他们的目的。

    【讨论】:

    • 我确实尝试过使用临时变量,但没有成功
    • 您需要更具体地了解“不起作用”的含义。但就像我在回答中所说的那样,准备好的陈述是要走的路。严重地。忘记做任何其他方式。
    【解决方案3】:

    试试这个:

    $user_email = mysqli_real_escape_string($con, $user_data['email']);
    
    mysqli_query($con,"UPDATE `Users` SET `day_started`='1' WHERE `email`='".$user_email."'");
    

    我怀疑答案在于您没有在查询字符串中正确嵌入 PHP 变量。查看$user_email 两侧的性感句号。当您这样做时,PHP 会喜欢它。

    我还清理了您的输入和内容,并用反引号格式化了您的查询,因为 PHP 也喜欢这样做。

    【讨论】:

    • 这并不能真正回答问题。问题是“谁能告诉我为什么这不起作用”。