【问题标题】:PDO: SQLite INSERT does not get savedPDO:SQLite INSERT 未保存
【发布时间】:2017-07-26 16:02:05
【问题描述】:

我用以下代码创建了一些表:

$db = new PDO(SQLITE_PATH);
$statement = $db->prepare('CREATE TABLE States (name VARCHAR(25) NOT NULL PRIMARY KEY);');
$statement->execute();
$statement = $db->prepare('CREATE TABLE Events (DBID INT NOT NULL PRIMARY KEY , CalID INT, start INT, end INT, state VARCHAR(25), FOREIGN KEY(state) REFERENCES States(name));');
$statement->execute();

并在“States”表中创建了一个条目“Wochenende”。

当我想使用以下代码将条目插入“事件”表时:

$from_timestamp = strtotime(date('c'));
$to_timestamp = strtotime(date('c', time()+100000));

$query = 'INSERT INTO Events (CalID,start,end,state) VALUES (:CALID, :START, :END, :STATE);';
$statement = $db->prepare($query, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
if (!$statement) {
        print_r($db->errorInfo());
}
$statement->execute(array(':CALID' => get_highest_calid($db), ':START' => $from_timestamp, ':END' => $to_timestamp, ':STATE' => 'Wochenende'));

没有返回错误,数据库中仍然没有条目。

【问题讨论】:

  • 几十年来我没有做过任何 php。你需要提交吗?
  • @BillBell 我尝试使用 sql 事务,但它也不起作用。此外,将条目放入“States”表的请求在没有事务的情况下也有效。

标签: php pdo sqlite sql-insert


【解决方案1】:

在调用execute() 后检查errorInfo() 方法的结果会显示以下错误消息:

NOT NULL 约束失败:Events.DBID

声明为DBID INT NOT NULL PRIMARY KEY,为什么不自动添加下一个序号呢?

根据SQLite documentation

仅当声明的类型名称恰好是“INTEGER”时,PRIMARY KEY 列才会成为整数主键。

因此您需要将列定义更改为DBID INTEGER PRIMARY KEY


奖金信息:

启用PDO exceptions,让这些问题变成致命错误,而无需手动调用errorInfo()

$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

这会引发以下异常并停止执行:

致命错误:未捕获的 PDOException:SQLSTATE[23000]:完整性约束违规:19 NOT NULL 约束失败:Events.DBID in ...


奖励信息 2:

由于您要声明外键,因此您需要在运行时以foreign key constraints are disabled by default (for backwards compatibility) 启用对它们的支持:

$db->exec('pragma foreign_keys = ON');

【讨论】:

  • 很好的解释!非常感谢。
猜你喜欢
  • 2017-08-10
  • 1970-01-01
  • 1970-01-01
  • 2018-05-04
  • 1970-01-01
  • 1970-01-01
  • 2011-02-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多