Laravel 5.7 - построитель запросов не экранирует кавычки или обратный слеш при использовании updateOrInsert () - PullRequest
0 голосов
/ 22 марта 2019

У меня есть массив с некоторыми строками и специальным символом в значениях.

Если я использую метод вставки, он работает хорошо.

$result = DB::connection('host1')->table('tblName')->insert($data);

Если я использую метод обновления, он работает хорошо.

$result = DB::connection('host1')->table('tblName')->where('id',$data['id'])->update($data);

Но если я использую метод updateOrInsert, он не будет работать. Кажется, это старая проблема .

$result = DB::connection('host1')->table('tblName')->updateOrInsert([
            'id'=>$data['id'],
            $data
        ]);

Это ошибка, которую я получаю:

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'No Annual Fee `1` = ?)) as `exists`' at line 1 (SQL: select exists(select * from `tblName` where (`id` = 56429444 No Annual Fee `1` = 56429444)) as `exists`)

Похоже, я мог бы решить проблему с помощью addslashes() при использовании SQL EXISTS .. Возможно, первый запрос для этого метода.

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

foreach ($data as $k=>$v){
   $dt[$k]=addslashes($v);
}

Есть идеи, как решить эту проблему, используя updateOrInsert?

1 Ответ

1 голос
/ 22 марта 2019

Сигнатура функции:

updateOrInsert(array $attributes, array $values = [])

Таким образом, вы должны отделить массив $attributes, который проверяется на наличие, от массива $values, что-то вроде этого:

$result = DB::connection('host1')->table('tblName')
          ->updateOrInsert(['id'=>$data['id']], $data);
...