早上好,
我写了下面的代码,它在PHP上运行,PDO和SQLite在transaction下运行。令人费解的是,它没有出错,但它甚至没有写入第二个表,该表的结果是记录的所有字段都为null。你能告诉我我做错了什么,因为我在Apache2日志中找不到任何错误吗?非常感谢你。
我在SQLite中创建两个表:
创建数据库的我的SQL脚本:
CREATE TABLE "questionari" (
"pkid_questionario" INTEGER NOT NULL,
"dt_registrazione" TEXT NOT NULL,
"matricola" INTEGER NOT NULL,
"cognome" TEXT NOT NULL,
"nome" TEXT NOT NULL,
"email" TEXT NOT NULL,
"pk_localizzazione" INTEGER NOT NULL,
"desc_localizzazione" TEXT NOT NULL,
PRIMARY KEY("pkid_questionario" AUTOINCREMENT)
);
CREATE TABLE "t1" (
"idQuestionario" INTEGER,
"pkidBene" INTEGER,
"NumeroEtichetta" INTEGER,
"DescBene" TEXT,
"EsistenzaBene" TEXT,
"EsistenzaEtichetta" TEXT DEFAULT null,
"txtNote" TEXT DEFAULT null,
FOREIGN KEY("idQuestionario") REFERENCES "questionari"("pkid_questionario")
ON UPDATE CASCADE
ON DELETE CASCADE,
PRIMARY KEY("pkidBene","idQuestionario")
);
我的PHP代码如下:
define("T1_PkID","t1_PkID_r");
define("T1_Etichetta", "t1_Etichetta_r");
define("T1_Desc", "t1_Desc_r");
define("T1_Bene_YN", "t1_Bene_YN_r");
define("T1_Etichetta_YN", "t1_Etichetta_YN_r");
define("T1_Note", "t1_Note_r");
//[Omissis...]
try{
$db = new SQLiteDB();
//$dbh = new PDO("sqlite:./DB/DB_Inventario.db");
$dbh = $db->connect();
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->beginTransaction();
$sql = "INSERT INTO questionari ";
$sql .= "(dt_registrazione, matricola, cognome, nome, email, pk_localizzazione, desc_localizzazione) VALUES ";
$sql .= "(:dt_registrazione, :matricola, :cognome, :nome, :email, :pk_localizzazione, :desc_localizzazione)";
$stmt = $dbh->prepare($sql);
$dt_registrazione = date('Y/m/d H:i:s');
$stmt->bindParam(":dt_registrazione", $dt_registrazione);
$stmt->bindParam(":matricola", $matricola);
$stmt->bindParam(":cognome", $cognome);
$stmt->bindParam(":nome", $nome);
$stmt->bindParam(":email", $email);
$stmt->bindParam(":pk_localizzazione", $pkLocalizzazione);
$stmt->bindParam(":desc_localizzazione", $DescLocalizzazione);
$stmt->execute();
$lastID = $dbh->lastInsertId();
// t1_NumRows is the rows number to write for t1
for($i=0;$i<$t1_NumRows;$i++){
$sql = "INSERT INTO t1 ";
$sql .= "(idQuestionario, pkidBene, NumeroEtichetta, DescBene, EsistenzaBene, EsistenzaEtichetta, txtNote) VALUES ";
$sql .= "(:p_idQuestionario, :p_pkidBene, :p_NumeroEtichetta, :p_DescBene, :p_EsistenzaBene, :p_EsistenzaEtichetta, :p_txtNote)";
$stmt->bindParam(":p_idQuestionario", $lastID, PDO::PARAM_INT);
$stmt->bindParam(":p_pkidBene", $_POST[T1_PkID.$i], PDO::PARAM_INT);
$stmt->bindParam(":p_NumeroEtichetta", $_POST[T1_Etichetta.$i], PDO::PARAM_INT);
$stmt->bindParam(":p_DescBene", $_POST[T1_Desc.$i], PDO::PARAM_STR, 500);
$stmt->bindParam(":p_EsistenzaBene", $_POST[T1_Bene_YN.$i], PDO::PARAM_STR, 2);
if($_POST[T1_Bene_YN . $i]=="NO")
$stmt->bindParam(":p_EsistenzaEtichetta", null, PDO::PARAM_STR, 2);
else
$stmt->bindParam(":p_EsistenzaEtichetta", $_POST[T1_Etichetta_YN.$i], PDO::PARAM_STR, 2);
if(strlen(trim($_POST[T1_Note.$i]))==0)
$stmt->bindParam(":p_txtNote", null, PDO::PARAM_STR, 500);
else
$stmt->bindParam(":p_txtNote", $_POST[T1_Note.$i], PDO::PARAM_STR, 500);
$stmt = $dbh->prepare($sql);
$stmt->execute();
}
//[Omissis...]
$dbh->commit();
// In case of exception make rollback!
好的,我在代码中做了一些调试,我发现准备语句必须立即插入到参数查询的定义之后。在这一点上,我的代码工作: D: D