【问题标题】:Doctrine 2 can't run SELECT query issueDoctrine 2 无法运行 SELECT 查询问题
【发布时间】:2016-11-30 05:46:37
【问题描述】:

我遇到了这个问题,我不知道为什么会发生。 我像这样使用dao.account.php 编码:

$sql = " 
        SELECT last_ip
        FROM accounts 
        WHERE login IN (:strAcc) 
";
$strAcc = " \'acb\' , \'gfh\' ";
$pdo = $this->em->getConnection();
$stmt = $pdo->prepare($sql);
$stmt->bindValue('strAcc',$strAcc);         
$stmt->execute();               
$rs = $stmt->fetchAll();
return $rs;

但它返回array(0){}。 不知道为什么???在我的数据库中,查询运行良好。 有人可以帮我吗???

【问题讨论】:

  • 你有没有得到任何错误?可以发一下吗?
  • 我没有错误。那是你,我害怕它。
  • @Samir 从我们得到的证据来看,没有错误,只是返回了一个空数组。从我们得到的证据来看,OP 的代码正在执行的查询类似于以下内容(手动替换参数值):SELECT last_ip FROM accounts WHERE login IN (' ''acb'' , ''gfh'' ');

标签: php sql symfony pdo doctrine-orm


【解决方案1】:

为要在IN () 条件中使用的每个值添加一个单独的绑定参数。这样,分隔值的逗号不是值的一部分,并且不会有引号被转义。如果需要从数组中获取值,可以遍历数组,为每个值调用 bindValue()

$sql = " 
    SELECT last_ip
    FROM accounts 
    WHERE login IN (:login1, :login2) 
";
$pdo = $this->em->getConnection();
$stmt = $pdo->prepare($sql);
$stmt->bindValue(':login1',"acb");         
$stmt->bindValue(':login2',"gfh");         
$stmt->execute();               
$rs = $stmt->fetchAll();
return $rs;

编辑:

根据关于未知数量值的评论,正如我在上面的解释中提到的那样,应该能够遍历值(假设它们在一个数组中),并使用 implode() 将参数名称添加到查询文本,如下例所示(也可以将array_map()使用 $stmt 调用$stmt->bindValue() 并返回字符串的回调一起使用:

$pdo = $this->em->getConnection();
$parameterNames = array();
foreach ($values as $index => $value) {
    $parameterNames[] = ':login'.$index;
}
$sql = " 
SELECT last_ip
FROM accounts 
WHERE login IN (".implode(', ', $parameterNames).") ";
$stmt = $pdo->prepare($sql);
foreach ($values as $index => $value) {
    $stmt->bindValue(':login'.$index, $value);
}

【讨论】:

  • 但这并不方便,尤其是在我们不知道登录次数的情况下......
  • ಠ_ಠ $xxxx 是什么?
【解决方案2】:

您可以使用 DQL:

$logins = ['acb', 'gfh'];
$dql = " 
        SELECT a.last_ip
        FROM Accounts a
        WHERE a.login IN (?1)
";
$q = $this->em->createQuery($dql)->setParameter(1, $logins);
$result = $q->execute();

【讨论】:

  • dontrince 不想在 sql 中使用 $login
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多