PHP用数组中的字符串替换字符

PHP用数组中的字符串替换字符,php,mysql,Php,Mysql,对于mysql,我使用以下格式: $sql = "select * from table where area_id = ? and item_id = ?"; 然后准备并绑定参数等。如果查询失败,并且我记录$sql变量,那么我会得到上面没有那么有用的字符串。我想要的是带有中绑定值的sql字符串。据我所知,没有简单的方法可以做到这一点,因此我认为我可以做如下事情: sql_log(str_replace('?', array($area_id, $item_id), $sql)); 要在我的

对于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
没有一个好方法来获取查询。您可以使用一种方法来替换参数:

function populateSql ( string $sql, array $params ) : string {
    foreach($params as $value)
        $sql = preg_replace ( '[\?]' , "'" . $value . "'" , $sql, 1 );
    return $sql;
}
试试这个:

sprintf('select * from table where area_id = %s and item_id = %s', $area_id, $item_id);


如果数据库中的字段是整数%s,则必须将其替换为%d,并且不要使用引号

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

来源:

您是在使用
mysqli
还是
PDO
来准备您的声明?我在使用mysqliSolution这里是
preg\u replace\u callback
,因为您的项目总是
可能的重复项无法正确绑定!
sprintf('select * from table where area_id = "%s" and item_id = "%s"', $area_id, $item_id);
/**
  * 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