PDO 同時使用“命名參數”和“問號參數”報錯

瀏覽:508 發布日期: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);
}

評論(
后面還有條評論,點擊查看>>
广西快3开奖走势图一定牛