帝国论坛帝国网站管理系统交流区帝国CMS使用交流[原创]编程分享 构造where预处理语句 实现in构造,百度找不到 【本版专题贴子】  
 1/2     1 2 ›› ›|
主题:[原创]编程分享 构造where预处理语句 实现in构造,百度找不到 [加入收藏夹]   

cighsen02
用户头衔:进士

精华贴   :0
发贴数   :858
经验值   :3306
注册时间:2009-09-29
信息 搜索 好友 发送悄悄话 精益求精-帝国网站管理系统7.5正式版开源发布】   [第 1 楼]
[原创]编程分享 构造where预处理语句 实现in构造,百度找不到
编程分享 百度找不到,特别分享一下,对于学习mysql实现更插查删特别有用



    /**
     * 构造where预处理语句
     *
         * @param array $where
         * @return array
         */
    public function parseWhere(?array $where = []): array
        {
                if (empty($where)) return ['where' => '', 'data'  => []];
               
                $str    = '';
                $eq     = ' = ';
                $data   = [];
                foreach($where as $key => $value) {

                        //增加空判断可以加快
                        if (false !== strstr($key, ' ') && preg_match('/(\w+)\s+(>|<|in|like)/i', $key, $matches)) {

                                $key = $matches[1];
                                //当为in时
                                if ('in' === $matches[2] && is_array($value)) {

                                        $value  = array_values($value);
                                        if (1 === count($value)) {
                                               
                                                $eq         = ' = ';
                                                $value         = $value[0];
                                        }
                                        else {
                                               
                                                $eq = ' ' . strtoupper($matches[2]) . ' ';
                                        }
                                }
                                else {

                                        $eq = ' ' . $matches[2] . ' ';
                                }
                        }

                        //去除null值
                        if (null !== $value) {
                            
                                //in处理值
                                if (is_array($value) && count($value) > 1) {
                                       
                                        $newkey = '';
                                        foreach($value as $i => $v) {
                                               
                                                $data[':' . $key . $i] = $v;
                                                $newkey .= ($newkey ? ',' : '') . ':' . $key . $i;
                                        }
                                       
                                        $str .= ($str ? ' AND ' : '') . '`' . $key . '`' . $eq . '(' . $newkey . ')';
                                }
                                else {
                                       
                                        $data[':' . $key] = $value;
                                        $str .= ($str ? ' AND ' : '') . '`' . $key . '`' . $eq . ':' . $key;
                                }
                        }
                }

                return [
                    'where' => $str ? ' WHERE ' . $str : '',
                    'data'  => $data
                ];
        }



执行
$db->getList(['groupid' => 1], ['userid', 'buserid', 'truename', 'adcode', 'sex', 'userpic', 'tags', 'viewstats'], 16);效果为第一条
$db->getList(['userid in' => [2,3,4,5]], ['userid', 'truename', 'userpic', 'sex']);效果为第二条

实现效果(以下3条都是联表--前台会员表):


SELECT a.`userid`,a.`buserid`,b.`truename`,b.`adcode`,b.`tags`,b.`sex`,b.`userpic`,b.`viewstats` FROM `phome_enewsmember` AS a INNER JOIN `phome_enewsmemberadd` AS b ON a.`userid` = b.`userid` WHERE `groupid` = :groupid limit 0,10
SELECT a.`userid`,b.`truename`,b.`sex`,b.`userpic` FROM `phome_enewsmember` AS a INNER JOIN `phome_enewsmemberadd` AS b ON a.`userid` = b.`userid` WHERE a.`userid` IN (:userid0,:userid1,:userid2,:userid3)
SELECT a.`userid`,b.`truename`,b.`saytext`,b.`sex`,b.`userpic` FROM `phome_enewsmember` AS a INNER JOIN `phome_enewsmemberadd` AS b ON a.`userid` = b.`userid` WHERE `groupid` = :groupid limit 3


[该贴被修改 3 次,最后修改时间 2022-12-03 15:16:55 ]


要上就上安心站长 www.axzz.cn q:365182575
2022-11-23 09:52:42 已设置保密 顶部 回复 引用 报告 编辑 删除

cighsen02
用户头衔:进士

