2012-07-06 66 views
0

對我來說,這個錯誤似乎是一個錯誤,因爲在我的查詢中沒有位置參數。下面是該方法: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被添加在列名中間!

+0

這行是磨損,「SUM(messages_count *(customers_count + recipients_count))AS計數」你可以打開你的mysql命令行並測試唯一的查詢嗎? – jcho360 2012-07-06 19:01:49

+0

@ jcho360該行工作正常,因爲我說如果我只使用$ sms_sql作爲查詢它的工作原理! – gremo 2012-07-06 19:38:57

+0

你的SQL有些古怪,但我不認爲這是問題所在。對狀態user_id,sent_at,is_auto和type列的引用不具有表別名的限制。您在SELECT列表中使用保留字「count」作爲別名(它應該真正用反引號括起來)。您按「類型」進行分組有點奇怪,但該列未包含在查詢的其他任何地方。這是合法的,只是有點奇怪。我會用表別名來限定它。但沒有一個是真正的問題。 – spencer7593 2012-07-06 20:02:50

回答

1

我認爲這個問題與NativeSQL的Doctrine ORM支持有關。

我在用於命名參數的setParameters方法的文檔中找不到任何示例。我所看到的使用該方法的所有例子都是用於定位而不是命名的。

所有命名參數的例子都使用setParameter(沒有「s」)方法。而且它們只在SQL中顯示一個匹配的佔位符。

作爲測試(以及作爲可能的解決方法),請嘗試使SQL文本中的每個佔位符都是唯一的,然後分別設置每個佔位符。

它看起來像「命名參數」的支持可能有點不完整(與我們習慣的Oracle和其他ORM框架相比)。看起來教義可能會更好地支持位置符號。 (這對於簡單的語句很有用,但是當你有很多參數時它可能是一個真正的熊,並且你需要修改一個SQL語句,這就是命名參數的好處真正開始發光的地方......如果它們是支持的權利。)

下面就來學說ORM文檔http://doctrine-orm.readthedocs.org/en/latest/reference/query-builder.html?highlight=setParameters的鏈接(搜索setParameters該頁面實例上。)

(查看你的問題我的意見。)

,可能不是真正的答案你的問題,但它可能會讓你朝着正確的方向前進。在那裏小心點。

相關問題