PHP用数组中的字符串替换字符
Posted
技术标签:
【中文标题】PHP用数组中的字符串替换字符【英文标题】:PHP Replace character with string from an array 【发布时间】:2019-03-21 10:44:40 【问题描述】:对于 mysql,我使用格式:
$sql = "select * from table where area_id = ? and item_id = ?";
然后准备并绑定参数等。如果查询失败并且我记录了 $sql 变量,那么我得到的正是上面的字符串,它不是那么有用。我想要的是带有绑定值的 sql 字符串。据我了解,没有简单的方法可以做到这一点,所以我想我可以这样做:
sql_log(str_replace('?', array($area_id, $item_id), $sql));
要在我的日志中得到这样的东西:
"select * from table where area_id = West and item_id = West" (spot the error!)
所以我知道我的错误是什么。但它不起作用。我明白了:
"select * from table where area_id = Array and item_id = Array"
【问题讨论】:
您是在使用mysqli
还是PDO
来准备您的陈述?
我正在使用 mysqli
这里的解决方案是preg_replace_callback
,因为您的项目始终是?
MySQLi prepared statements error reporting的可能重复
【参考方案1】:
使用preg_replace_callback函数
$sql = "select * from table where area_id = ? and item_id = ?";
$replace = array('area_id', 'item_id');
echo preg_replace_callback('/\?/', function($x) use(&$replace) return array_shift($replace);, $sql);
// select * from table where area_id = area_id and item_id = item_id
【讨论】:
【参考方案2】:不幸的是,mysqli
没有很好的方法来获取查询。您可以使用一种方法来替换您的参数:
function populateSql ( string $sql, array $params ) : string
foreach($params as $value)
$sql = preg_replace ( '[\?]' , "'" . $value . "'" , $sql, 1 );
return $sql;
【讨论】:
【参考方案3】:试试这个:
sprintf('select * from table where area_id = %s and item_id = %s', $area_id, $item_id);
或
sprintf('select * from table where area_id = "%s" and item_id = "%s"', $area_id, $item_id);
如果数据库中的字段是整数,则必须将 %s 替换为 %d 并且不要使用引号
【讨论】:
无法正确绑定! @funnyfish 这个问题不是关于构建一个可行的 sql 查询。这是为了将占位符替换为绑定值,以便存储在错误日志中。【参考方案4】:Laravel 有一个漂亮的助手。
/**
* Replace a given value in the string sequentially with an array.
*
* @param string $search
* @param array $replace
* @param string $subject
* @return string
*/
function replaceArray($search, array $replace, $subject)
$segments = explode($search, $subject);
$result = array_shift($segments);
foreach ($segments as $segment)
$result .= (array_shift($replace) ?? $search).$segment;
return $result;
$sql = 'SELECT * FROM tbl_name WHERE col_b = ? AND col_b = ?';
$bindings = [
'col_a' => 'value_a',
'col_b' => 'value_b',
];
echo replaceArray('?', $bindings, $sql);
// SELECT * FROM tbl_name WHERE col_b = value_a AND col_b = value_b
来源:Str::replaceArray()
【讨论】:
以上是关于PHP用数组中的字符串替换字符的主要内容,如果未能解决你的问题,请参考以下文章