精华贴   :0
发贴数   :858
经验值   :3306
注册时间:2009-09-29
信息 搜索 好友 发送悄悄话 免费开源-EBMA系统:更安全的MYSQL管理和备份系统】   [第 2 楼]

依你的想调用的字段,会自动生成预查询单表或联表语句
客户网站: https://www.haozhiyin.cn/

[该贴被修改 2 次,最后修改时间 2022-12-03 15:15:48 ]


要上就上安心站长 www.axzz.cn q:365182575
2022-11-23 09:54:17 已设置保密 顶部 回复 引用 报告 编辑 删除

cnnb
用户头衔:探花

精华贴   :0
发贴数   :5686
经验值   :16251
注册时间:2008-10-14
信息 搜索 好友 发送悄悄话 精益求精-帝国网站管理系统7.5正式版开源发布】   [第 3 楼]

看着不错




2022-11-24 07:14:26 已设置保密 顶部 回复 引用 报告 编辑 删除

pingpong
用户头衔:探花

精华贴   :0
发贴数   :9328
经验值   :24281
注册时间:2008-11-02
信息 搜索 好友 发送悄悄话 免费开源-EBMA系统:更安全的MYSQL管理和备份系统】   [第 4 楼]

数组前面加?是什么意思




2022-11-25 07:23:46 已设置保密 顶部 回复 引用 报告 编辑 删除

csdn2
用户头衔:探花

精华贴   :0
发贴数   :4531
经验值   :13256
注册时间:2013-11-21
信息 搜索 好友 发送悄悄话 精益求精-帝国网站管理系统7.5正式版开源发布】   [第 5 楼]

学习




2022-11-26 06:57:56 已设置保密 顶部 回复 引用 报告 编辑 删除

hlp
用户头衔:探花 *

精华贴   :0
发贴数   :2583
经验值   :7851
注册时间:2008-03-17
信息 搜索 好友 发送悄悄话 免费开源-EBMA系统:更安全的MYSQL管理和备份系统】   [第 6 楼]

好像不错




2022-12-01 00:19:23 已设置保密 顶部 回复 引用 报告 编辑 删除

tkf88
用户头衔:探花

精华贴   :0
发贴数   :8640
经验值   :21963
注册时间:2007-05-26
信息 搜索 好友 发送悄悄话 精益求精-帝国网站管理系统7.5正式版开源发布】   [第 7 楼]

没看懂什么用处




2022-12-03 08:34:07 已设置保密 顶部 回复 引用 报告 编辑 删除

cighsen02
用户头衔:进士

精华贴   :0
发贴数   :858
经验值   :3306
注册时间:2009-09-29
信息 搜索 好友 发送悄悄话 免费开源-EBMA系统:更安全的MYSQL管理和备份系统】   [第 8 楼]

原帖由 pingpong 于 2022-11-25 07:23:46 发表
数组前面加?是什么意思

是语法糖,可以为空的意思



要上就上安心站长 www.axzz.cn q:365182575
2022-12-03 14:35:12 已设置保密 顶部 回复 引用 报告 编辑 删除

csdn2
用户头衔:探花

精华贴   :0
发贴数   :4531
经验值   :13256
注册时间:2013-11-21
信息 搜索 好友 发送悄悄话 精益求精-帝国网站管理系统7.5正式版开源发布】   [第 9 楼]

学习




2022-12-10 07:38:43 已设置保密 顶部 回复 引用 报告 编辑 删除

pw8
用户头衔:探花

精华贴   :0
发贴数   :8756
经验值   :22494
注册时间:2008-10-10
信息 搜索 好友 发送悄悄话 免费开源-EBMA系统:更安全的MYSQL管理和备份系统】   [第 10 楼]

支持下




2023-01-28 07:54:55 已设置保密 顶部 回复 引用 报告 编辑 删除
 1/2     1 2 ›› ›|

快速回复
内容

表情
使用EBB代码 使用smile代码 显示签名 自动分析url 自动分析img
     【进入高级模式】   (按 Ctrl+Enter 直接提交)
    顶部  加入收藏夹
关于帝国 | 广告服务 | 联系我们 | 法律声明 | 隐私条款 | 许可协议
Powered by: EBB Version 2.2.1