Php PDO:未保存SQLite插入
我使用以下代码创建了一些表:Php PDO:未保存SQLite插入,php,pdo,sqlite,sql-insert,Php,Pdo,Sqlite,Sql Insert,我使用以下代码创建了一些表: $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 , CalI
$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();
$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'));
并在表“States”中创建了一个条目“Wochenende”
当我想用以下代码在“Events”表中插入条目时:
$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();
$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'));
没有返回错误,数据库中仍然没有条目。在调用
execute()
后检查方法的结果时显示此错误消息:
非空约束失败:Events.DBID
它被声明为DBID INT NOT NULL主键
,那么它为什么不自动添加下一个序列号呢
根据报告:
仅当声明的类型名称正好是“整数”时,主键列才成为整数主键
因此,您需要将列定义更改为DBID INTEGER主键
奖金信息: 启用此选项,使这些问题成为致命错误,您无需手动调用
errorInfo()
:
这将引发以下异常并停止执行:
致命错误:未捕获PDOException:SQLSTATE[23000]:完整性约束冲突:19非空约束失败:事件中的Events.DBID
奖金信息2: 由于您要声明外键,因此需要在运行时启用对它们的支持,如下所示:
我已经几十年没有做过php了。您需要进行提交吗?@BillBell我尝试使用sql事务,但也不起作用。此外,将条目放入“States”表的请求在没有事务的情况下也能正常工作。非常好的解释!非常感谢你。