【问题标题】:PHP MySQL - INSERT and ON DUPLIATE KEY UPDATE with WHERE?PHP MySQL - INSERT 和 ON DUPLICATE KEY UPDATE 与 WHERE?
【发布时间】:2015-10-01 21:58:27
【问题描述】:

我希望会员能够在他们的个人资料中添加更多信息(位置、故事),并在需要时更新他们的密码。

为此,我使用以下 sn-p:

$query = mysql_query("
    INSERT INTO 
        members (location, story) 
    VALUES 
        ('$location', '$story') 
    WHERE 
        username='$user' 
    ON DUPLICATE KEY UPDATE 
        hash = '$password', 
        location='$location', 
        story='$story' 
    "); 

这不适用于“WHERE”部分,但如果我将其删除,则数据只会填充到空记录中,而不是用户记录。如何正确使用此 sn-p 中的 WHERE 部分,从而更新正确的用户配置文件?

我在互联网和这个网站上上下搜索过,但没有找到一个单一的解决方案,这让我很惊讶,因为这似乎是一个很常见的问题?

有人知道如何解决这个问题吗?

提前致谢!

【问题讨论】:

  • WHERE 在此上下文中无效。为了使ON DUPLICATE KEY 工作,username 字段要么需要是主键,要么是UNIQUE 索引。 dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
  • 为什么不在插入前使用触发器?
  • id 是主要的,用户名是唯一的,但我使用 WHERE 和会话 id ($user = $_SESSION['Username'];)

标签: php mysql where insert-into on-duplicate-key


【解决方案1】:

首先,mysql 已弃用,您应该使用mysqli

其次,请确保在将值输入查询之前对其进行转义。 mysql_real_escape_string() 是最低要求。

第三,INSERT/ON DUPLICATE KEY UPDATE不接受WHERE子句。 它的用途是避免重复键。 对于简单的用户注册或其他任何事情,您可以避免使用 ID/自动增量并使用 username 作为主键。但为此,您需要 MyISAM 或 MySQL 5.6+ 才能进行全文索引,一般来说,这是推荐的。

但在这个用例中,您的位置和故事总是会被覆盖。 如果这是您想要的,您可以尝试我在上一段中写的任何内容。

【讨论】:

  • 我在所有东西上都使用“mysql_real_escape_string”...这不是问题...问题是它不会更新现有记录而是添加新记录,因为我不能使用 WHERE....
  • 正如我所说,除非使用用户名PRIMARY KEY,否则您将无法实现您想要的。此外,即使那样,您也必须在是否提供密码之前检查是否提供了密码,如果没有,请避免插入密码,以免“重置”人们的密码,而不会更新您所说的故事。
【解决方案2】:

您可以使用 INSERT INTO ... SELECT FROM ... ON DUPLICATE KEY UPDATE 结构,例如

INSERT INTO 
    members (location, story) 
SELECT '$location', '$story'
FROM table_name
WHERE username='$user' 
ON DUPLICATE KEY UPDATE 
    hash = '$password', 
    location='$location', 
    story='$story'

【讨论】:

  • 谢谢拉胡尔,我很想尝试您的解决方案,但不幸的是,这也不起作用....我没有收到错误,它只是对数据库没有任何作用所有...
【解决方案3】:

好的,我终于能够自己解决这个问题了。有兴趣的可以看一下代码:

// if user entered location         
        if (!empty($_POST['location']))
        {
            // if database row empty
            if ($row['location'] == " ")
            {
                mysql_query("INSERT INTO members (location) VALUES ('".$location."') WHERE username='".$user."'");  
            }
            // if database row not empty
            else 
            {
                mysql_query("UPDATE members SET location='".$location."' WHERE username='".$user."'");      
            }
        }
        // if user entered story
        if (!empty($_POST['story']))
        {
            // if database row empty
            if ($row['story'] == " ")
            {
                mysql_query("INSERT INTO members (story) VALUES ('".$story."') WHERE username='".$user."'");    
            }
            // if database row not empty
            else 
            {
                mysql_query("UPDATE members SET story='".$story."' WHERE username='".$user."'");            
            }
        }           

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-07
    • 2020-07-15
    • 1970-01-01
    • 2011-08-09
    • 2023-02-06
    • 2017-09-01
    • 2011-10-22
    • 1970-01-01
    相关资源
    最近更新 更多