簡體   English   中英

SQLSTATE [HY093]:參數號無效:混合命名和位置參數

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

這個錯誤似乎是一個錯誤,因為我的查詢中沒有位置參數。 這是方法:

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是可以的,所以生成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]:找不到列:1054'where子句'中的未知列'sent1rt_date'

...因為字符串1rt添加在列名稱的中間!

我認為問題在於對DocSQL的Doctrine ORM支持。

我沒有在用於命名參數的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以獲取示例。)

(請參閱我對您問題的評論。)

這可能不會真正回答你的問題,但它可能會讓你朝着正確的方向前進。 小心那里。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM