здраствуите.
как я знаю сделат мускл запроси в цикле, не хорошая идеа, но есть такои момент: в таблице есть поле
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
23.11.2011 - 12:49
Запросы в цикле - идея плохая, особенно, если записей много.
Лучше выбрать сразу все необходимые поля в массив, потом пройтись по нему функцией strip_tags, а потом одним запросом MySQL обновить все поля таблицы.
Можно обновить и средствами MySQL - создать пользовательскую функцию, потом, используя ее, выбрать записи во временную таблицу, а потом заменить записи из основной таблицы записями из временной.
Placido
23.11.2011 - 13:31
Как-то так:
$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
23.11.2011 - 13:38
Вернее, даже короче:
$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());
Placido
спасибо балшое, панятно что ви говорите но допустим в таблице есть 400 000 записеи? в етом случае приемлим ваш варянт?
_____________
когда чарли чаплин принимал участие в конкурсе: "клон чарли чаплинов", то чарли занимал третю позицию.
Placido
23.11.2011 - 15:43
Проблема в том, что там запрос будет очень длинный. Можно попробовать изменить переменную max_allowed_packet. По умолчанию она = 1 MB, максимум - 1 GB, если запрос будет меньше, то, возможно, получится, но я не пробовал.
Если нет, то второй вариант. Пишем пользовательскую функцию stip_tags, выбираем данные во временную таблицу, обновляем первую таблицу данными из временной. Этот вариант точно будет рабочим.
Цитата |
Пишем пользовательскую функцию stip_tags, выбираем данные во временную таблицу, обновляем первую таблицу данными из временной. |
но здес же всо равно нужно цикл? или я не понимаю чтото?
_____________
когда чарли чаплин принимал участие в конкурсе: "клон чарли чаплинов", то чарли занимал третю позицию.
Placido
23.11.2011 - 17:34
Не цикл. Просто будем выбирать во временную таблицу все записи из `mytable`, применяя к полю `text_pole` пользовательскую функцию strip_tags.
Nikitian
23.11.2011 - 17:47
Тут нужны регулярки, чтобы в один запрос сделано, но мускуль, насколько я знаю, не поддерживает регулярки ни для чего, кроме выборки. Поэтому в 1 запрос не получится.
Placido
23.11.2011 - 18:27
Функция взята за основу с сайта 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`;
Placido
Nikitian
ок. спасибо балшое за ответах
_____________
когда чарли чаплин принимал участие в конкурсе: "клон чарли чаплинов", то чарли занимал третю позицию.
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.