当前位置:Gxlcms > PHP教程 > yii2.0两表联查where条件用in的时候,怎么使用bindParam绑定参数-SegmentFault

yii2.0两表联查where条件用in的时候,怎么使用bindParam绑定参数-SegmentFault

时间:2021-07-01 10:21:17 帮助过:50人阅读

代码如下:

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时,应该怎么使用

  • 2 小时前提问
  • 评论
  • 邀请回答

请先 登录 后评论

默认排序 时间排序

1 个回答

0

请使用 Yii2 提供的AR直接操作,请参考 http://www.yiiframework.com/doc-2.0/guide-db-active-record.html

人气教程排行