我的MySQL查询有点问题。我正在使用PDO查询,现在只需将值插入表中(见下文):
$stmt = $dbh -> prepare("INSERT INTO tmp (user_id, test_id, question_id, answer_id) VALUES (?, ?, ?, ?)");
$stmt -> bindParam(1, $_SESSION['UserID']); // binds parameter for user id
$stmt -> bindParam(2, $_GET['start_test']); // binds parameter for test id
$stmt -> bindParam(3, $_POST['question']); // binds parameter for selected answer
$stmt -> bindParam(4, $_POST['select_answer']); // binds parameter for selected answer
$stmt -> execute();
tmp
表结构如下:
CREATE TABLE IF NOT EXISTS `tmp` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`test_id` int(11) NOT NULL,
`user_id` int(11) NOT NULL,
`question_id` int(11) NOT NULL,
`answer_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
)
我想插入answer_id
值,如果它不在那里并同时检查user_id,否则只是更新,例如:
我有两个user_id = 1和user_id = 2的用户,他们正在回答问题并且每个学生的每个答案都单独存储。 User_id = 1选择answer_id = 3而user_id = 2选择了answer_id = 3.然而,一个用户意识到这是一个错误的答案,并希望将其更改为另一个(假设answer_id = 2),我希望查询更新当前answer_id = 3 WHERE user_id = 1 to answer_id = 2
答案 0 :(得分:2)
你可以为INSERT IGNORE
创建一个{{1}},它看起来更简单,并且在某些问题上会是原子的。
步骤就像
在(user_id,question_id,answer_id)
上创建唯一索引ALTER TABLE tmp add index user_qn_ans_idx(user_id,question_id,answer_id);
现在只需执行插入操作,也可能重复更新密钥
INSERT INTO tmp(user_id,question_id,answer_id)值 (,) ON DUPLICATE KEY UPDATE answer_id = VALUES(answer_id)
答案 1 :(得分:0)
添加选择计数并执行以下条件:
$stmt = $dbh->prepare("SELECT count( 1 ) FROM tmp WHERE user_id = :user_id AND question_id = :question_id and answer_id = :answer_id");
$stmt->bindValue( 'user_id', 1 );
$stmt->bindValue( 'question_id', 1 );
$stmt->bindValue( 'answer', 1 );
$stmt->execute();
$oExists = $stmt ->fetch();
if( !empty( $oExists ) )
{
// Run update sql...
}
else
{
// Run insert sql...
答案 2 :(得分:0)
$stmt = $dbh->prepare("SELECT count( 1 ) FROM tmp WHERE user_id = :user_id AND question_id = :question_id AND answer_id = :answer_id");
$stmt->bindValue( 'user_id', 1 );
$stmt->bindValue( 'question_id', 1 );
$stmt->bindValue( 'answer_id', 1 );
$stmt->execute();
$oExists = $stmt ->fetch();
if( !empty( $oExists ) ) {
echo "update";
$stmt = $dbh->prepare("UPDATE tmp SET answer_id = :answer_id WHERE user_id = {$_SESSION['UserID']} AND question_id = {$_POST['question']}"); //updates the counter each time test created
$stmt -> bindParam(':answer_id', $_POST['select_answer'], PDO::PARAM_INT);
$stmt -> execute();
} else {
echo "insert";
$stmt = $dbh -> prepare("INSERT INTO tmp (user_id, test_id, question_id, answer_id) VALUES (?, ?, ?, ?)");
$stmt -> bindParam(1, $_SESSION['UserID']); // binds parameter for user id
$stmt -> bindParam(2, $_GET['start_test']); // binds parameter for test id
$stmt -> bindParam(3, $_POST['question']); // binds parameter for selected answer
$stmt -> bindParam(4, $_POST['select_answer']); // binds parameter for selected answer
$stmt -> execute();
}
以下是更新,但不是插入..