PHP PDO SQLite.事务和更新问题


PHP PDO SQLite. Transaction and updating problems

我在PHP-PDO-SQLite中有一个事务和更新的问题。

$db = new PDO('sqlite:database1.sqlite');
/*
$rowsnumber1 = $db->exec("CREATE TABLE IF NOT EXISTS questions(
id INTEGER PRIMARY KEY AUTOINCREMENT,
question TEXT NOT NULL,
answers INTEGER NOT NULL
)");
print('$rowsnumber1: '.$rowsnumber1.'<br />');
$rowsnumber2 = $db->exec("CREATE TABLE IF NOT EXISTS answers(
id INTEGER PRIMARY KEY AUTOINCREMENT,
qid INTEGER NOT NULL,
answer TEXT NOT NULL
)");
print('$rowsnumber2: '.$rowsnumber2.'<br />');
*/
//print('Inserting: '); $res = $db->exec("INSERT INTO questions (question,answers) VALUES ('Question',0)"); var_dump($res); print('<br />');
$qid = 1;
try
{
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->beginTransaction();
// Variant 1
//print('Executing 1: '); $res1 = $db->exec("INSERT INTO answers (qid,answer) VALUES ($qid,'Answer')"); var_dump($res1); print('<br />');
//print('Executing 2: '); $res2 = $db->exec("UPDATE questions SET answers = answers+1 WHERE id = '".$qid."'"); var_dump($res2); print('<br />');
// Variant 2
print('Preparing 1: '); $statement1 = $db->prepare("INSERT INTO answers (qid,answer) VALUES (:qid,:answer)"); var_dump($statement1); print('<br />');
print('Preparing 2: '); $statement2 = $db->prepare("UPDATE questions SET answers = answers+1 WHERE id='".$qid."'"); var_dump($statement2); print('<br />');
print('Executing 1: '); $res1 = $statement1->execute(array('qid'=>$qid,'answer'=>'Answer')); var_dump($res1); print('<br />');
print('Executing 2: '); $res2 = $statement2->execute(); var_dump($res2); print('<br />');
$db->commit();
}
catch(Exception $e)
{
$db->rollBack();
print("Transaction failed: " .$e->getMessage());
}

当问题的"id"和答案的"qid"相同($qid)时,没有问题。当我试图插入问题的"id"的答案时,问题就开始了,这个问题不存在于表"questions"中。例如,在"questions"表中有一个问题("id"为"1"),您尝试插入一个"id"="5"的问题答案。插入了答案,但没有更新问题(单元格"answerswers"没有增加),因为没有这样一个"id"="5"的问题。问题是事务不进行回滚,执行更新时结果为"true",尽管实际上没有更新。什么是错误的事务,为什么更新返回"true"当我使用一个语句?

我知道我做错了什么。问题是在"尝试"部分没有逻辑。在$ db -> commit ();我应该写下面两行:

if($res1 != 1) throw new Exception("Inserting the answer failed");
if($res2 != 1) throw new Exception("Updating the question failed");
关于准备

();和执行();-我在这里无意中阅读了PDO手册http://www.php.net/manual/en/pdostatement.execute.php问题是execute();如果语句被执行,则返回'true',但不检查它是否影响了一行。方法exec();检查该行是否受到影响。即方法prepare();和执行();都不适合这种情况。我应该使用"变体1",我注释了。

我也遇到过类似的问题,只是在允许写访问问题持续存在之后。

显然,我在事务中有"外键约束失败"错误,导致提交失败。

我必须把我的数据库表整理好,问题就解决了。