У меня есть базовая CMS, где пользователь может обновлять базу данных статей, и для некоторых дополнительных функций он использует простой набор BBCodes.
В основном пользователь вводит информацию о статье в форму HTML, а затем нажатием кнопки «Опубликовать» запрос AJAX отправляется скрипту PHP на сервере, который использует Regex для преобразования BBCodes в HTML, а затем сохраняет информацию в базе данных с помощью MySQL.
Моя проблема – неудачная, потому что она пришла сразу после решения другого, и ее очень сложно отлаживать, поскольку это сценарий на стороне сервера, и я не получаю никаких сообщений об ошибках.
У меня возникли проблемы с Regex, особенно с более сложными тегами. Мне удалось получить теги [link = URL] FOOBAR [/ link], чтобы их правильно совместить, а затем заменить их на FOOBAR. По какой-то причине, однако, это теперь заставило скрипт либо зависать, либо терпеть неудачу, либо что-то, потому что я ничего не обновляю в базе данных, когда он содержит теги [link].
В целях отладки ранее, когда я хотел, чтобы SQL работал, у меня был скрипт PHP, возвращающий значение функции mysql_query (), которая, как я полагаю, является «1», когда она успешна, и «0», когда она выходит из строя. Теперь, однако, он просто ничего не возвращает … и HTTPRequest получает строку длиной 0.
Вот код:
$post = $_POST['post']; $regex = Array('#(\r?\n)#', '#(\[(\/?)(b|i|u)\])#', '#\[link=(http://(www.)?.*?)\](.*?)\[/link\]#', '#(\[youtube\][http://www.youtube.com/watch?v=]?(\w+)[&\w+]?\[/youtube\])#', '#(\[img\](http://[www.]?[\w+])\[/img\])#'); $regReplace = Array('<br />', '<$2$3>', '<a href="$1">$3</a>', '<div class="media"><iframe title="YouTube video player" width="560" height="315" src="http://www.youtube.com/embed/$2" frameborder="0" allowfullscreen></iframe></div>', '<div class="media"><img width="560" src="$2" /></div>'); $post = preg_replace($regex, $regReplace, $post); echo mysql_query('INSERT INTO News VALUES (NULL, "'.Date('D jS M').'", "'.Date('G:i').'", "'.$_POST['heading'].'", "'.$post.'")');
Я знаю, что регулярные выражения IMG и Youtube не работают …
Здесь есть несколько вопросов. Указанная ошибка связана с тем, что она не ускользает от котировки в строке параметров с обратной косой чертой + цитатой. Кроме того, стандарт SQL использует одиночную кавычку, поэтому, даже если двойная кавычка возможна, лучше использовать одиночную кавычку. И тогда есть огромная утечка безопасности, SQL-инъекция , с которой ваш сайт может быть взломан (отображаются базы данных и файлы).
Посмотрите на подготовленные заявления, которые также разрешают срыв цитаты.