【问题标题】:CREATE TABLE partially fails with PHP + PDO for SqliteCREATE TABLE 使用 PHP + PDO for Sqlite 部分失败
【发布时间】:2012-08-27 16:11:14
【问题描述】:

我正在使用 Navicat 制作的数据库转储在 SQLite 数据库中创建表。

在我正在运行的 3 个 CREATE TABLE 查询中,2 个失败,1 个有效 - 所以这不是权限/连接/配置问题。

这里是 SQL:

CREATE TABLE "servers" (
"id"  INTEGER NOT NULL,
"name"  TEXT(32) NOT NULL,
"type"  INTEGER NOT NULL,
"host"  TEXT(128) NOT NULL,
"port"  INTEGER NOT NULL,
"rcon_port"  INTEGER NOT NULL,
PRIMARY KEY ("id")
);

CREATE TABLE "config" ("built"  INTEGER NOT NULL);

CREATE TABLE "users" (
"id"  INTEGER NOT NULL,
"username"  TEXT(32) NOT NULL,
"password"  TEXT(64) NOT NULL,
"salt"  TEXT(8) NOT NULL,
"last_login"  INTEGER NOT NULL,
PRIMARY KEY ("id")
);

尝试运行它 - 仅创建 config 表。

我可以用 Navicat 执行这个脚本并创建表 - 这在语法上有什么错误吗?

也没有错误/异常被抛出

PHP:

$path$sql确认无误

$db_conn = 'sqlite:' . $path;

try {
    $dbh = new PDO($db_conn);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $dbh->query(file_get_contents($sql);
} catch (Exception $e) {
    var_dump($e);
    exit;
}

【问题讨论】:

  • PDO 是否配置为在出错时抛出异常? $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 另外,请向我们展示用于运行此查询的 PHP 代码。
  • 是的 - 添加了 PHP 代码 - 还发现了另一个奇怪的地方。如果我更改语句的顺序 - 只有第一个被执行。因此,每个语句都独立工作。换行符或分号有什么用吗?
  • 可以,你应该用分号;分割文件内容,分别执行。试试看。
  • 三个CREATE TABLE 语句是否都在一个文件中?你是一次全部通过吗? (不太确定,但可能 PDO_SQLITE3 只允许单个语句。)

标签: php sqlite pdo


【解决方案1】:

尝试将文件分成单独的查询并运行:

$db_conn = 'sqlite:' . $path;
$queries = file_get_contents($sql);

try {
    $dbh = new PDO($db_conn);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $queries = explode(";", $queries);
    foreach ($queries as $query) {
        $dbh->query($query);
    }
} catch (Exception $e) {
    var_dump($e);
    exit;
}

【讨论】:

  • 是的 - 这很有效 - 查询一次只能运行一个似乎有点奇怪
  • 您不需要将字符串拆分为查询子字符串。只需在顶部执行 $dbh->exec($queries) 即可正常工作;-)
  • @LeandroF.Vaz:嗯,这就是他在最初的问题中所做的,但对他没有用。
  • 也许他应该用 exec 替换查询。它真的对我有用。
  • @LeandroF.Vaz:queryexec 之间没有区别,只是它们返回两个不同的东西。
【解决方案2】:

SQLite syntax diagram 在列列表之后和 PRIMARY KEY 声明之前不包含逗号。由于这是失败的表之间最明显的区别,因此请先尝试。

【讨论】:

  • 试过 - 给了我:SQLSTATE[HY000]:一般错误:1附近“(”:语法错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-18
  • 2013-03-08
  • 2020-02-08
  • 2014-01-26
  • 1970-01-01
  • 2013-11-21
  • 1970-01-01
相关资源
最近更新 更多