Php 原则2 DBAL和QueryBuilder-它真的有效吗?

Php 原则2 DBAL和QueryBuilder-它真的有效吗?,php,doctrine-orm,Php,Doctrine Orm,我以原则DBAL在线文档为例: $queryBuilder ->select('id', 'name') ->from('users') ->where('email = ?') ->setParameter(0, $userInputEmail); 第一个问题: 当我打电话给 $sql = $queryBuilder->getSQL(); 我希望返回一个完整有效的SQL查询,其中包含指定的参数;不幸的是,情况并非如此,我返回的查

我以原则DBAL在线文档为例:

$queryBuilder
    ->select('id', 'name')
    ->from('users')
    ->where('email = ?')
    ->setParameter(0, $userInputEmail);
第一个问题:

当我打电话给

$sql = $queryBuilder->getSQL();
我希望返回一个完整有效的SQL查询,其中包含指定的参数;不幸的是,情况并非如此,我返回的查询仍然带有问号;这正常吗

第二个问题:

我不清楚(阅读文档)如何准确地使用查询生成器来检索结果;一个实际的例子可以为我指明正确的方向

我在以下方面也遇到了类似的问题:

$DBQB
        ->insert('core_users')
        ->values(
                array(
                    'username' => $SETUP['admin']['username'],
                    'secret' => hash($SETUP['util']['hashalgo'], $SETUP['admin']['passwd'])
                )
                );
其中->GetSQL()不会返回有效的SQL查询:

INSERT INTO core_users (username, secret) VALUES(qsecofr, b7...);
很明显,这让我犯了一个错误

谢谢你的回答


注意:这是一个非常类似的问题,但前者没有得到答案…

完全正常。准备好的语句的本质是将sql独立于实际值发送到数据库服务器。两者总是分开,并在数据库级别合并;因此,Doctrine中的
getSQL
无法返回完全编译的SQL查询

文档中没有执行查询的实际示例,这有点奇怪

就我个人而言,我不太喜欢QueryBuilder::setParameter。相反,我会:

$queryBuilder = $conn->createQueryBuilder();
$queryBuilder
    ->select('id', 'name')
    ->from('users')
    ->where('email = ?');

$stmt = $conn->executeQuery($queryBuilder->getSQL(),[$userInputEmail]);
$user = $stmt->fetch();
只需要发送一个与参数顺序匹配的值数组。作为奖励,您可以为(?)中的xxx发送一个数组。事先准备好的陈述通常无法处理的事情

就插入内容而言,我认为你可能想得太多了。连接对象支持插入、更新和删除,而无需查询生成器

$conn->insert('core_users',['username'=>'DTrump','secret='Putin']);
=================================

下面是一个使用setParameter的工作示例

    $qb
        ->select('projectId','gameNumber','fieldName')
        ->from('games')
        ->where('gameNumber = ?')
        ->setParameter(0,11457);

    $stmt = $qb->execute();

    dump($stmt->fetchAll());

谢谢你的回答;它解决了我的问题,尽管我仍然不明白为什么setParameter方法不起作用……它确实起作用,只是不是你认为它应该起作用的方式$qb->execute应该可以很好地运行查询。那么,你能举出一个完整的例子吗?只是为了抓住全貌。