首页 碎碎念 博客 IT博客 音乐 旅途 你(U) 关于
编程语言 服务器 日常 其他
你正在阅读:

Mysqli中的sql动态绑值问题

日常
发布时间:2014-12-25

Mysqli中的sql动态绑值问题

    早上发哥要我把根据框架的原本数据库交互类将使用mysql换成mysqli,一下子把我给吓坏了,新手一枚,要不要那么大阵势吓我。

    我尝试着写了一下,很多的方法写起来还是没有什么大问题的,一个比较棘手的问题是sql的参数绑定过程中mysqli和mysql是不同的,整整想了一个下午,无果,就回家了。回家后默默百度了一番,好像发现了解决思路,虽然有点傻,但还是记录下来吧,说不定以后有用。

/**
 * 绑值
 * @param unknown $sql
 * @param unknown $params
 * @return unknown
 */
private function _bindParams($sql, $params=array()){
	$dataType = '';
	$bindArray = array();
	if(!strstr($sql, "?") && !empty($params)){
		$sqlArray =preg_split(
				"/(\:[A-Za-z0-9_]+)\b/",
				$sql,
				-1,
				PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY
		);
			
		foreach($sqlArray as $v){
			if($v[0] == ':'){
				$bindArray[$v] = $v;
			}
		}
			
		if(count($bindArray) != count($params))
			exit('绑值参数数量不匹配!');

		foreach ($bindArray as $v){
			if(is_int($params[$v])){
				$dataType .= 'i';
			}else if(is_string($params[$v])){
				$dataType .= 's';
			}else if(is_double($params[$v])){
				$dataType .= 'd';
			}else{
				$dataType .= 'b';//二进制
			}
			$bindArray[$v] = $params[$v];
			$tmp = ltrim($v, ':');
			$_bindArray[$tmp] = $params[$v];
		}

		$sql = str_replace(array_keys($bindArray), '?', $sql);
		$bindArray = array_values($bindArray);
	}else{
		foreach ($params as $v){
			if(is_int($v)){
				$dataType .= 'i';
			}else if(is_string($v)){
				$dataType .= 's';
			}else if(is_double($v)){
				$dataType .= 'd';
			}else{
				$dataType .= 'b';//二进制
			}
		}
		$bindArray = $params;
	}

	$refs = array();
	foreach($bindArray as $k => $v)
		$refs[$k] = &$bindArray[$k];

	$stmt = $this->$db->prepare($sql);
	if(!$stmt)
		exit('无法获取stmt对象');
	if(count($params) != 0){
		array_unshift($refs, $dataType);
		call_user_func_array(array($stmt, 'bind_param'), $refs);//使用call_user_func_array回调函数动态绑值
	}
	return $stmt;
}



旧站-时光博物馆
OursTime.cn All Right Reserve @2013-2022
粤ICP备15028708号
部分文章来自互联网,如侵犯隐私或版权请联系 610559722(at)qq.com 撤稿