You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 09:45:07