SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 08.04.2012 23:37:19

gergia
Участник
Зарегистрирован: 15.03.2011
Сообщений: 16

replace в запросе

Здравствуйте!

Имеем мы следующий запрос к БД

$row = $db->super_query ("SELECT COUNT(*) as count FROM post WHERE title = '$title'");


где title сравнивается с $title и получаем желаемый результат но, нам нужно до этого сравнения из title вырезать некоторые символы а именно эти

пример куска регулярки:
preg_replace('#[\s\.\\\/\+№_\-\\;\:,\!\{\}\)\(\\\%\[\]\|\"\&\'\*\\@\=\#\$\^]+#i', '', $title);


как встроить регулярку в этот запрос чтобы получить то что нам нужно ? если это лучше сделать со стороны PHP то подскажите как ?

Помогите пожалуйста....

Неактивен

 

#2 08.04.2012 23:39:43

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: replace в запросе

Здравствуйте.

В mysql ддстаточно скудный механизм regexp и он не позволяет производить замены, только поиск на соответствие.
Так что лучше сперва на клиенте из $title средствами php вырежьте ненужное тем же preg_replace'ом, и уже модифицированный $titlle подставляйте в запрос.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 08.04.2012 23:54:17

gergia
Участник
Зарегистрирован: 15.03.2011
Сообщений: 16

Re: replace в запросе

deadka написал:

Здравствуйте.

В mysql ддстаточно скудный механизм regexp и он не позволяет производить замены, только поиск на соответствие.
Так что лучше сперва на клиенте из $title средствами php вырежьте ненужное тем же preg_replace'ом, и уже модифицированный $titlle подставляйте в запрос.

Дело в том, что в БД мы имеем поле title и мне нужно с него вырезать эти символы а так-же вырезать с переменной $title, делаем проверка на повтор, вырезать в переменной $title я знаю как но с базы, которая проверяет все поля title - не знаю как sad
Помогите пожалуйста, как мне это сделать ?

Отредактированно gergia (08.04.2012 23:56:24)

Неактивен

 

#4 08.04.2012 23:59:37

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: replace в запросе

С базы поможет вырезать функция, например replace.

Только осторожно это делайте, и обязательно снимите бэкап с таблицы, на всякий случай.
То есть должна быть комбинация запросов примерно таких:

UPDATE `post` SET `title` = replace(`title`, '\%', '');


Или проще сделать так - в цикле на клиенте выбираете записи по одной, приводите title в порядок средствами php - и обновляете запись, заменив кривой title на правильный.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 09.04.2012 00:09:33

gergia
Участник
Зарегистрирован: 15.03.2011
Сообщений: 16

Re: replace в запросе

deadka написал:

С базы поможет вырезать функция, например replace.

Только осторожно это делайте, и обязательно снимите бэкап с таблицы, на всякий случай.
То есть должна быть комбинация запросов примерно таких:

UPDATE `post` SET `title` = replace(`title`, '\%', '');


Или проще сделать так - в цикле на клиенте выбираете записи по одной, приводите title в порядок средствами php - и обновляете запись, заменив кривой title на правильный.

Вы не так меня поняли или я не так объяснил, с самой базы вырезать ничего не нужно, происходит проверка на повтор, мы берем с БД поле title - чистим его от всех символов - потом берем со страницы с формы $title - его тоже чистим от всех символов - после сравниваем друг с другом и если у нас совпадение 1:1 то выдаем просто ошибку - "Повтор!"......

Неактивен

 

#6 09.04.2012 00:16:27

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: replace в запросе

То есть Вам необходимо хранить в базе title со всем этим мусором попутным?
В таком случае я бы рекомендовал все же либо делать проверку на клиенте либо (чего не рекомендую) как-то так:
SELECT COUNT(*) as count FROM post WHERE replace(replace(replace( ... (title, '\%', ''), '\\', '') ...)  = '$title'"
при том, что $title уже почищен на клиенте или придётся его также оборачивать в эту гору replace'ов ).

Есть еще вариант - написать mysql-функцию my_cleaning_function (см. create function), которая почистит строку входную от мусора.
Тогда можно было бы так:
SELECT COUNT(*) as count FROM post WHERE my_cleaning_function(title)  = my_cleaning_function('$title')


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#7 09.04.2012 00:25:13

gergia
Участник
Зарегистрирован: 15.03.2011
Сообщений: 16

Re: replace в запросе

Спасибо deadka!, буду смотреть mysql-функцию my_cleaning_function, если будут еще варианты, пишите пожалуйста.

Неактивен

 

#8 09.04.2012 00:29:25

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: replace в запросе

Ээмм, я, видимо плохо выразился.

функция my_cleaning_function - это Вы должны ее написать :-).

Пример создания функций mysql Вы можете посмотреть здесь. Ну и документацию смотрите, там достаточно подробно.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#9 09.04.2012 20:45:38

gergia
Участник
Зарегистрирован: 15.03.2011
Сообщений: 16

Re: replace в запросе

Чтото у меня ничего не получается, помогите пожалуйста.
Вот рабочий на данный момент весь код:

$row = $db->super_query ("SELECT COUNT(*) as count FROM _post WHERE title = '$title'");
if ($row['count']) $stop .= "Повтор публикации новостей!";


Мне нужно очистить все пробелы и символы от текста, которая находится в переменной $title и в БД поле title и после чего уже сравнивать, потому, что если в переменной $title ($title - это в форме добавления новости на странице) при публикации добавляют один пробел или точку то новость публикуется на сайт и не смотря на то, что слова идентичны, как быть с переменной $title я знаю, это будет выглядеть так:

$titles = $title;
$titles = preg_replace('#[\s\.\\\/\+№_\-\\;\:,\!\{\}\)\(\\\%\[\]\|\"\&\'\*\\@\=\#\$\^]+#i', '', $titles);
$row = $db->super_query ("SELECT COUNT(*) as count FROM _post WHERE title = '$titles'");
if ($row['count']) $stop .= "Повтор публикации новостей!";


а вот как мне быть с полем БД title ? если у нас переменная $titles очищен, тогда также нужно будет очистить и его.

Помогите пожалуйста, я не программист, напишите кусочек кода если можно smile

Неактивен

 

#10 09.04.2012 21:12:33

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: replace в запросе

Ок, вот примерный набросок функции:

DELIMITER $$

DROP FUNCTION IF EXISTS `clear_title` $$
CREATE DEFINER=`deadka`@`%` FUNCTION `clear_title`(title_ varchar(255)) RETURNS varchar(255) CHARSET utf8
    DETERMINISTIC
BEGIN
    DECLARE len INT UNSIGNED;
    DECLARE start_pos INT UNSIGNED;
    DECLARE end_pos INT UNSIGNED;
    DECLARE flg_finish BOOL;

    IF isnull(title_) THEN
        RETURN "";
    END IF;

    SET title_ = trim(title_);

    SET len = length(title_);

    IF 0 = len THEN
        RETURN "";
    END IF;

    SET title_ = replace(title_, '\\', '');
    SET title_ = replace(title_, '\!', '');

    return title_;
END $$

DELIMITER ;


Доведите ее до ума (то есть нужно добавить еще множество таких replace'ов).

И далее в Вашем php-коде нужно будет писать не
$row = $db->super_query ("SELECT COUNT(*) as count FROM _post WHERE title = '$titles'");

а
$row = $db->super_query ("SELECT COUNT(*) as count FROM _post WHERE clear_title(title) = '$titles'");


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson