Php SQLite常规错误的原因:17数据库架构已更改

Php SQLite常规错误的原因:17数据库架构已更改,php,sqlite,pdo,Php,Sqlite,Pdo,为什么在真空备份之前声明准备好的语句$stmt2会导致一般错误:17数据库架构已更改错误 <?php require '../vendor/autoload.php'; ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); set_time_limit(0); $db = new \PDO("sqlite:".__DIR__."/../db/datalo

为什么在
真空备份之前声明准备好的语句
$stmt2
会导致
一般错误:17数据库架构已更改
错误

<?php

require '../vendor/autoload.php';

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
set_time_limit(0);


$db = new \PDO("sqlite:".__DIR__."/../db/datalogger.db");
$db->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
$db->setAttribute(\PDO::ATTR_DEFAULT_FETCH_MODE, \PDO::FETCH_OBJ);

print_r($db->query('SELECT version, polltimeDestination FROM config WHERE bogus=0')->fetch());

$stmt1=$db->prepare('UPDATE config SET polltimeDestination=? WHERE bogus=0');
$stmt1->execute([300]);

$db->exec('DELETE FROM backup');
$stmt2=$db->prepare('UPDATE config SET version=? WHERE bogus=0');
$db->exec('VACUUM backup');

//$stmt2=$db->prepare('UPDATE config SET version=? WHERE bogus=0');
$stmt2->execute([8]);

根据你的常识评论


任何模式更改(如添加或删除表或列)显然都会导致模式更改。使用真空也会导致模式更改。试图执行模式更改前定义的准备好的语句将导致
SQLite一般错误:17数据库模式已更改
错误。

我认为这是一个学术问题,没有任何实际应用?@YourCommonSense虽然没有显示,但真正的应用程序是一个连续运行的服务,我觉得如果我只分配一次准备好的语句就更合适了。我发布的代码只是创建错误的最小代码。在发现错误后,它变得有点学术性,我只是想更好地理解正在发生的事情。有道理。我不是预处理语句内部的专家,但我认为错误消息说明了一切:看起来真空被认为是模式转换器,预处理语句本质上与模式紧密耦合,以一半的速度运行查询。因此,显而易见的解决办法是每次都要做好准备。这不应该是个大问题deal@YourCommonSense通常,在使用循环时,通常首先创建准备好的语句,然后在循环中多次执行。除了使用vacuum之外,还有其他必须注意的“陷阱”吗?我想说的是,任何模式更改,比如添加或删除表或列。
stdClass Object ( [version] => 8 [polltimeDestination] => 300 ) 
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 17 database schema has changed' in /var/www/html/test2.php:26 Stack trace: #0 /var/www/html/test2.php(26): PDOStatement->execute(Array) #1 {main} thrown in /var/www/html/test2.php on line 26