Извлечение значений в скобках из строки запроса MySQL INSERT - PullRequest
0 голосов
/ 27 июня 2019

Нам были переданы тысячи строк запроса MySQL INSERT, например:

$sql = INSERT INTO my_table VALUES ( 123, '456', 'Don't fail', 'hellow world' )

Строки sql были переданы нам в проекте.

Проблема в том, что в некоторых запросах некоторые значения полей имеют одинарные кавычки в середине, поэтому при запуске mysqli_query($sql) выдает ошибку.

В моем примере, если я экранируювся строка $ sql, она также будет экранировать «456» или «не потерпеть неудачу», и это также вызовет ошибку и ошибку, поэтому мне нужно извлечь и экранировать значения по отдельности, а затем поместитьSQL запрос обратно вместе.

Мне нужно извлечь значения из круглых скобок и получить их в массив, чтобы я мог избежать их по отдельности.Примерно так:

$vals[0] = 123
$vals[0] = 456
$vals[0] = Don't fail
$vals[0] = hellow world

Можно ли использовать регулярное выражение?

Я знаю количество столбцов таблицы "my_table".

Есть ли еще какое-нибудь решение?

Спасибо

Ответы [ 2 ]

0 голосов
/ 27 июня 2019

вы хотите быть очень осторожным, вы не получите неожиданных результатов,

<?php

$re = '/\b\'\b/';  // b for word boudry

$str = <<<EOT
$sql = INSERT INTO my_table VALUES ( 123, '456', 'Don't fail', 'hellow world' )
EOT;

$subst = '\\\\\'';

$result = preg_replace($re, $subst, $str);

echo $result;

не будет работать, если вы начинаете или заканчиваете двойным апострофом, IE: $sql = INSERT INTO my_table VALUES ( 123, '456', 'Don't fail', 'hellow worlds'' )

Демо: https://regex101.com/r/Ast9A7/1

0 голосов
/ 27 июня 2019

Вместо того, чтобы пытаться избежать апострофов, вы можете создать шаблон, который соответствует всей строке SQL, и захватить каждое из значений.

$pattern = "/(?:[ \w]+ \() (\d+), '(\d+)', '(.+?)', '(.+?)' \)/";

Затем связать эти значения в качестве параметров с подготовленным оператором для каждогооператоров вставки.

$stmt = $mysqli->prepare('INSERT INTO my_table VALUES (?, ?, ?, ?)');

foreach ($inserts as $insert) {
    preg_match($pattern, $insert, $matches);
    list ($full, $a, $b, $c, $d) = $matches;
    $stmt->bindValue("isss", $a, $b, $c, $d);
    $stmt->execute();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...