За последние 24 часа нас посетили 16108 программистов и 1666 роботов. Сейчас ищут 875 программистов ...

Поиск определенных символов перед и после переменн

Тема в разделе "Прочие вопросы по PHP", создана пользователем phpProc, 25 окт 2014.

  1. phpProc

    phpProc Новичок

    С нами с:
    25 окт 2014
    Сообщения:
    9
    Симпатии:
    0
    Уважаемые форумчане, очень надеюсь на вашу помощь. У самого уже голова кипит.
    Есть код:

    Код (Text):
    1.  
    2. $namenew = 'hello2';
    3. $name = 'Hello';
    4. $query = "UPDATE posters SET `poster` = REPLACE(`poster` , '{$name}', '{$namenew}')";
    Этот запрос находит в поле poster $name и меняет ее на $namenew.
    Все бы хорошо, НО:
    В поле poster может быть следующие данные:
    привет, бла-бла-бла <a href='ссылка'>Hello</a>... или такое:
    [ php ]
    <?php
    echo 'Hello';
    ?>
    [ /php ]
    Так вот, нужно проверить , находиться ли слово из переменной $name(в нашем случае Hello) между определенных тегов. В нашем случае:
    <a href='ссылка'> и </a> или [ php ] и [ / php ].
    И если находиться, то не менять.
    P.S. php - теги без пробелов
    Скажите как это сделать?
     
  2. metadon

    metadon Активный пользователь

    С нами с:
    6 фев 2006
    Сообщения:
    779
    Симпатии:
    0
    Может добавить WHERE poster NOT_LIKE "<a href='ссылка'>(*)</a>" OR poster NOT_LIKE "php(*)php"
     
  3. phpProc

    phpProc Новичок

    С нами с:
    25 окт 2014
    Сообщения:
    9
    Симпатии:
    0
    Спасибо. Но думаю не получиться, поскольку там может быть уже записанно <a href='ссылка'>А здесь здругое которое не нужно убирать</a>

    Добавлено спустя 10 минут 22 секунды:
    И как использовать WHERE с UPDATE?
    Можете на моем примере показать?
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    стыдно такие вопросы задавать. есть же официальный мануал по вашей СУБД.
     
  5. metadon

    metadon Активный пользователь

    С нами с:
    6 фев 2006
    Сообщения:
    779
    Симпатии:
    0
    В одном запросе можно совместить несколько условий:
    Код (Text):
    1. UPDATE posters SET `poster` = REPLACE(`poster` , '{$name}', '{$namenew}') WHERE poster NOT_LIKE "<a href='ссылка'>%$name%</a>" OR poster NOT_LIKE "php%$name%php";
    проверяйте чтобы $name не ломала sql ситаксис
     
  6. phpProc

    phpProc Новичок

    С нами с:
    25 окт 2014
    Сообщения:
    9
    Симпатии:
    0
    Я не очень в SQL силен. Скажите а как в <a href='ссылка'> подставить любое значение? Я так понимаю * - звездочку?
     
  7. metadon

    metadon Активный пользователь

    С нами с:
    6 фев 2006
    Сообщения:
    779
    Симпатии:
    0
    в поиске напиши: регулярные выражения тег a href
     
  8. phpProc

    phpProc Новичок

    С нами с:
    25 окт 2014
    Сообщения:
    9
    Симпатии:
    0
    SQL ломается...
    $name = <a href=ссылка>ссыль</a>
    Ответ:
    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 '<a href=ссаль>ссыль</a>) WHERE article NOT_LIKE "<a' at line 1

    Добавлено спустя 16 секунд:
    Я так понимаю это из-за пробела в <a

    Добавлено спустя 6 минут 49 секунд:
    аа нет, не из-за пробела
     
  9. metadon

    metadon Активный пользователь

    С нами с:
    6 фев 2006
    Сообщения:
    779
    Симпатии:
    0
    Посмотри какие символы нужно экранировать в mysql
     
  10. phpProc

    phpProc Новичок

    С нами с:
    25 окт 2014
    Сообщения:
    9
    Симпатии:
    0
    Все равно не получается.
    mysql_real_escape_string($name);
    я это добавил правильно?
     
  11. metadon

    metadon Активный пользователь

    С нами с:
    6 фев 2006
    Сообщения:
    779
    Симпатии:
    0
    Вот есть кусок на который ругается NOT_LIKE "<a href='ссылка'>%$name%</a>"
    экранируем параметр функции NOT_LIKE: mysql_real_escape_string("<a href='ссылка'>%".$name."%</a>");
     
  12. phpProc

    phpProc Новичок

    С нами с:
    25 окт 2014
    Сообщения:
    9
    Симпатии:
    0
    Я конечно извиняюсь, но я уже так с этим запросом запутался. Можете мне полностью написать весь запрос. Пожалуйста...
    Начиная с $query
    Очень буду благодарен.
     
  13. metadon

    metadon Активный пользователь

    С нами с:
    6 фев 2006
    Сообщения:
    779
    Симпатии:
    0
    tt на mysql_real_escape_string замените, но лучше это http://php.ru/manual/mysqli.real-escape-string.html

    Код (Text):
    1. $name = 'john';
    2. $namenew = 'SMITH';
    3. function tt($str)
    4. {
    5.     return $str;
    6. }
    7.  
    8. $query = "UPDATE posters SET `poster` = REPLACE(`poster` , '{".$name."}', '{".$namenew."}') WHERE poster NOT_LIKE \"".tt("<a href='ссылка'>")."%".tt($name)."%".tt("</a>")."\" OR poster NOT_LIKE \"php%".tt($name)."%php\";";
    9. echo $query;
     
  14. phpProc

    phpProc Новичок

    С нами с:
    25 окт 2014
    Сообщения:
    9
    Симпатии:
    0
    Щяс сдохну
    Запрос:
    UPDATE posters SET `posters` = REPLACE(`poster` , '{Kohana}', '{Kohana}') WHERE poster NOT_LIKE "%Kohana%" OR poster NOT_LIKE "php%Kohana%php";
    Ошибка:
    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 'NOT_LIKE "%Kohana%" OR article NOT_LIKE "php%Kohana' at line 1
     
  15. metadon

    metadon Активный пользователь

    С нами с:
    6 фев 2006
    Сообщения:
    779
    Симпатии:
    0
    Код (Text):
    1. CREATE TABLE IF NOT EXISTS `posters` (
    2.   `id` int(11) NOT NULL AUTO_INCREMENT,
    3.   `poster` text NOT NULL,
    4.   PRIMARY KEY (`id`)
    5. ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;
    6.  
    7.  
    8. INSERT INTO `posters` (`id`, `poster`) VALUES
    9. (1, 'Hello'),
    10. (2, '<a href=''http://example.ru''>Hello</a>'),
    11. (3, '<?php echo ''Smith'' ?>');
    Код (Text):
    1. $name = "Hello";
    2. $namenew = "Bye";
    3. $query = "UPDATE `posters` SET `poster`= REPLACE(`poster` , '".$mysqli->real_escape_string($name)."', '".$mysqli->real_escape_string($namenew)."') WHERE `poster` = '".$mysqli->real_escape_string($name)."' ";
     
  16. phpProc

    phpProc Новичок

    С нами с:
    25 окт 2014
    Сообщения:
    9
    Симпатии:
    0
    Ааааа черт! Я не посмотрел код, а просто вставил и увидел , что все работает. Но когда разобрался понял что совсем не так((
    Этот запрос просто меняет поле с название переменной, но если в поле есть пробел, то он не меняет ее.(((
     
  17. metadon

    metadon Активный пользователь

    С нами с:
    6 фев 2006
    Сообщения:
    779
    Симпатии:
    0
    Есть такие (1, ' Hello'), (2, ' Hello test test'), ?

    Можно по говнокодить
    Код (Text):
    1. $query = "UPDATE `posters` SET `poster`= REPLACE(`poster` , '".$mysqli->real_escape_string($name)."', '".$mysqli->real_escape_string($namenew)."') WHERE `id` NOT IN (SELECT `id` FROM (SELECT `posters`.`id` FROM  `posters` WHERE poster LIKE  '<a href=\'http://example.ru\'>%".$mysqli->real_escape_string($name)."%</a>') AS A )";
    http://dev.mysql.com/doc/refman/5.0/en/string-functions.htm ... on_replace

    Код (Text):
    1. mysql> SELECT REPLACE('www.mysql.com', 'w', 'Ww');
    2.         -> 'WwWwWw.mysql.com'
     
  18. phpProc

    phpProc Новичок

    С нами с:
    25 окт 2014
    Сообщения:
    9
    Симпатии:
    0
    Этот код не работает. Пока я с ума не сошел. Я спать, и всем того же желаю.
    В любом случае, тебе metadon большущее спасибо.
     
  19. metadon

    metadon Активный пользователь

    С нами с:
    6 фев 2006
    Сообщения:
    779
    Симпатии:
    0
    Потом выложи дамп mysql базы, так как те запросы которые я написал, они работают на тестовой базе которую я выше выложил