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 传参的更多相关文章

  1. 问题小记(MyBatis传参出现的小问题)

    问题一:在MyBatis中注解@Param和ParameterType不能一起用,会报错Parameter 'XXX' not found. Available parameters are [1, ...

  2. sqlmap动态sql优化,避免传参失误批量修改和删除操作!

    分析以下的sqlmap存在问题: <delete id="deletePartspic" parameterClass="TblSpPartspic"&g ...

  3. Mybatis传参方式

    Mybatis传多个参数(三种解决方案) 据我目前接触到的传多个参数的方案有三种. 第一种方案  DAO层的函数方法 ? 1 Public User selectUser(String name,St ...

  4. mybatis传参的几种方式

    1,@Param @参考文章 @Select("select s_id id,s_name name,class_id classid from student where  s_name= ...

  5. mybatis传参总结

    注:文章引用部分 mybatis传递参数总结文章内容 一.单个参数 1.基本数据类型 (1)直接使用 List<ChargeRuleDO> tests(long id); <sele ...

  6. mybatis传参问题总结

    一. 传入单个参数 当传入的是单个参数时,方法中的参数名和sql语句中参数名一致即可 List<User> getUser(int id); <select id="get ...

  7. Java Mybatis 传参方式

    一.单个参数: public List<XXBean> getXXBeanList(String xxCode); <select id="getXXXBeanList&q ...

  8. mybatis 传参为 Integer 时 ,Mapper 文件 中判断 条件 问题。

    <if test="valiStatus==null || valiStatus=='' || valiStatus==4 "> b.work_permit_card_ ...

  9. mybatis 传参是 list<string> 的注意事项

    <!--付款 批量 修改账单状态--><update id="editbillpayALL" parameterType="java.util.List ...

随机推荐

  1. SQLServer常用运维SQL整理

    今天线上SQLServer数据库的CPU被打爆了,紧急情况下,分析了数据库阻塞.连接分布.最耗CPU的TOP10 SQL.查询SQL并行度配置.查询SQL 重编译的原因等等 整理了一些常用的SQL 1 ...

  2. 大白话5分钟带你走进人工智能-第31节集成学习之最通俗理解GBDT原理和过程

    目录 1.前述 2.向量空间的梯度下降: 3.函数空间的梯度下降: 4.梯度下降的流程: 5.在向量空间的梯度下降和在函数空间的梯度下降有什么区别呢? 6.我们看下GBDT的流程图解: 7.我们看一个 ...

  3. 利用jsonconvert来转换json数据格式 (对象转为json)

      今天学了一下.net的WCF组件,边心血来潮,想着现在不都是前后分离,调接口开发不,于是赶紧写了一简单的后台数据,哈哈  废话不多说,直接上代码: 注意需要导入库! 实体类:Customer us ...

  4. Codeforces 760B:Frodo and pillows(二分)

    http://codeforces.com/problemset/problem/760/B 题意:有n张床m个枕头,每张床可以有多个枕头,但是相邻的床的枕头数相差不能超过1,问第k张床最多能拥有的枕 ...

  5. java LineNumberReader的使用

    前段时间需要读报表打印,需求是可以从第N行读到第N行,发现百度出来的LineNumberReader方法都不怎么理想 然后就找到一篇和众百度里脱颖而出的好文章,所以分享之:   从类 的命名来看,貌似 ...

  6. Keep It Simple

    The KISS principle, or Keep It Simple, Stupid, spans many trades, industries, and professions. The m ...

  7. 使用Mysql执行SQL语句基础操作

    SQL:  又叫结构化语言,是一种用来操作RDBMS的数据库语言,在关系型数据库中都支持使用SQL语句,如oracle.mysql等等. 注意: 在关系型数据库中sql语句是通用的,而在非关系型数据库 ...

  8. Linux日志系统分析:rsyslog、syslog和klog

    参考博客: https://blog.csdn.net/lidonghat/article/details/55004280 https://blog.csdn.net/u012247418/arti ...

  9. Bzoj 2525 [Poi2011]Dynamite

    2525: [Poi2011]Dynamite Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 240  Solved: 120[Submit][Sta ...

  10. 判断小端大端(C实现)

    C程序中的大端小端概念可以参见上一篇文章 如何区分小端和大端.本文重点讨论如何用C程序来判断当前系统是大端还是小端. 判断大端小端的程序如下: #include <stdio.h> int ...