如何使用 Doctrine DBAL?

Posted

技术标签:

【中文标题】如何使用 Doctrine DBAL?【英文标题】:How to use Doctrine DBAL? 【发布时间】:2011-10-07 11:02:07 【问题描述】:

我有这个文件夹结构

[-] myapp/
    [+] app/
    [-] lib/
        [-] vendor/
            [-] doctrine/
                [-] Doctrine/
                        Common/
                        DBAL/
                        Symfony/
                [+] bin/
    [-] sites/
        [-] default/
            [-] test/
                    test-doctrine-dbal.php

我尝试了文档中的代码

    <?php

use Doctrine\Common\ClassLoader;

require dirname(__FILE__).'/../../../lib/vendor/doctrine/Doctrine/Common/ClassLoader.php';

$classLoader = new ClassLoader('Doctrine', dirname(__FILE__).'/../../../lib/vendor/doctrine/Doctrine/DBAL/DriverManager.php');
$classLoader->register();

$config = new \Doctrine\DBAL\Configuration();
$connectionParams = array(
    'dbname' => 'cdcol',
    'user' => 'root',
    'password' => '',
    'host' => 'localhost',
    'driver' => 'pdo_mysql',
);
$conn = DriverManager::getConnection($connectionParams, $config);

$sql = "SELECT * FROM cds";
$stmt = $conn->query($sql);
while ($row = $stmt->fetch()) 
    echo $row['titel'];

?>

我收到警告:

Warning: require(D:\xampp\htdocs\myphp\sites\default\test/../../../lib/vendor/doctrine/Doctrine/DBAL/DriverManager.php\Doctrine\DBAL\Configuration.php) [function.require]: failed to open stream: No such file or directory in D:\xampp\htdocs\myphp\lib\vendor\doctrine\Doctrine\Common\ClassLoader.php on line 148

还有一个错误:

Fatal error: require() [function.require]: Failed opening required 'D:\xampp\htdocs\myphp\sites\default\test/../../../lib/vendor/doctrine/Doctrine/DBAL/DriverManager.php\Doctrine\DBAL\Configuration.php' (include_path='.;D:\xampp\php\PEAR') in D:\xampp\htdocs\myphp\lib\vendor\doctrine\Doctrine\Common\ClassLoader.php on line 148

我对 PHP 命名空间了解不多。阅读 PHP 手册中的 PHP 命名空间仍然无法解决问题。如果我想将 Doctrine DBAL 与该目录结构一起使用,该代码是否正确?

【问题讨论】:

【参考方案1】:

您需要将 Doctrine 库路径添加到 include_path。请参阅 get_include_pathset_include_path PHP 函数。

【讨论】:

我尝试添加这个:set_include_path(realpath(dirname(_ _ FILE _ _).'/../../../lib/vendor/doctrine/Doctrine/'));但仍然返回相同的错误。我在 _ 和 _ 中放了空格,因为 SO 中没有出现双 _ @Permana 检查realpath 是返回字符串还是布尔值。您可能在相对路径中有太多/很少的点或一些文件权限问题。 尝试require 手动提供正确路径的文件。使用is_readable 检查文件。可能是文件权限问题。【参考方案2】:

这对我来说看起来不对(来自警告)

D:\xampp\htdocs\myphp\sites\default\test/../../../lib/vendor/doctrine/Doctrine/DBAL/DriverManager.php\Doctrine\DBAL\Configuration.php

我对php了解不多,但我认为文件路径无法解析。现在,尝试删除 dirname(___FILE___) 并在其中硬编码路径。

【讨论】:

我尝试不使用 dirname(FILE) 并且仍然出现相同消息的错误。我也尝试添加 realpath(dirname(FILE).'/../../path') 并且仍然出现相同消息的错误 当您尝试硬编码路径时,您使用的路径是什么? (即,将整个路径保存到一个字符串,回显该字符串以便我们可以看到它是什么,并使用 require($myPath); 包含它)。如果这不是问题,您是否使用名称空间?当我将自己的命名空间与教义一起使用时,我遇到了教义的一些问题。 require函数没问题。我尝试只运行 require 函数并且它没有返回错误(我设置了 error_reporting(E_ALL))。我没有使用命名空间,但学说使用了。【参考方案3】:

ClassLoader 构造函数的第二个参数无效:

$classLoader = new ClassLoader('Doctrine', dirname(_FILE_).'/../../../lib/vendor/doctrine/Doctrine/DBAL /DriverManager.php');

第二个参数应该是Doctrine目录的include path,而不是文件。

因此,正确的行是:

$classLoader = new ClassLoader('Doctrine', '/../../../lib/vendor/doctrine/');

【讨论】:

以上是关于如何使用 Doctrine DBAL?的主要内容,如果未能解决你的问题,请参考以下文章

与 PHP PDO 相比,Doctrine DBAL 中的错误处理

使用 insert() 方法通过 PHP Doctrine\DBAL 2 插入 DateTime 值

如何在没有Symfony 4中的DoctrineBundle的情况下将DBAL Doctrine连接注册为服务

更新或插入方法中的 Doctrine 2 DBAL 表达式

composer安装doctrine/dbal

laravel5.1 上安装依赖(doctrine / dbal)