作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个这样的表:
// 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)
。
分三种情况:
user_id
) 想要接受答案时。我的脚本也适用于前两种情况。但它不适用于第三种情况。我怎样才能实现它?
这是我的脚本:
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/
我是一名优秀的程序员,十分优秀!