Копировать, обработать и вставить в другой столбец mysql?

usergeyv

Знаток
Регистрация
5 Июл 2013
Сообщения
152
Реакции
25
Есть таблица post c множеством строк(более 16тис), там столбец id, title и story.
Вопрос заключается в том, что я добавил еще два столбца title_filtr и story_filtr где хочу брать текст с title, обрабатывать(удалять лишении символы и тд) и вставлять в title_filtr, точно так и для story_filtr.
Это все хочу делать по крону раз в сутки. Наведите меня на то как лучше сделать, что бы не нагружало сервер, что бы пропускало если заполнены title_filtr и тд, буду рад всем идеям,спасибо
 
Есть таблица post c множеством строк(более 16тис), там столбец id, title и story.
Вопрос заключается в том, что я добавил еще два столбца title_filtr и story_filtr где хочу брать текст с title, обрабатывать(удалять лишении символы и тд) и вставлять в title_filtr, точно так и для story_filtr.
Это все хочу делать по крону раз в сутки. Наведите меня на то как лучше сделать, что бы не нагружало сервер, что бы пропускало если заполнены title_filtr и тд, буду рад всем идеям,спасибо
Один из вариантов такой:
Так-как вы хотите там удалять, изменять данные и т.д., то вам нужно сначала при помощи SQL запроса вытащить строки у которых title_filtr и тд - не заполнены. Примерно как-то так:
Код:
SELECT * FROM `post ` WHERE `title_filtr` = '' OR `title_filtr` is NULL OR `story_filtr` = '' OR `story_filtr` is NULL
В зависимости какие у вас по умолчанию значения для столбцов - часть `title_filtr` is NULL или `title_filtr` = '' можно убрать.
16 тис немного, по этому особой нагрузки не будет, если вы правильно индексы создали.
 
Сделал под DLE вот так, посмотрите, что можно доработать
PHP:
$sql = $db->query( "SELECT id, title, title_filtr, full_story FROM dle_post " );
while ($row = $db->get_row($sql)){
$id_news = $row['id'];   
$title_filtr = $row['title_filtr'];
if (empty($title_filtr)) { //    echo '$var или 0, или пусто, или вообще не определена';
$old_title = $row['title'];
$old_title = mb_strtolower(addslashes($old_title), 'UTF-8'); //экранируем спец. символы и переводим в нижний регистр
$old_title = preg_replace("/\s{2,}/"," ",preg_replace("/[^a-zA-ZА-Яа-я0-9\s]/u", " ", $old_title));//удаляем все кроме цифр и букв,удаляем лишние пробелы
$new_title = $old_title; //новый титле


$old_full_story =$row['full_story'];
$old_full_story = strip_tags($old_full_story, '<br><b>');
$old_full_story = str_replace(array("<br/>","<br />","<br>","<b>","</b>"), " ", $old_full_story);
$old_full_story = mb_strtolower(addslashes($old_full_story), 'UTF-8'); //экранир. спец. символы и переводим в нижний регистр
$old_full_story = preg_replace("/\s{2,}/"," ",preg_replace("/[^a-zA-ZА-Яа-я0-9\s]/u", " ", $old_full_story));//удаляем все кроме цифр и букв ,удаляем лишние пробелы
$new_full_story = $old_full_story; //новый фулстори


$str = substr($new_full_story, strrpos($new_full_story,"жанр"));
$a = explode(' ', $str);
//var_dump ($a);
$new_zanr_filtr = $a[1]." ".$a[2]." ".$a[3]." ".$a[4]." ".$a[5]." ".$a[6];//новый жанр

$db->query("UPDATE dle_post SET title_filtr='$new_title',zanr_filtr='$new_zanr_filtr' ,story_filtr='$new_full_story' WHERE id='$id_news'");
}
}

        $db->free();
 
Так-как вы хотите там удалять, изменять данные и т.д., то вам нужно сначала при помощи SQL запроса вытащить строки у которых title_filtr и тд - не заполнены. Примерно как-то так:
SELECT * FROM `post ` WHERE `title_filtr` = '' OR `title_filtr` is NULL OR `story_filtr` = '' OR `story_filtr` is NULL
в моем случаи
PHP:
$sql = $db->query( "SELECT id, title, title_filtr, full_story FROM dle_post WHERE title_filtr = '' OR title_filtr is NULL OR story_filtr = '' OR story_filtr is NULL" );
тогда
Код:
if (empty($title_filtr)) {
не нужна,убрал
 

$sql = $db->query( "SELECT id, title, title_filtr, full_story FROM dle_post " );
собственно добавьте сюда сразу условие выборки, намного быстрее будет:
Код:
$sql = $db->query( "SELECT id, title, title_filtr, full_story FROM dle_post WHERE `title_filtr` = '' ");
$new_zanr_filtr = $a[1]." ".$a[2]." ".$a[3]." ".$a[4]." ".$a[5]." ".$a[6];//новый жанр
Это можно сократить:
Код:
unset($a[0]);
$new_zanr_filtr = implode(' ', $a);//новый жанр
код выше подходит для вас, если вам не нужно использовать первый элемент массива ($a[0]) и последний элемент у вас $a[6]. В противном случае оставьте свой вариант.
Ну и конечный итог:
Код:
<?php
$sql = $db->query( "SELECT id, title, title_filtr, full_story FROM dle_post WHERE `title_filtr` = '' ");
while ($row = $db->get_row($sql)){
    $id_news = $row['id'];   
    $title_filtr = $row['title_filtr'];
    if (empty($title_filtr)) { //    echo '$var или 0, или пусто, или вообще не определена';
        $old_title = $row['title'];
        $old_title = mb_strtolower(addslashes($old_title), 'UTF-8'); //экранируем спец. символы и переводим в нижний регистр
        $old_title = preg_replace("/\s{2,}/"," ",preg_replace("/[^a-zA-ZА-Яа-я0-9\s]/u", " ", $old_title));//удаляем все кроме цифр и букв,удаляем лишние пробелы
        $new_title = $old_title; //новый титле


        $old_full_story = $row['full_story'];
        $old_full_story = strip_tags($old_full_story, '<br><b>');
        $old_full_story = str_replace(array("<br/>","<br />","<br>","<b>","</b>"), " ", $old_full_story);
        $old_full_story = mb_strtolower(addslashes($old_full_story), 'UTF-8'); //экранир. спец. символы и переводим в нижний регистр
        $old_full_story = preg_replace("/\s{2,}/"," ",preg_replace("/[^a-zA-ZА-Яа-я0-9\s]/u", " ", $old_full_story));//удаляем все кроме цифр и букв ,удаляем лишние пробелы
        $new_full_story = $old_full_story; //новый фулстори


        $str = substr($new_full_story, strrpos($new_full_story,"жанр"));
        $a = explode(' ', $str);
        //var_dump ($a);
        unset($a[0]);
        $new_zanr_filtr = implode(' ', $a);//новый жанр

        $db->query("UPDATE dle_post SET title_filtr='$new_title',zanr_filtr='$new_zanr_filtr' ,story_filtr='$new_full_story' WHERE id='$id_news'");
    }
}

        $db->free();
?>
 
Назад
Сверху