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

У меня проблема с этой следующей командой db :: insert.Я хочу использовать массив в MySQL запрос "в ()" раздел, но запятые были экранированы.Как я могу решить эту проблему?

$users = [435,1671,429];
$list = implode("','", $users);

DB::insert("insert into ".
    "rejections (calendar_id, user_id, note, status) ".
    "select id as calendar_id, ?, concat(?), concat(?) ".
    "from calendar ".
    "where DATE(_date) BETWEEN ? AND ? and user_id in (?)", [$admin, $note, $status, $start_date, $end_date, $list]
);

mysql_log: 2019-05-30T16: 28: 51.221007Z 1815 Выполнить вставку в отклонения (calendar_id, user_id, note, status), выберите id как calendar_id,2416, concat ('Комментарий'), concat (1) из календаря, где DATE (_date) МЕЖДУ '2019-05-01' И '2019-05-31' и user_id в ('435 \', \ '1671 \', \ '429')

1 Ответ

0 голосов
/ 30 мая 2019

Быстрое (и грязное) исправление может заключаться в удалении одинарных кавычек в implode() и использовании FIND_IN_SET() вместо IN():

$users = [435,1671,429];
$list = implode(",", $users);

DB::insert("insert into ".
    "rejections (calendar_id, user_id, note, status) ".
    "select id as calendar_id, ?, concat(?), concat(?) ".
    "from calendar ".
    "where DATE(_date) BETWEEN ? AND ? and find_in_set(user_id, ?)"
, [$admin, $note, $status, $start_date, $end_date, $list]);

Обратите внимание, что это может быть медленнее, поскольку индекс для user_id не может быть использован.

Если вы хотите использовать IN() в своем запросе, вам потребуется заполнитель для каждого пользователя:

IN (?,?,?)

, а также привязать каждый идентификатор пользователя

[$admin, $note, $status, $start_date, $end_date, $list[0], $list[1], $list[2]]

Поскольку вы, вероятно, заранее не знаете количество пользователей, вы можете использовать что-то вроде этого:

$users = [435,1671,429];

$usersPlaceholders = array_map(function($id) { return '?'; }, $users);
$usersPlaceholders = implode(',', $usersPlaceholders);
$params = array_merge([$admin, $note, $status, $start_date, $end_date], $users);

DB::insert("
    insert into rejections (calendar_id, user_id, note, status)
    select id as calendar_id, ?, concat(?), concat(?)
    from calendar
    where DATE(_date) BETWEEN ? AND ? and user_id in ($usersPlaceholders)
", $params);
...