我目前正在使用symfony和DBAL从外部数据库收集数据.
$conn = $this->get('database_connection');
$users = $conn->fetchAll('SELECT * FROM cms_clients');
print_r($users);
Run Code Online (Sandbox Code Playgroud)
上面的代码工作正常,但我需要做更复杂的查询,我能找到的唯一文档是http://doctrine-dbal.readthedocs.org/en/latest/reference/query-builder.html
文档非常好,但我不确定如何在我的示例中实现代码.
$queryBuilder
->select('u.id', 'u.name')
->from('users', 'u')
->where('u.email = ?')
->setParameter(0, $userInputEmail)
;
解决方案,无论如何都要感谢重播
Run Code Online (Sandbox Code Playgroud)$conn = $this->get('database_connection');
$parms = array($DataSource, 'STORE');
$query = "SELECT * FROM cms_things LEFT JOIN cms_stores ON cms_things.id=cms_stores.thing_id WHERE client_id = ? AND type = ? ";
$users = $conn->fetchAll($query, $parms);
Run Code Online (Sandbox Code Playgroud) 如果我在简单的PDO上使用Doctrine的数据库抽象层(DBAL),会得到什么?
PDO本身不应该是抽象层吗?据我所知,我获得的唯一好处是能够将Oracle的oci8驱动程序与类似PDO的API一起使用。
我想念什么?
我在Symfony项目中使用DBAL访问Mysql数据库中的数据。当查询具有布尔字段(创建为tinyint)的表时,我在PHP中获得了tinyint值,但我想获取布尔值。
不知何故,我想获得与直接使用Doctrine相同的映射。
我以为映射转换(从mysql到php)已经在DBAL中实现,但是我不确定是否应该以这种方式工作(该层映射返回值)。
我尝试注册类似于以下内容的自定义映射,但未成功:
$this->conn->getDatabasePlatform()->registerDoctrineTypeMapping('tinyint', 'boolean');
$sql = "
SELECT se.survey_id, se.anonymous
FROM survey_edition se
";
$stmt = $this->conn->prepare($sql);
$stmt->execute();
$result = $stmt->fetch();
Run Code Online (Sandbox Code Playgroud)
在这种情况下,“匿名”是Mysql中的tinyint(1)字段,但是我希望$ result ['anonymous']是布尔值而不是整数。
您是否知道可以通过Doctrine的DBAL从Mysql查询中获取PHP中的布尔值?
谢谢。
我有一个架构sql文件(语法错误),包括设置数据库的多个查询
example.sql
CREATE TABLE IF NOT EXISTS `example` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` text COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
CREATExxxxxxxxxx TABLE IF NOT EXISTS `example2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` text COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
Run Code Online (Sandbox Code Playgroud)
使用example.php
$sqlContent = file_get_contents("example.sql");
$stmt = $conn->prepare($sqlContent);
$result = $stmt->execute();
Run Code Online (Sandbox Code Playgroud)
即使我的sql不正确,execute方法也不会抛出任何异常.它的文档说它false在失败时返回,但它返回true.
我该如何处理异常处理?如何检查我的查询是否有错误?
我收到以下SQL的"基数违规"错误:
Doctrine\DBAL\Exception\DriverException:执行时发生异常
SELECT p.* FROM mod_products_products p
LEFT JOIN mod_products_products_categories c_link ON c_link.product_id = p.id
LEFT JOIN mod_products_brands b ON p.brand_id = b.id
LEFT JOIN mod_products_groups vg ON p.variation_id = vg.id
LEFT JOIN mod_products_categories c ON c_link.category_id = c.id
LEFT JOIN mod_products_group_options vg_o ON vg_o.group_id = vg.id
LEFT JOIN mod_products_group_values vg_o_v ON vg_o_v.option_id = vg_o.id
WHERE (p.name LIKE (?, ?)) AND (p.parent_id = 0) AND (vg_o.disabled=0)
GROUP BY p.id ORDER BY p.name ASC
LIMIT 18446744073709551615 OFFSET 0
Run Code Online (Sandbox Code Playgroud)
with params ["%big%","%light%"]:SQLSTATE …
当使用裸机Doctrine和开箱即用的命令行时,有两个命令可用,使用Doctrine和Symfony时似乎不可用,并且app/console:
dbal
dbal:import Import SQL file(s) directly to Database.
dbal:run-sql Executes arbitrary SQL directly from the command line.
Run Code Online (Sandbox Code Playgroud)
有没有办法在Symfony中启用这些命令app/console?
使用 PDO 我们有\PDO::ATTR_ERRMODE,并且将其设置为\PDO::ERRMODE_EXCEPTION我们能够获得详细的异常堆栈跟踪 ( getTrace)。
DBAL 怎么样?如何在 DBAL 级别设置它如何抛出错误?
DBAL 是 PDO 实例的包装器,与 DBAL 的大多数 PDO 方法工作相同,是否还有ATTR_ERRMODE其他类似的报告控制方法?
我想用它set_error_handler来更好地控制错误的行为方式和ERRMODE_EXCEPTION级别,它非常有用。
在 PDO 中:
<?php
$dsn = 'mysql:host='.$_SESSION['options']['host'].';port='.$_SESSION['options']['port'].';dbname='.$_SESSION['options']['dbname'].';charset='.$_SESSION['options']['charset'];
try {
$conn = new \PDO($dsn, $_SESSION['options']['user'], $_SESSION['options']['pass']);
$conn->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); // how to set this line in DBAL?
} catch (\PDOException $e) {
trigger_error($e->getMessage(), E_USER_ERROR);
}
?>
Run Code Online (Sandbox Code Playgroud)
在 DBAL 中也是如此:
<?php
require_once "lib/autoload.php";
$config = new \Doctrine\DBAL\Configuration();
$params = array(
'dbname' => $_SESSION['options']['dbname'],
'user' …Run Code Online (Sandbox Code Playgroud) 我想将我的SSL证书和密钥文件添加到Doctrine DBAL配置中,但我不知道如何实现这一点.
在PHP中,我只需要编写类似于:
$databaseHandler = new \PDO(
'mysql:host=my_host;dbname=my_db',
'username',
'password',
array(
\PDO::MYSQL_ATTR_SSL_KEY => '.../client-key.pem',
\PDO::MYSQL_ATTR_SSL_CERT => '.../client-cert.pem',
\PDO::MYSQL_ATTR_SSL_CA => '.../ca-cert.pem'
)
);
Run Code Online (Sandbox Code Playgroud)
我知道有一个自定义驱动程序选项 driverOptions,我看到了这个答案,但我不确定如何将其转换为YAML.
我觉得我应该写一些接近的东西:
doctrine:
dbal:
driver: "%database_driver%"
host: "%database_host%"
port: "%database_port%"
dbname: "%database_name%"
user: "%database_user%"
password: "%database_password%"
charset: UTF8
driverOptions:
PDO::MYSQL_ATTR_SSL_CA: '.../client-key.pem'
PDO::MYSQL_ATTR_SSL_CERT: '.../client-cert.pem'
PDO::MYSQL_ATTR_SSL_CA: '.../ca-cert.pem'
Run Code Online (Sandbox Code Playgroud)
但双冒号不会真的取悦YAML ......
首先,我只想提一下,这根本不是一个“问题”。使用 Doctrine DBAL 删除不是问题,我能够做到。
我真正想知道的是是否有办法一次删除多行而不必循环,例如数组。
对于我的项目,我使用Silex和Doctrine DBAL
这是我目前如何做的一个例子:
$toDelete = array(1,2,3,4);
foreach($toDelete as $id){
$this->app['db']->delete('table_name',array('id' => $id ));
}
Run Code Online (Sandbox Code Playgroud)
有什么方法可以避免循环吗?
我在Symfony2上使用dbal从我的表中检索一些信息:
$social = $conn->fetchAll('SELECT * FROM page WHERE brand_id = :brand LIMIT :start,:limit', array('brand'=>$brand, 'start'=>(int) $start, 'limit'=>(int) $limit));
Run Code Online (Sandbox Code Playgroud)
我只是在添加最后一部分(LIMIT ....)时才收到错误,这让我觉得我不能在sql查询中限制结果但在外面使用某种命令.我怎么解决这个问题?
错误:
An exception occurred while executing 'SELECT * FROM page WHERE brand_id = :brand LIMIT :start,:limit' with params {"brand":1,"start":0,"limit":4}:
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''0','4'' at line 1
Run Code Online (Sandbox Code Playgroud)