php sql 类似 mybatis 传参
PHP sql 处理上,没有类似于 java mybatis 的工具,导致进行一些sql 处理时,会有诸多不便,
楼主抽时间写了一个 php 类似 mybatis 的sql 工具,省去了拼装sql 的时间
代码如下
<?php
$sqlStartTarg = "#{";
$sqlEndTarg = "}"; /**
* 替换 #{key} 部分
* Enter description here ...
* @param $valuePart
* @param $valueArray
*/
function replaceValue($valuePart, $valueArray){
global $sqlStartTarg, $sqlEndTarg; $resultValue = null; $key = str_replace($sqlStartTarg, "", $valuePart);
$key = str_replace($sqlEndTarg, "", $key); $key = trim($key); if(array_key_exists($key, $valueArray)){
$resultValue = $valueArray[$key];
}else{
$resultValue = "NULL_VALUE";
}
return $resultValue;
} /**
* 预处理sql,替换 #{key..} 部分为实际值
* 本方法不做特殊字符处理,如遇特殊字符,请自行在传递的值中做处理
* Enter description here ...
* @param $sql 原始sql
* @param $parameter 传递参数数组
*/
function preparedSql($sql, $parameter){
global $sqlStartTarg, $sqlEndTarg; $resultSql = ""; //为避免参数值包含 #{...} 部分,所以做分组处理
$lastSql = $sql; //首先,查询 #{
while($startIndex = strpos($lastSql, $sqlStartTarg)){//包含参数
//参数前部分
$frontPart = substr($lastSql, 0, $startIndex); //参数部分
$endIndex = strpos($lastSql, $sqlEndTarg, $startIndex); if($endIndex){
//已处理部分
$valueLength = $endIndex - $startIndex + 1;
$valuePart = substr($lastSql, $startIndex, $valueLength); //#{key} 部分
$value = replaceValue($valuePart, $parameter); $resultSql .= $frontPart . $value; //参数后未处理部分
if($endIndex + 1 >= strlen($lastSql)){
$lastSql = "";
}else{
$lastSql = substr($lastSql, $endIndex + 1);
}
}else{
$resultSql .= $lastSql;
$lastSql = "";
}
} if($lastSql != ""){
$resultSql.= $lastSql;
} return $resultSql;
} /**
* 正则匹配方式不可取
* 有可能参数值中包含 #{**},此时,替换会出现异常
* 但此方法保留
* Enter description here ...
*/
function preparedSql1(){
$sql = "select user_id, user_name, `password` from `user_info` where password = '#{password}' ";
$sql .= "and company_name = '#{company_name}' and status = #{status} and comment = '#{comment}' "; //先找出 sql 中包含的 所有参数
/*
$matchArray = array(); $reg = "/\#\{[^\}]*\}/"; preg_match_all($reg, $sql, $matchArray); $resultJson = json_encode($matchArray);
//phpAlert($resultJson); print_r($matchArray);
echo "$resultJson";
*/
} /**
* 测试
* Enter description here ...
*/
function test_db(){
$sql = "select user_id, user_name, `password` from `user_info` where password = '#{password}' ";
$sql .= "and company_name = '#{company_name}' and status = #{status} and comment = '#{comment}' "; $valueArray = array();
$valueArray['password'] = "|#{password}|";
$valueArray['company_name'] = "|company_name|";
$valueArray['comment'] = "|comment|";
$valueArray['status'] = "|status|"; $sql = preparedSql($sql, $valueArray); print_r($sql);
} ?>
php sql 类似 mybatis 传参的更多相关文章
- 问题小记(MyBatis传参出现的小问题)
问题一:在MyBatis中注解@Param和ParameterType不能一起用,会报错Parameter 'XXX' not found. Available parameters are [1, ...
- sqlmap动态sql优化,避免传参失误批量修改和删除操作!
分析以下的sqlmap存在问题: <delete id="deletePartspic" parameterClass="TblSpPartspic"&g ...
- Mybatis传参方式
Mybatis传多个参数(三种解决方案) 据我目前接触到的传多个参数的方案有三种. 第一种方案 DAO层的函数方法 ? 1 Public User selectUser(String name,St ...
- mybatis传参的几种方式
1,@Param @参考文章 @Select("select s_id id,s_name name,class_id classid from student where s_name= ...
- mybatis传参总结
注:文章引用部分 mybatis传递参数总结文章内容 一.单个参数 1.基本数据类型 (1)直接使用 List<ChargeRuleDO> tests(long id); <sele ...
- mybatis传参问题总结
一. 传入单个参数 当传入的是单个参数时,方法中的参数名和sql语句中参数名一致即可 List<User> getUser(int id); <select id="get ...
- Java Mybatis 传参方式
一.单个参数: public List<XXBean> getXXBeanList(String xxCode); <select id="getXXXBeanList&q ...
- mybatis 传参为 Integer 时 ,Mapper 文件 中判断 条件 问题。
<if test="valiStatus==null || valiStatus=='' || valiStatus==4 "> b.work_permit_card_ ...
- mybatis 传参是 list<string> 的注意事项
<!--付款 批量 修改账单状态--><update id="editbillpayALL" parameterType="java.util.List ...
随机推荐
- Appium+python自动化(十七)- 你难道猴哥失散多年的混血弟弟 - Monkey简介之开山篇(超详解)
简介 今天由宏哥给小伙伴们来介绍猴哥的混血弟弟=Monkey.Monkey 是Android SDK提供的一个命令行工具, 可以简单,方便地运行在任何版本的Android模拟器和实体设备上. Monk ...
- kuangbin专题 专题一 简单搜索 迷宫问题 POJ - 3984
题目链接:https://vjudge.net/problem/POJ-3984 这个题目,emm,上代码,看的估计应该是刚开始接触搜索的,我带点注释,你能慢慢理解. #include <ios ...
- asp.net core 系列之Configuration
在ASP.NET Core中的App configuration 是通过configuration providers基于key-value对建立的.Configuration providers读取 ...
- 0x31 prime distance(质数)
题目描述: 给定两个整数L和U,你需要在闭区间[L,U]内找到距离最接近的两个相邻质数C1和C2(即C2-C1是最小的),如果存在相同距离的其他相邻质数对,则输出第一对. 同时,你还需要找到距离最远的 ...
- WinForm控件之【CheckBox】
基本介绍 复选框顾名思义常用作选择用途,常见的便是多选项的使用: 常设置属性.事件 Checked:指示组件是否处于选中状态,true为选中处于勾选状态,false为未选中空白显示: Enabled: ...
- 【06】Jenkins:Gitlab 自动触发构建以及钉钉通知
写在前面的话 在某些时候,我们希望能够实现这样一个功能,当用户提交东西到 gitlab 上的时候,希望它能够自动触发构建,发布到我们需要的环境. 目前我们内部有做类似的需求:产品提交原型到 gitla ...
- 开源框架Autofac使用入门
目录导航 1.Autofac是什么 1.1什么是DI和IOC 1.2DI和IOC在项目中起到什么作用 2.Autofac如何使用 2.1下载 2.2代码Demo 2.3Demo分析 3总结 1.Aut ...
- ASP.NET--Web服务器端控件和Html控件
今天学习总结了一些相关概念和知识. 之前无论是做 单机的winform 还是 CS的winform 感觉,不到两年下来感觉还可以,虽然API有很多,但是还是比较熟悉基于WINDOWS消息机制的编程,但 ...
- CF543B Destroying Roads 题解
看到没有题解就贡献一波呗 分析: 这题其实就是想让我们求一个图中两条最短路的最短(好把更多的边删掉). 我们先考虑一条最短路,别问我我怎么会的显然,就是s和t跑个最短路再用n-就行. 然后就是两条喽! ...
- Excel催化剂100+大主题功能梳理导读
Excel催化剂历经1年4个月的开发时间,终于荣登100+个大主题功能,完成数据领域的功能大矩阵,可以说在日常的数据处理及分析上,绝大部分的共性场景已经囊括其中,是数据工作者难得一遇的优秀作品之一.因 ...