對我來說,這個錯誤似乎是一個錯誤,因爲在我的查詢中沒有位置參數。下面是該方法:SQLSTATE [HY093]:無效的參數編號:混合的名稱和位置參數
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]:無效參數號:混合命名和位置 參數
陣列$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;
什麼情況是,學說/ PDO說:
SQLSTATE [42S22]:列未找到:1054未知列「sent1rt_date ' in'where clause'
...作爲字符串1rt
被添加在列名中間!
這行是磨損,「SUM(messages_count *(customers_count + recipients_count))AS計數」你可以打開你的mysql命令行並測試唯一的查詢嗎? – jcho360 2012-07-06 19:01:49
@ jcho360該行工作正常,因爲我說如果我只使用$ sms_sql作爲查詢它的工作原理! – gremo 2012-07-06 19:38:57
你的SQL有些古怪,但我不認爲這是問題所在。對狀態user_id,sent_at,is_auto和type列的引用不具有表別名的限制。您在SELECT列表中使用保留字「count」作爲別名(它應該真正用反引號括起來)。您按「類型」進行分組有點奇怪,但該列未包含在查詢的其他任何地方。這是合法的,只是有點奇怪。我會用表別名來限定它。但沒有一個是真正的問題。 – spencer7593 2012-07-06 20:02:50