PDO:SQLite INSERT 未保存
PDO: SQLite INSERT does not get saved
我使用以下代码创建了一些 table:
$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();
并在 table "States" 中创建了条目 "Wochenende"。
当我想使用以下代码将条目插入 "Events" table 时:
$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()
后检查 errorInfo()
方法的结果显示此错误消息:
NOT NULL constraint failed: Events.DBID
声明为DBID INT NOT NULL PRIMARY KEY
那么为什么它不自动添加下一个序号呢?
A PRIMARY KEY column only becomes an integer primary key if the declared type name is exactly "INTEGER".
因此您需要将列定义更改为 DBID INTEGER PRIMARY KEY
。
奖金信息:
启用PDO exceptions让这些问题变成致命错误,不需要手动调用errorInfo()
:
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
这将引发以下异常并停止执行:
Fatal error: Uncaught PDOException: SQLSTATE[23000]: Integrity constraint violation: 19 NOT NULL constraint failed: Events.DBID in ...
红利信息2:
由于您要声明外键,因此您需要在运行时启用对它们的支持,如 foreign key constraints are disabled by default (for backwards compatibility):
$db->exec('pragma foreign_keys = ON');
我使用以下代码创建了一些 table:
$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();
并在 table "States" 中创建了条目 "Wochenende"。
当我想使用以下代码将条目插入 "Events" table 时:
$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()
后检查 errorInfo()
方法的结果显示此错误消息:
NOT NULL constraint failed: Events.DBID
声明为DBID INT NOT NULL PRIMARY KEY
那么为什么它不自动添加下一个序号呢?
A PRIMARY KEY column only becomes an integer primary key if the declared type name is exactly "INTEGER".
因此您需要将列定义更改为 DBID INTEGER PRIMARY KEY
。
奖金信息:
启用PDO exceptions让这些问题变成致命错误,不需要手动调用errorInfo()
:
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
这将引发以下异常并停止执行:
Fatal error: Uncaught PDOException: SQLSTATE[23000]: Integrity constraint violation: 19 NOT NULL constraint failed: Events.DBID in ...
红利信息2:
由于您要声明外键,因此您需要在运行时启用对它们的支持,如 foreign key constraints are disabled by default (for backwards compatibility):
$db->exec('pragma foreign_keys = ON');