如何使用postgresql?【已解决,并附总结】

看过两篇文章
https://gitee.com/dogstar/PhalApi/issues/IA48Q
http://qa.phalapi.net/?/question/27
然后我尝试在程序根目录建立common文件夹,然后在里面添加了一个文件pgsql.php
文件内容如下

<?php
namespace App\common;
use PhalApi\Api;
class pgsql extends PhalApi_DB_NotORM {
protected function createPDOBy($dbCfg)
    {
        $dsn = sprintf('%s:dbname=%s;host=%s;port=%d',
            isset($dbCfg['pdo']) ? $dbCfg['pdo'] : 'mysql',//添加数据库类型标识判断,默认是MySQL
            $dbCfg['name'],
            isset($dbCfg['host']) ? $dbCfg['host'] : 'localhost',
            isset($dbCfg['port']) ? $dbCfg['port'] : 3306
        );
        $charset = isset($dbCfg['charset']) ? $dbCfg['charset'] : 'UTF8';
        $pdo = new PDO(
            $dsn,
            $dbCfg['user'],
            $dbCfg['password']
        );
        $pdo->exec("SET NAMES '{$charset}'");
        return $pdo;
    }
}
 
然后不成功。
然后将文件移动到src/app/common下
还是报错,错误内容为
 

PHP Fatal error: Uncaught Error: Class 'pgsql' not found in D:\Work\xxx\Api\web\config\di.php:35 Stack trace: #0 D:\Work\xxx\Api\web\vendor\phalapi\kernal\src\DependenceInjection.php(201): {closure}() #1 D:\Work\xxx\Api\web\vendor\phalapi\kernal\src\DependenceInjection.php(147): PhalApi\DependenceInjection->initService(Object(Closure)) #2 D:\Work\xxx\Api\web\vendor\phalapi\kernal\src\DependenceInjection.php(174): PhalApi\DependenceInjection->get('notorm', NULL) #3 D:\Work\xxx\Api\web\vendor\phalapi\kernal\src\Model\NotORMModel.php(126): PhalApi\DependenceInjection->__get('notorm') #4 D:\Work\xxx\Api\web\vendor\phalapi\kernal\src\Model\NotORMModel.php(27): PhalApi\Model\NotORMModel->getORM('1') #5 D:\Work\xxx\Api\web\src\app\Domain\Examples\CURD.php(22): PhalApi\Model\NotORMModel->get('1') #6 D:\Work\xxx\Api\web\src\app\Api\Examples\CURD.php(94): App\Domain\Examples\CURD->get('1') #7 [internal function]: App\Api\Examples\CURD->get() #8 D:\Work\xxx\Api\web\vendor\phalapi\kernal\src\PhalApi.php(53): call_user_f in D:\Work\xxx\Api\web\config\di.php on line 35
 
 
 
 
DI文件报错行代码
 
//数据操作 - 基于NotORM,$_GET['__sql__']可自行改名
$di->notorm = function() {
    $debug = !empty($_GET['__sql__']) ? true : false;
    return new pgsql($di->config->get('dbs'), $debug);
};
错误在return 这行。
已邀请:

dogstar - PhalApi创始人

赞同来自:

Uncaught Error: Class 'pgsql' not found in D:\Work\xxx\Api\web\config\di.php:35
 
请注意看报错信息和代码位置。这是找不到你的类,源代码请贴下。

hametan

赞同来自:

//数据操作 - 基于NotORM,$_GET['__sql__']可自行改名
$di->notorm = function() {
    $debug = !empty($_GET['__sql__']) ? true : false;
    return new pgsql($di->config->get('dbs'), $debug);
};

dogstar - PhalApi创始人

赞同来自:

试下改为:
$di->notorm = new \App\common\pgsql($di->config->get('dbs'), !empty($_GET['__sql__']));
可了解下composer的PSR-4自动加载机制: http://docs.phalapi.net/#/v2.0/autoload

dogstar - PhalApi创始人

赞同来自:

即 HTTP 错误 500.0 - Internal Server Error
php-cgi.exe - FastCGI 进程超过了配置的活动超时时限
 
在开启调试模式后,把详细的报错信息贴一下。或截图

hametan

赞同来自:

总结一下,phalapi版本是2.5,使用PGSQL,在程序根目录下的src\app\Common目录创建pgsql.php,代码如下
 

<?php
namespace App\common;
use PDO;
use PDOException;
use PhalApi\Database;
use PhalApi\Database\NotORMDatabase;

class pgsql extends NotORMDatabase {
protected function createPDOBy($dbCfg)
    {
        $dsn = sprintf('%s:dbname=%s;host=%s;port=%d',
            isset($dbCfg['type']) ? $dbCfg['type'] : 'mysql',//添加数据库类型标识判断,默认是MySQL
            $dbCfg['name'],
            isset($dbCfg['host']) ? $dbCfg['host'] : 'localhost',
            isset($dbCfg['port']) ? $dbCfg['port'] : 3306
        );
        $charset = isset($dbCfg['charset']) ? $dbCfg['charset'] : 'UTF8';
        $pdo = new PDO(
            $dsn,
            $dbCfg['user'],
            $dbCfg['password']
        );
        $pdo->exec("SET NAMES '{$charset}'");
        return $pdo;
    }
}


然后在di.php加入如下代码
 
$di->notorm = new  App\common\pgsql($di->config->get('dbs'), $di->debug);

要回复问题请先登录注册