代碼如下:
public function test(){ $a = array(1,2,3,4,5); $uid = implode(',', $a); $sql = "SELECT A.uid,B.id,B.state FROM A LEFT JOIN B ON A.id=B.id WHERE A.uid in ($uid)"; $cmd = Self::getDb()->createCommand($sql); $res = $cmd->queryAll(); /*var_dump($res); array (size=3) 0 => array (size=6) 'uid' => string '1' (length=2) 'id' => string '1100' (length=5) 'state' => string '2' (length=1) 1 => array (size=6) 'uid' => string '2' (length=2) 'id' => string '1200' (length=5) 'state' => string '2' (length=1) 2 => array (size=6) 'uid' => string '3' (length=2) 'id' => string '1300' (length=5) 'state' => string '2' (length=1)*/
//-----------------------------綁定參數法----------------------------------------- $sql2 = "SELECT A.uid,B.id,B.state FROM A LEFT JOIN B ON A.id=B.id WHERE A.uid in (:uid)"; $cmd2 = Self::getDb()->createCommand($sql2); $cmd2 -> bindParam(":uid",$uid); $res2 = $cmd2->queryAll(); /*var_dump($res2); array (size=3) 0 => array (size=6) 'uid' => string '1' (length=2) 'id' => string '1100' (length=5) 'state' => string '2' (length=1)*/}假如$sql得到的結果有三條資料,用$sql2得到的結果只有一條資料(經測試,調換$a裡元素的位置發現,$res2的資料一直是$a裡第一個有資料的元素所對應的那條資料)。經過測試和瞭解,發現bindParam會在替換預留位置時會在參數外邊加一個單引號,這樣我的in條件裡邊就變成了一個整體,而不是五個值。問題:1.就算作為一個整體,為什麼還會得到一條資料呢。2.本題怎麼改正3.YII2裡,如果要使用預留位置,where條件要用到in時,應該怎麼使用
回複內容:
代碼如下:
public function test(){ $a = array(1,2,3,4,5); $uid = implode(',', $a); $sql = "SELECT A.uid,B.id,B.state FROM A LEFT JOIN B ON A.id=B.id WHERE A.uid in ($uid)"; $cmd = Self::getDb()->createCommand($sql); $res = $cmd->queryAll(); /*var_dump($res); array (size=3) 0 => array (size=6) 'uid' => string '1' (length=2) 'id' => string '1100' (length=5) 'state' => string '2' (length=1) 1 => array (size=6) 'uid' => string '2' (length=2) 'id' => string '1200' (length=5) 'state' => string '2' (length=1) 2 => array (size=6) 'uid' => string '3' (length=2) 'id' => string '1300' (length=5) 'state' => string '2' (length=1)*/
//-----------------------------綁定參數法----------------------------------------- $sql2 = "SELECT A.uid,B.id,B.state FROM A LEFT JOIN B ON A.id=B.id WHERE A.uid in (:uid)"; $cmd2 = Self::getDb()->createCommand($sql2); $cmd2 -> bindParam(":uid",$uid); $res2 = $cmd2->queryAll(); /*var_dump($res2); array (size=3) 0 => array (size=6) 'uid' => string '1' (length=2) 'id' => string '1100' (length=5) 'state' => string '2' (length=1)*/}假如$sql得到的結果有三條資料,用$sql2得到的結果只有一條資料(經測試,調換$a裡元素的位置發現,$res2的資料一直是$a裡第一個有資料的元素所對應的那條資料)。經過測試和瞭解,發現bindParam會在替換預留位置時會在參數外邊加一個單引號,這樣我的in條件裡邊就變成了一個整體,而不是五個值。問題:1.就算作為一個整體,為什麼還會得到一條資料呢。2.本題怎麼改正3.YII2裡,如果要使用預留位置,where條件要用到in時,應該怎麼使用
請使用 Yii2 提供的AR直接操作,請參考 http://www.yiiframework.com/doc-2.0/guide-db-active-record.html
http://stackoverflow.com/questions/14767530/php-using-pdo-with-in-clause-array