Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php mySQL在重复密钥上插入-不知道什么不起作用_Php_Mysql_Pdo_Insert Into_On Duplicate Key - Fatal编程技术网

Php mySQL在重复密钥上插入-不知道什么不起作用

Php mySQL在重复密钥上插入-不知道什么不起作用,php,mysql,pdo,insert-into,on-duplicate-key,Php,Mysql,Pdo,Insert Into,On Duplicate Key,我只是尝试在重复键mySQL查询中插入一个INSERT来开始工作。不幸的是没有运气。 我在stackoverflow上读了很多关于这件事的帖子,我看了一下,但还是没有运气 我有一张这样的桌子: ------------------------------------------------- | id | option1 | option 2 | option 3 | option 4 | ------------------------------------------------- | 8

我只是尝试在重复键mySQL查询中插入一个INSERT来开始工作。不幸的是没有运气。 我在stackoverflow上读了很多关于这件事的帖子,我看了一下,但还是没有运气

我有一张这样的桌子:

-------------------------------------------------
| id | option1 | option 2 | option 3 | option 4 |
-------------------------------------------------
| 83 |    0     |    1     |     0    |    0    |
$this->query = $this->db->prepare("INSERT INTO myTable (id, option1, option2, option3, option4) 
VALUES (83, 0, 1, 1, 1) ON DUPLICATE KEY UPDATE id = 83");
INSERT INTO myTable(id, option1, option2, option3, option4) 
    select (case when max(id = 83) > 0 then max(id) + 1
                 else 83
            end), 0, 1, 1, 1
    from mytable;
我的Id是唯一的值,但不是自动递增的。 所有其他值都是描述某些选定选项的布尔值

我想写一个函数,如果id已经存在,则更新表;如果我有一个新id,则写一个新行

我正在使用数据库类的现有代码

$this->db = new PDO($host, $user, $password);
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
(不要问我关于setAttribute的问题。这正是代码中的内容…) 后来:

$this->query = $this->db->prepare("INSERT INTO myTable (id, option1, option2, option3, option4) 
VALUES (83, 0, 1, 1, 1) ON DUPLICATE KEY UPDATE id = VALUES(id)");
$this->query->execute();
我知道我真的不需要准备任何类似的东西。(最后我想这样做,但我不知道如何在这里完成

我没有从捕获PDO异常中得到任何错误消息,但是我无法更新我的数据库。 让我们假设所有关于连接到数据库的内容都正常(因为我可以选择数据)

我也尝试过这样的符号:

-------------------------------------------------
| id | option1 | option 2 | option 3 | option 4 |
-------------------------------------------------
| 83 |    0     |    1     |     0    |    0    |
$this->query = $this->db->prepare("INSERT INTO myTable (id, option1, option2, option3, option4) 
VALUES (83, 0, 1, 1, 1) ON DUPLICATE KEY UPDATE id = 83");
INSERT INTO myTable(id, option1, option2, option3, option4) 
    select (case when max(id = 83) > 0 then max(id) + 1
                 else 83
            end), 0, 1, 1, 1
    from mytable;

都是一样的,对吧


好的,如果有人能在这里帮助我,我将非常高兴。我一定是做错了什么…

您不希望重复键更新
。这要么插入新行,要么更新旧行。您似乎想插入新行,但在发生冲突时使用不同的id

我可以这样建议:

-------------------------------------------------
| id | option1 | option 2 | option 3 | option 4 |
-------------------------------------------------
| 83 |    0     |    1     |     0    |    0    |
$this->query = $this->db->prepare("INSERT INTO myTable (id, option1, option2, option3, option4) 
VALUES (83, 0, 1, 1, 1) ON DUPLICATE KEY UPDATE id = 83");
INSERT INTO myTable(id, option1, option2, option3, option4) 
    select (case when max(id = 83) > 0 then max(id) + 1
                 else 83
            end), 0, 1, 1, 1
    from mytable;
如果不存在,则将
83
放入表中。如果
83
存在,则将最大
id
+1放入表中


我真的不建议这样做。最好你应该有一个自动递增的id。我不认为上述逻辑在所有存储引擎中都是多用户安全的,但它可能会解决你的问题。

表上有唯一的索引吗?是的,正如我所说。我的id列是唯一的。如果我使用一个类似这样的查询,如果我打印它
$this->sql=“在重复键更新option1=VALUES(option1);”;
我得到了一个id=0,option1=1的数据库行。我想我还是有点困惑。(提到这个查询现在有绑定选项,我在后面的语句中也绑定了这些选项。我发现复制键可能会执行我的'id=VALUES(id'),并将其更改为option1=VALUES(option1)。至少我在数据库中看到了一些更改,但仍然不是正确的更改…非常感谢您的帮助。我找到了它…我使用了:$this->sql=”在重复键更新option1=VALUES(option1)上向myTable中插入('id','option1')值(83,0)“这实际上是我在你回答之前的代码。我只是在第一个括号部分犯了一个错误。有了这个代码,我在选项1上有一个更新,我的id是83,如果id 83不存在,我会得到一个插入。我想这很好。因为我想插入或更新,这正是我想要的。。。