PDO 同时使用“命名参数”和“问号参数”报错

浏览:545 发布日期:2019/11/21
5.0.0 - 严重 - 未处理
PDO 同时出现“命名参数”和“问号参数”报错
解决方法(参数转换):
在think/db/Connection的query方法前面加上下面代码
$this->solveMixedParams($sql, $bind); //解决PDO混合参数问题


/**
* 解决PDO混合参数问题
* @param String $sql
* @param array $bind
*/
private function solveMixedParams(&$sql, &$bind) {
//判断混合参数
if (strpos($sql, '?') === false || strpos($sql, ':') === false) return ;
$hasNamedParam = false;
$newBind = [];
$search = [];
$replace = [];
foreach ($bind as $k => $v) {
if (!is_numeric($k)) {
$search[] = ':'. $k;
if (is_array($v) && count($v)>1) {
$replace[] = '?';
$newBind[] = $v[0];
} elseif (is_string($v) || is_bool($v) || is_int($v) || is_float($v)) {
$replace[] = '?';
$newBind[] = $v;
} else {
$replace[] = '?';
$newBind[] = null;
}
$hasNamedParam = true;
} else {
$newBind[] = $v;
}
}
if ($hasNamedParam) {
$bind = $newBind;
$sql = str_replace($search, $replace, $sql);
}
unset($newBind, $hasNoParsedParam, $search, $replace);
}

评论(
后面还有条评论,点击查看>>