Этот вопрос касается синтаксического анализа в PHP, а не о том, как перенести MySQLi в PDO.
Я хочу перенести старый код из MySQLi в PDO.На сайте более 400 строк запросов.Я хочу пересмотреть код для использования подготовленных операторов.
Т.е. преобразовать
$query = 'SELECT * from table where x='.$x.' and y > '.$y.' or (z<= 35 and auth like "%ed")'
$result = $conn->query($query);
в
$query = 'SELECT * from table where x = ? and y > ? or (z <= ? and auth like ?)';
$stmt = $conn->prepare($query);
$stmt->bind_param($x, $y, $35, '%ed');
$stmt->execute();
Я начал с анализа строки запроса $, чтобы найти«где», затем поиск «и» для разделения пар параметр / значение и т. д.
Редактировать : это базовый код для чтения строк в файле (в данном случае, a.php file):
$fn = fopen("myfile.php","r+");
while(!feof($fn)) {
$line = fgets($fn);
if (strpos($line, 'select'){
// add parse code here
};
}
при поиске строки с оператором запроса строка будет буквальной строкой, наподобие этой:
($ line =) $ query ='выберите * в меню, где authlvl> 0 и authlvl <='.$ authlvl.'order by title'; </p>
Тогда , код для анализа может выглядеть примерно так:
$where = substr($line, strpos($line, 'where') + 5);
$pair = array();
$j = 0;
$st = 0;
if (strpos(substr($where, $st), 'and', $st)) > 0){
while (($and = strpos(substr($where, $st), 'and', $st)) > 0){
$pair[$j] = trim(substr($where, $st, $and - 1));
$pair[$j+1] = trim(substr($where, $and + 4));
$st = $and;
$j++;
}
}
$ops = array(' ', '<', '>', '=');
(find operators to identify parameters and values for each pair...)
Это интуитивно неэффективно.Есть ли лучший способ разобрать строку запроса $, чтобы найти параметры, чем этот?Обратите внимание, что в строке может быть «order by» и т. Д., Которые должны просто добавляться после нахождения параметров.