dongqieli4164 2019-08-09 14:11
浏览 105
已采纳

使用php在PDO查询中使用Multiple in()条件

I'm using multiple in() condition in WHERE clause of PDO Select query. As a values of in() condition, I am trying to use array, by converting the string into array using explode statement. Like this.,

        $conditions="";

        if($rows['notification_counselor']!='0')
        {
            $counselor=str_repeat('?,', count(explode(",",$rows['notification_counselor'])) - 1) . '?';
            $conditions.=" AND (st.counselorname IN($counselor))";
        }

        if($rows['notification_source']!='0')
        {
            $source=str_repeat('?,', count(explode(",",$rows['notification_source'])) - 1) . '?';
            $conditions.=" AND (st.source IN($source))";
        }

        if($rows['notification_type']!='0')
        {
            $type=str_repeat('?,', count(explode(",",$rows['notification_type'])) - 1) . '?';
            $conditions.=" AND (st.type IN($type))";
        }

        if($rows['notification_program']!='0')
        {   
            $program=str_repeat('?,', count(explode(",",$rows['notification_program'])) - 1) . '?';
            $conditions.=" AND (st.program IN($program))";
        }

In this, $rows['notification_counselor'] is string, so I'm using explode function to change it to array.

But I'm getting this result only:

SELECT st.email FROM tbl_studentrecord st LEFT JOIN tbl_callrecord cr ON st.student_id_pk=cr.student_id_fk WHERE (DATE(st.createddate) >= :fromdate AND DATE(st.createddate) <= :todate) AND (st.counselorname IN(?,?,?))

with this error:

Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: mixed named and positional parameters

Rest of code is like as follows,

$stmt = $crsmspdo->prepare("SELECT st.email FROM tbl_studentrecord st LEFT JOIN tbl_callrecord cr ON st.student_id_pk=cr.student_id_fk WHERE (DATE(st.createddate) >= :fromdate AND DATE(st.createddate) <= :todate) $conditions GROUP BY cr.student_id_fk");
        $find_data=array('fromdate' =>$rows['notification_fdate'],'todate' =>$rows['notification_tdate']);
        $stmt->execute($find_data);

But, I expect actual results as like this,

SELECT st.email FROM tbl_studentrecord st LEFT JOIN tbl_callrecord cr ON st.student_id_pk=cr.student_id_fk WHERE (DATE(st.createddate) >= :fromdate AND DATE(st.createddate) <= :todate) AND (st.counselorname IN(5,6,7))

I don't know where I making a mistake. Kindly help me to troubleshoot my code error or give any alternate ideas to achieve this..,

Thanks in advance!

  • 写回答

1条回答 默认 最新

  • dongsuiying7773 2019-08-09 14:54
    关注

    The warning actually told you what's wrong. The SQL string you generated has both the positional parameters (i.e. ?) and named parameters (e.g. :todate, :fromdate). You need to either use one of them in the SQL, not both.

    One way to fix this is to convert your all or ? usage into more sophisticated named parameters.

    For example, this part of your code:

    if($rows['notification_counselor']!='0')
    {
        $counselor=str_repeat('?,', count(explode(",",$rows['notification_counselor'])) - 1) . '?';
        $conditions.=" AND (st.counselorname IN($counselor))";
    }
    

    Can be rewritten like this:

    
    if ($rows['notification_counselor'] != '0') {
        $values = explode(',', $rows['notification_counselor']);
        $placeholders = [];
        foreach ($values as $key => $value) {
            $placeholders[] = ':notification_counselor_' . $key;
            $find_data[':notification_counselor_' . $key] = $value;
        }
        $conditions .= ' AND (st.counselorname IN(' . implode(', ', $placeholders) . '))';
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