我以Doctrine 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...);
显然这导致了我的错误。
感谢您的回答。
注意:这是doctrine dbal querybuilder as prepared statement的一个非常相似的问题,但前者也没有得到答案......
答案 0 :(得分:0)
完全正常。预处理语句的本质是将sql独立于实际值发送到数据库服务器。两者总是分开。文档没有执行查询的实际示例,这有点奇怪。
就个人而言,我不是QueryBuilder :: setParameter的忠实粉丝。相反,我做:
$queryBuilder = $conn->createQueryBuilder();
$queryBuilder
->select('id', 'name')
->from('users')
->where('email = ?');
$stmt = $conn->executeQuery($queryBuilder->getSQL(),[$userInputEmail]);
$user = $stmt->fetch();
只需要发送一个与您的参数顺序匹配的值数组。作为奖励,您可以发送WHERE xxx IN(?)的数组。准备陈述的东西通常不会处理。
就插入而言,我认为你可能会过度思考。连接对象支持插入,更新和删除,无需查询构建器。
$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());