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 ...
随机推荐
- pytorch实现yolov3(4) 非极大值抑制nms
在上一篇里我们实现了forward函数.得到了prediction.此时预测出了特别多的box以及各种class probability,现在我们要从中过滤出我们最终的预测box. 理解了yolov3 ...
- UVa 1440:Inspection(带下界的最小流)***
https://vjudge.net/problem/UVA-1440 题意:给出一个图,要求每条边都必须至少走一次,问最少需要一笔画多少次. 思路:看了好久才勉强看懂模板.良心推荐:学习地址. 看完 ...
- Codeforces Gym100502G:Outing(缩点+有依赖的树形背包)
http://codeforces.com/gym/100502/attachments 题意:有n个点,容量为tol,接下来n个关系,表示选了第i个点,那么第xi个点就必须被选.问最多可以选多少个点 ...
- HDU 5521:Meeting(最短路)
http://acm.hdu.edu.cn/showproblem.php?pid=5521 Meeting Problem Description Bessie and her friend E ...
- MacBook强制清除gardle缓存
背景:在日常的工作开发中,为了方便维护一般采用gardle+Nexus的模式管理jar包,但方便的同时也会存在一些问题 例如:test-1.0.3.jar jar包提供方修改了一些问题上传到Nexu ...
- cookie 和 session 设置
cookie: 保存在浏览器上的一组键值对, 是由服务器让浏览器进行设置的 下次浏览器访问的时候会携带cookie. request是客户端请求, response是服务端响应. 读取客户端的cook ...
- django基础知识之模板:
模板介绍 作为Web框架,Django提供了模板,可以很便利的动态生成HTML 模版系统致力于表达外观,而不是程序逻辑 模板的设计实现了业务逻辑(view)与显示内容(template)的分离,一个视 ...
- CDQZ集训DAY4 日记
早上起来之后发现座位被zzh占了,得知座位改为先来后到,什么鬼…… 于是去了另一个有耳机的机房,然而并没有什么卵用. T1上来感觉很有意思,先切50分再说.T2好像是原题的说,切了原题30分后大胆猜测 ...
- 【NOIP2018】标题统计-C++
描述 凯凯刚写了一篇美妙的作文,请问这篇作文的标题中有多少个字符? 注意:标题中可能包含大.小写英文字母.数字字符.空格和换行符.统计标题字符数时,空格和换行符不计算在内. 输入 输入文件名为 tit ...
- C++小游戏——井字棋
#include<cstdio> #include<windows.h> #include<ctime> int main() { srand(time(NULL) ...