|
楼主 |
发表于 2012-8-11 15:51:43
|
显示全部楼层
本帖最后由 cyb5201314 于 2012-8-11 15:54 编辑
Hex 发表于 2012-8-11 14:13
先判断是不是数组,不是数组变成数组,这样的写法比较常见吧,就是为了后续可以统一按数组来处理。
占位 ...
我知道统一成数组很方便,但是请您看看这下面的代码好吗?$binds = array($binds);这句会把$binds变成一个一维数组,而他下面又对$binds进行了foreach,欲将$binds内的元素按顺序替换到占位符的位置,但是按您讲的,如果只是简单的获取一个数组,而且是一维数组,您觉得这是对的??就算是目标数值是一样的,那也只需要替换一下全部的占位符为目标数值就行了,何必弄成数组,再看下面,他将sql语句用占位符分割了,再遍历$binds的一维数组,将每一个元素连接在分割的sql里,出现的结果就是sql断开了,除非他的功能只能支持占位符为1个数量的,此时$binds可以是一个字符串,刚去英文网站找了已经改过的版本
PHP复制代码 /**
* Compile Bindings
*
* @param string the sql statement
* @param array an array of bind data
* @return string
*/
public function compile_binds ($sql, $binds)
{
if (empty($binds) OR empty($this->bind_marker) OR strpos($sql, $this->bind_marker) === FALSE)
{
return $sql;
}
elseif ( ! is_array($binds))
{
$binds = array($binds);
$bind_count = 1;
}
else
{
// Make sure we're using numeric keys
$binds = array_values($binds);
$bind_count = count($binds);
}
// We'll need the marker length later
$ml = strlen($this->bind_marker);
// Make sure not to replace a chunk inside a string that happens to match the bind marker
if ($c = preg_match_all("/'[^']*'/i", $sql, $matches))
{
$c = preg_match_all('/'.preg_quote($this->bind_marker).'/i',
str_replace($matches[0],
str_replace($this->bind_marker, str_repeat(' ', $ml), $matches[0]),
$sql, $c),
$matches, PREG_OFFSET_CAPTURE );
// Bind values' count must match the count of markers in the query
if ($bind_count !== $c)
{
return $sql;
}
}
elseif (($c = preg_match_all('/'.preg_quote($this->bind_marker).'/i', $sql, $matches, PREG_OFFSET_CAPTURE )) !== $bind_count)
{
return $sql;
}
do
{
$c--;
$sql = substr_replace($sql, $this->escape($binds[$c]), $matches[0][$c][1], $ml);
}
while ($c !== 0);
return $sql;
} 复制代码
|
|