Заменить определенные символы в строке из значений массива - PullRequest
0 голосов
/ 03 мая 2019

У меня есть массив:

$arr = [5, "David"];

У меня есть запрос:

$query = "SELECT * FROM users WHERE user_id = ? AND user_name = ?";

Я хочу создать запрос регистратора, который принимает эти 2 и возвращает запрос, вручную.

logger($query, $arr); // returns : SELECT * FROM users WHERE user_id = 5 AND user_name = 'David'

Я использую менеджер капсул eloquent.

Я пытался сделать что-то подобное, но это ничего не заменит:

function logger($query, $arr) {
    foreach($arr as $a) {
        is_numeric($a) ? str_replace("?",$a,$query) : str_replace("?","'".$a."'",$query);
    }
    return $query;
}

Почему этот код не работает?

Ответы [ 2 ]

2 голосов
/ 03 мая 2019

str_replace не изменяет свой аргумент, вместо этого он возвращает измененное значение.Таким образом, вам нужно присвоить его вывод переменной.Однако проблема в том, что str_replace заменит все вхождения шаблона одновременно.Вместо этого вы можете использовать preg_replace, который имеет параметр limit, который можно использовать, чтобы сказать ему заменять только одно вхождение шаблона для каждого вызова.Я использовал шаблон для preg_replace, который обеспечит замену только ? в запросе в случае, если в другом месте есть вопросительный знак, например, в псевдониме столбца.Измените свою функцию следующим образом:

function logger($query, $arr) {
    foreach($arr as $a) {
        $query = is_numeric($a) ? 
            preg_replace("/(?<=\s)\?(?=\s|$)/", $a, $query, 1) : 
            preg_replace("/(?<=\s)\?(?=\s|$)/", "'$a'", $query, 1);
    }
    return $query;
}

Выход:

SELECT * FROM users WHERE user_id = 5 AND user_name = 'David'

Демо на 3v4l.org

1 голос
/ 03 мая 2019

Я узнал, как это сделать, используя str_replace_first и перенеся значение в переменную.

        foreach($params as $a) {
            $query = is_numeric($a) ? str_replace_first("?",$a,$query,1) : str_replace_first("?","'".$a."'",$query);
        }
        return $query;

str_replace_first:

function str_replace_first($search_for, $replace_with, $in) {
  $pos = strpos($in, $search_for);
  if($pos === false) {
    return $in;
  } else {
    return substr($in, 0, $pos) . $replace_with . substr($in, $pos + strlen($search_for), strlen($in));
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...