[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: запроси в цикле
dadli
здраствуите.
как я знаю сделат мускл запроси в цикле, не хорошая идеа, но есть такои момент: в таблице есть поле text_pole (егo тип TEXT) и он содержит текст в котором есть html теги. хочу чтоб убрать из текста ети теги, сделаю так: вибираю из таблиц текста, в цикле от кождово записа убираю хтмл теги и потом через update наоборот вставливаю в таблице.

Свернутый текст
$res = mysql_query(
"SELECT id,text_pole FROM mytable ") or die(mysql_error());
while($row = mysql_fetch_row($res)) {
$good_text = strip_tags($row[1]);
mysql_query("UPDATE mytable SET text_pole = '".$good_text."' WHERE id = ".$row[0]."") or die(mysql_error());
}


вот вопрос: есть другои способ что обаити похожие ситуации без исползование запроси в цикле, или все ровно придётся так сделать?
и вобшем, запроси в цикле: ето страшнo? или не очен?

_____________


когда чарли чаплин принимал участие в конкурсе: "клон чарли чаплинов", то чарли занимал третю позицию.

Placido
Запросы в цикле - идея плохая, особенно, если записей много.

Лучше выбрать сразу все необходимые поля в массив, потом пройтись по нему функцией strip_tags, а потом одним запросом MySQL обновить все поля таблицы.

Можно обновить и средствами MySQL - создать пользовательскую функцию, потом, используя ее, выбрать записи во временную таблицу, а потом заменить записи из основной таблицы записями из временной.
Placido
Как-то так:

$res = mysql_query('SELECT id, text_pole FROM mytable') or die(mysql_error());
while ($row = mysql_fetch_assoc($res))
{
$good_text[$row['id']] = strip_tags($row['text_pole']);
}
$sql = "UPDATE mytable SET text_pole = CASE ";
foreach ($good_text as $id => $text_pole)
{
$sql .= "WHEN id = ".$id." THEN '".$text_pole."' ";
}
$sql .= " END";
mysql_query($sql) or die(mysql_error());
Placido
Вернее, даже короче:
$res = mysql_query('SELECT id, text_pole FROM mytable') or die(mysql_error());
$sql = "UPDATE mytable SET text_pole = CASE ";
while ($row = mysql_fetch_assoc($res))
{
$sql .= "WHEN id = ".$row['id']." THEN '".strip_tags($row['text_pole'])."' ";
}
$sql .= " END";
mysql_query($sql) or die(mysql_error());
dadli
Placido
спасибо балшое, панятно что ви говорите но допустим в таблице есть 400 000 записеи? в етом случае приемлим ваш варянт?

_____________


когда чарли чаплин принимал участие в конкурсе: "клон чарли чаплинов", то чарли занимал третю позицию.

Placido
Проблема в том, что там запрос будет очень длинный. Можно попробовать изменить переменную max_allowed_packet. По умолчанию она = 1 MB, максимум - 1 GB, если запрос будет меньше, то, возможно, получится, но я не пробовал.
Если нет, то второй вариант. Пишем пользовательскую функцию stip_tags, выбираем данные во временную таблицу, обновляем первую таблицу данными из временной. Этот вариант точно будет рабочим.
dadli
Цитата
Пишем пользовательскую функцию stip_tags, выбираем данные во временную таблицу, обновляем первую таблицу данными из временной.


но здес же всо равно нужно цикл? или я не понимаю чтото?

_____________


когда чарли чаплин принимал участие в конкурсе: "клон чарли чаплинов", то чарли занимал третю позицию.

Placido
Не цикл. Просто будем выбирать во временную таблицу все записи из `mytable`, применяя к полю `text_pole` пользовательскую функцию strip_tags.
Nikitian
Тут нужны регулярки, чтобы в один запрос сделано, но мускуль, насколько я знаю, не поддерживает регулярки ни для чего, кроме выборки. Поэтому в 1 запрос не получится.
Placido
Функция взята за основу с сайта MySQL

DELIMITER $$
DROP FUNCTION IF EXISTS strip_tags $$
CREATE FUNCTION strip_tags( x text) RETURNS text
BEGIN
DECLARE s_start INT UNSIGNED;
DECLARE s_end INT UNSIGNED;
SET s_start = LOCATE('<', x, 1);
IF s_start = 0 THEN RETURN x;
END IF;
REPEAT
SET s_end = LOCATE('>', x, s_start);
SET x = CONCAT(SUBSTRING( x, 1, s_start - 1) ,SUBSTRING(x, s_end + 1)) ;
SET s_start = LOCATE('<', x, 1);
UNTIL s_start < 1 END REPEAT;
RETURN x;
END $$
DELIMITER ;

CREATE TEMPORARY TABLE `temp` SELECT `id`, strip_tags(`text_pole`) as `text_pole` from `mytable`;

UPDATE `mytable` `t1`, `temp` `t2`
SET `t1`.`text_pole` = `t2`.`text_pole`
WHERE `t1`.`id` = `t2`.`id`;
dadli
Placido
Nikitian
ок. спасибо балшое за ответах

_____________


когда чарли чаплин принимал участие в конкурсе: "клон чарли чаплинов", то чарли занимал третю позицию.

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.