PHP SQLite PDO 常规操作代码改造为静态类实现问题咨询
调整方案
1 优先排查核心问题
你改造失败大概率是以下几个常见问题导致的:
- 命名空间不匹配,
Db类定义在App命名空间下,调用侧没有正确引入或者没有配置自动加载 - Sqlite数据库使用了相对路径,相对于入口文件
index.php的位置找不到对应目录,或者目录没有读写权限 - 代码语法不完整,比如你贴的
Account类没有闭合大括号
2 完整调整后代码
Db类文件
<?php namespace App; class Db { protected static $pdo = null; public static function get(): \PDO { if (self::$pdo === null) { // 改用绝对路径,避免相对路径找不到文件的问题,按你自己的项目路径调整层级 $dbPath = __DIR__ . '/../hw-06.db'; self::$pdo = new \PDO( 'sqlite:' . $dbPath, null, null, [ \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION ] ); } return self::$pdo; } }
Account类文件
<?php namespace App; use App\Db; class Account { public static function createTable(): void { $db = Db::get(); $sql = "CREATE TABLE IF NOT EXISTS uzivatele( uzivatelId INTEGER PRIMARY KEY, jmeno TEXT, prijmeni TEXT, body INTEGER );"; $statement = $db->prepare($sql); $statement->execute(); } // 原有的dropTable也同步改造成静态方法 public static function dropTable(string $name): void { // 表名校验避免SQL注入 if (!preg_match('/^[a-zA-Z0-9_]+$/', $name)) { throw new \InvalidArgumentException('非法表名'); } $db = Db::get(); $sql = "DROP TABLE IF EXISTS $name"; $statement = $db->prepare($sql); $statement->execute(); } }
入口文件index.php
<?php // 开发阶段开启错误显示方便排查 error_reporting(E_ALL); ini_set('display_errors', 1); // 优先引入composer自动加载,如果没有用composer就手动引入两个类文件 require __DIR__ . '/vendor/autoload.php'; // 手动引入示例: // require __DIR__ . '/src/Db.php'; // require __DIR__ . '/src/Account.php'; use App\Account; try { Account::createTable(); echo "表创建成功"; // 需要删表时调用 Account::dropTable('uzivatele'); } catch (\PDOException $e) { echo "数据库错误:" . $e->getMessage(); } catch (\InvalidArgumentException $e) { echo "参数错误:" . $e->getMessage(); }
3 额外注意事项
- 确保数据库文件所在的目录有读写权限,Sqlite需要对目录有写入权限才能创建.db文件和临时文件
- 如果提示类不存在,优先检查
composer.json的autoload配置是否匹配你的类文件目录结构
内容的提问来源于stack exchange,提问作者Aaron7
相关产品推荐
相关产品推荐

