Задавайте вопросы, мы ответим
Вы не зашли.
Привет всем.
у меня вот такая проблемма
в базе хранится путь к некоторому файлу в виде \path\to\file\filename.ext, таблица в виде table(id, path)
и в php есть переменная
$path = '\path\to\file\';
нужно составить запрос который возвратиль бы все id файлов находашиеся в папке $path.
сам составил такой запрос
$sqlquery = "select `id` from `table` where `path` regexp '".$path."[/w/d]+[[.period.]]/w+' "
но не работает(нет никаких совпадений, хотя есть)
Неактивен
Видимо, проблема в интерпретации обратных слэшей механизмом регулярных выражений в MySQL: они считаются специальными символами и должны быть экранированы, т.к. в связки с некоторыми другими меняют поведение регулярного выражения.
Рассмотрим на примере строки '\path\to\file'.
Последовательность \p с точки зрения POSIX регулярных выражений специальной не является, чего нельзя сказать о \t (табуляция) и \f (что-то еще, не помню).
Поэтому перед применением шаблона все обратные слэши нужно экранировать (возможно, нужно экранировать что-то еще - по-хорошему, должна была быть функция, которая экранирует в строке все спецсимволы POSIX-шаблонов, но её нет, поэтому экранируем вручную те, которые вспомним).
Но обратный слэш является специальным символом не только в POSIX regexp, но и в самой MySQL. Поэтому когда она увидит два подряд идущих обратных слэша, она превратит их в один, и в шаблон снова попадёт только один.
Поэтому перед передачей строки в запрос нужно не только добавить по лишнему слэшу, но и провести экранирование в MySQL - для этого есть функция mysql_real_escape_string().
В итоге запрос должен выглядеть как-то так:
Неактивен
спасибо помогло,
только с
$regex = '^'
. $path
. '[[:alnum:]]+[[.period.]][[:alpha:]]+' ;
Неактивен