Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php PDO:未保存SQLite插入_Php_Pdo_Sqlite_Sql Insert - Fatal编程技术网

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”表的请求在没有事务的情况下也能正常工作。非常好的解释!非常感谢你。