gpt4 book ai didi

php - SQLSTATE[HY093] : Invalid parameter number: mixed named and positional parameters

转载 作者:行者123 更新时间:2023-11-29 08:50:32 61 4
gpt4 key购买 nike

这个错误对我来说似乎是一个错误,因为我的查询中没有位置参数。方法如下:

public function getAll(User $user, DateTime $start = null, DateTime $end = null)
{
$params = array('user_id' => $user->getId());

$rsm = new \Doctrine\ORM\Query\ResultSetMapping(); // Result set mapping
$rsm->addScalarResult('subtype', 'subtype');
$rsm->addScalarResult('count', 'count');

$sms_sql =
"SELECT CONCAT('sms_', IF(is_auto = 0, 'user' , 'auto')) AS subtype, " .
"SUM(messages_count * (customers_count + recipients_count)) AS count " .
"FROM outgoing_message AS m INNER JOIN small_text_message AS s ON " .
"m.id = s.id WHERE status <> 'pending' AND user_id = :user_id";

$news_sql =
"SELECT CONCAT('news_', IF(is_auto = 0, 'user' , 'auto')) AS subtype, " .
"SUM(customers_count + recipients_count) AS count " .
"FROM outgoing_message AS m JOIN newsletter AS n ON m.id = n.id " .
"WHERE status <> 'pending' AND user_id = :user_id";

if($start) :
$sms_sql .= " AND sent_at >= :start";
$news_sql .= " AND sent_at >= :start";
$params['start'] = $start->format('Y-m-d');
endif;

$sms_sql .= ' GROUP BY type, is_auto';
$news_sql .= ' GROUP BY type, is_auto';

return $this->_em->createNativeQuery("$sms_sql UNION ALL $news_sql", $rsm)
>setParameters($params)->getResult();
}

这会引发异常:

SQLSTATE[HY093]: Invalid parameter number: mixed named and positional parameters

数组 $params 没问题,所以 generated SQL :

var_dump($params);

array (size=2)
'user_id' => int 1
'start' => string '2012-01-01' (length=10)

最奇怪的是它仅适用于“$sms_sql”!

更新

又发现了一件奇怪的事情。如果我仅更改名称(更改为 start_date 而不是 start):

    if($start) :
$sms_sql .= " AND sent_at >= :start_date";
$news_sql .= " AND sent_at >= :start_date";
$params['start_date'] = $start->format('Y-m-d');
endif;

Doctrine/PDO 说的是:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'sent1rt_date' in 'where clause'

...因为字符串 1rt 添加在列名称的中间!

最佳答案

我认为问题出在 Doctrine ORM 对 NativeSQL 的支持上。

我在用于命名参数的 setParameters 方法的文档中没有找到任何示例。我看到的所有使用该方法的示例都是用于位置的,而不是命名的。

命名参数的所有示例都使用 setParameter(不带“s”)方法。它们仅显示 SQL 中匹配占位符的一次出现。

作为一项测试(也是一种可能的解决方法),尝试使 SQL 文本中的每个占位符唯一,然后单独设置每个占位符。

看起来“命名参数”支持可能有些不完整(与我们习惯的 Oracle 和其他 ORM 框架相比)。看起来 Doctrine 可能对位置符号有更好的支持。 (这对于简单的语句来说非常有用,但是当您有很多参数并且需要更改 SQL 语句时,它可能会很麻烦。这就是命名参数的好处真正开始发挥作用的地方......如果它们是支持右。)

这里是 Doctrine ORM 文档的链接 http://doctrine-orm.readthedocs.org/en/latest/reference/query-builder.html?highlight=setParameters (在该页面上搜索 setParameters 以获取示例。)

(请参阅我对您的问题的评论。)

这可能并不能真正回答您的问题,但它可能会让您朝着正确的方向前进。出门要小心。

关于php - SQLSTATE[HY093] : Invalid parameter number: mixed named and positional parameters,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11367982/

61 4 0