gpt4 book ai didi

php - 如何在同一查询中同时使用 ON DUPLICATE KEY 和 REPLACE INTO ?

转载 作者:行者123 更新时间:2023-11-29 11:32:41 25 4
gpt4 key购买 nike

我有一个这样的表:

// AcceptedAnswer
+----+---------+-------------+-----------+
| id | user_id | question_id | answer_id |
+----+---------+-------------+-----------+
| 1 | 123 | 4335345 | 3342434 |
| 2 | 345 | 4565546 | 3443565 |
+----+---------+-------------+-----------+

// user_id : the id of that person who is author of question

此外,我在这三列上有一个唯一索引组:(user_id,question_id,answer_id)

分三种情况:

  • 当没有任何可接受的答案并且 OP (user_id) 想要接受答案时。
  • 当答案已被接受并且 OP 想要撤消它时。
  • 当有一个已接受的答案并且 OP 想要将其更改为另一个答案时。

我的脚本也适用于前两种情况。但它不适用于第三种情况。我怎样才能实现它?

这是我的脚本:

try {

// DB connection here

// This SELECT statement validates whether user_id is the author of the question
$stmt = $db_con->prepare("INSERT INTO AcceptedAnswer(user_id, question_id, answer_id)
SELECT ?,?,?
FROM questions q
WHERE q.id = ? and q.author_id = ? limit 1;");

$stmt->execute( array( $_SESSION["Id"], $question_id, $answer_id,
$question_id, $_SESSION["Id"] ) );


} catch(PDOException $e) {

// undo acceptance
if ((int) $e->getCode() === 23000) {
$stmt = $dbh_conn->prepare(" DELETE FROM AcceptedAnswer
WHERE user_id = ? AND
question_id = ? AND
answer_id = ? ");
$stmt->execute(array($_SESSION["Id"], $question_id, $answer_id));

}
<小时/>

例如: (基于上表)

当我通过这个:(123, 4335345, 2353423) (更改接受的答案),预期输出:

// AcceptedAnswer
+----+---------+-------------+-----------+
| id | user_id | question_id | answer_id |
+----+---------+-------------+-----------+
| 1 | 123 | 4335345 | 2353423 |
| 2 | 345 | 4565546 | 3443565 |
+----+---------+-------------+-----------+

当我通过这个:(345, 4565546, 3443565) (撤消接受的答案),预期输出:

// AcceptedAnswer
+----+---------+-------------+-----------+
| id | user_id | question_id | answer_id |
+----+---------+-------------+-----------+
| 1 | 123 | 4335345 | 2353423 |
+----+---------+-------------+-----------+

最佳答案

首先,您不能组合这两个查询,因为它们是互斥的。

此外,您似乎根本不需要 REPLACE INTO。

事实上,您只需要两个查询,一个是 INSERT 和 ON DUPLICATE 来接受任何答案,一个是删除 - 不接受。

此外,我不会使用异常处理,而是仅使用一个简单的条件来查看是否接受或不接受从表单发送的消息。

请注意,您的 if 条件中应该有一个 else 子句,位于 catch block 中,以便重新抛出异常(如果不是预期的异常)。

关于php - 如何在同一查询中同时使用 ON DUPLICATE KEY 和 REPLACE INTO ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37130082/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com