2015-05-14 37 views
0
$paymentIDs = Yii::app()->db->createCommand('SELECT payment_id FROM client_package WHERE package_id = :pid AND payment_id IS NOT NULL')->bindValue(':pid', $pid)->queryAll(); 

$total = Yii::app()->db->createCommand('SELECT count(*) FROM payment WHERE id IN ('.implode(",", $paymentIDs).') AND date BETWEEN \':mS\' AND \':mE\'')->bindValue(':mS', $monthStart)->bindValue(':mE', $monthEnd)->queryScalar(); 

以上是我的查詢代碼。正如你所看到的,我根據一定的標準詢問了payment_id(s)。我現在有一組數字。Yii,查詢給出數組字符串錯誤

當我執行第二個查詢,它失敗了,扔我一個錯誤

陣列到字符串轉換

我也試過這樣:

$total = Yii::app()->db->createCommand('SELECT count(*) FROM payment WHERE id IN ('.implode(",", $paymentIDs['payment_id']).') AND date BETWEEN \':mS\' AND \':mE\'')->bindValue(':mS', $monthStart)->bindValue(':mE', $monthEnd)->queryScalar(); 

現在,這給我一個錯誤說:

未定義指數:payment_id

有人能指出我的錯嗎?您的幫助將不勝感激。

謝謝。

+0

請勿在參數周圍放置'\''。參數還包含什麼值? 'var_dump($ pid,$ monthStart,$ monthEnd,$ paymentIDs);'。還考慮使用chinned版本的查詢生成器'...-> select() - > where()...'或CActiveRecord和CDbCriteria – Justinas

+0

我測試過了,它們確實返回了有效/期望的結果。基本上參數都工作正常。而且,爲什麼不在日期周圍放上'\'?是不是應該像'BETWEEN'2015-05-01'AND'2015-06-01''? '$ monthStart'和'$ monthEnd'給出的是:2015-05-01和2015-06-01,是的,沒有引號。 – NewbieCoder

+0

因爲Yii自動添加'''變量。如果每個參數的類型都是字符串,比其他地方有錯誤,請嘗試找出引發的文件和行錯誤。 (在錯誤頁'$ line'和'$ file') – Justinas

回答

1

第一個查詢的結果$paymentIDs是一個數組(或普通對象,我不確定)的數組。您可以嘗試在您的IDE中檢查它,或者使用var_dump來查看其結構。您可以使用listData method of the CHtml class來接近你想要什麼,就像這樣:

$ids = CHtml::listData($paymentIDs, 'payment_id', 'payment_id'); 

這將壓扁你的陣列字符串數組。然後...

implode(",", $ids) 

...會給你你想要的結果。

+0

非常感謝〜〜:) – NewbieCoder

1

就可以解決這個使用單一的查詢是這樣的:

$total = Yii::app()->db->createCommand('SELECT count(*) FROM payment WHERE id IN (SELECT payment_id FROM client_package WHERE package_id = :pid AND payment_id IS NOT NULL) AND date BETWEEN \':mS\' AND \':mE\'')->bindValue(':pid', $pid)->bindValue(':mS', $monthStart)->bindValue(':mE', $monthEnd)->queryScalar(); 

謝謝你:)

1
  1. 你的第一個查詢返回的對象數組(不是陣列的payment_id S)。 要獲得一些列的值的數組,您可以使用->queryColumn()。 所以第一個查詢必須是:

$paymentIDs = Yii::app()->db->createCommand('SELECT payment_id FROM client_package WHERE package_id = :pid AND payment_id IS NOT NULL')->bindValue(':pid', $pid)->queryColumn()

如果變量$monthStart$monthEndstring型(或可轉換爲string型),代碼必須正常工作。

  1. 在第二個查詢中,您可以使用bindValues而不是雙重bindValue