提问者:小点点

事务下PHP PDO SQLite中的父-子表-无错误,但不起作用


早上好,
我写了下面的代码,它在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!


共1个答案

匿名用户

好的,我在代码中做了一些调试,我发现准备语句必须立即插入到参数查询的定义之后。在这一点上,我的代码工作: D: D