Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> MySQL делает дубликаты 
V
    Опции темы
Proxy
Дата 24.10.2011, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 24.10.2011

Репутация: нет
Всего: нет



Такая проблема нарисовалась. Написал парсер контента. Алгоритм работы следующий: проходятся все линки на main page, проверяется на дубли, затем заходится на полученные линки топиков собирается инфа, ресайзятся картинки и.т.д. и вся эта "беда" сохраняется в DB. на локальном хосте работает без проблем,  но когда запускаю на хостинге провайдера то после 10-20 адекватных INSERTS 
в DB ложатся дубли. Я подозреваю, что проблема кроется где то в настройках хостинга. Если кто то сталкивался с подобным отпишитесь пожалуйста.

PM MAIL   Вверх
bars80080
Дата 24.10.2011, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 9
Всего: 315



может стоит привести структуру таблицы данных, куда записываются данные?
а заодно и сам запрос? (не в пхп-коде, а реальный mysql)
PM MAIL WWW   Вверх
Proxy
Дата 24.10.2011, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 24.10.2011

Репутация: нет
Всего: нет



Спасибо что откликнулись. Как я уже писал все работает на локальном хосте тоесть не в таблице дело.  Вот код :
Код

CREATE TABLE Dates (
    date_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT ,
    date_title char(50),    
    date_price decimal,
    date_curency char(2),
    date_location char(50),    
    date_coments text,
    date_link char(255),
    date_flag char(30),
    date_nick char(20),
    date_pref text,
    date_date date,
    auctions_id  int unsigned NOT NULL,
    brands_id  int unsigned NOT NULL,
    FOREIGN KEY (brands_id) REFERENCES Brands (brands_id),
    FOREIGN KEY (auctions_id) REFERENCES Auctions (auctions_id)    
)ENGINE=MyISAM CHARACTER SET=utf8;
CREATE TABLE Images (
    images_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT ,
    images_big char(250) NULL,    
    images_small char(250) NULL,
    sponsored_id  int unsigned NULL,
    date_id  int unsigned NULL,
    FOREIGN KEY (sponsored_id) REFERENCES Sponsored (sponsored_id),
    FOREIGN KEY (date_id) REFERENCES Dates (date_id)  
)ENGINE=MyISAM CHARACTER SET=utf8;
CREATE TABLE Deleted (
    id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT ,
    date_flag char(30),
    auctions_id  int unsigned NOT NULL
)ENGINE=MyISAM CHARACTER SET=utf8;
CREATE TABLE Brands (
    brands_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT ,
    brands_name char(50)    
   )ENGINE=MyISAM CHARACTER SET=utf8;


Сам запрос:
Код

$result = mysql_query("INSERT INTO Dates SET
                            date_title = '$title',
                         date_price = '$price',
                         date_curency = '$currency',
                         date_location = '$location',
                         date_link = '$link',
                         date_flag = '$flag',
                         date_nick = '$nick_name',
                         auctions_id = '$aduction_id',
                         brands_id = '$brands_id',
                         date_pref = '$preferences',
                         date_date = '$ddate'                        
                            ",$conn); 


проверка на дубли
Код

$result = mysql_query("SELECT * FROM Dates 
                             WHERE date_flag ='$flag'
                               AND auctions_id = '$auction_id'",$conn);
  
        $num_rows = mysql_num_rows($result);
        
        $result1 = mysql_query("SELECT * FROM Deleted 
                             WHERE date_flag ='$flag'
                               AND auctions_id = '$auction_id'",$conn);
  
        $num_rows1 = mysql_num_rows($result1);
        
    return ($num_rows || $num_rows1);
        


PM MAIL   Вверх
bars80080
Дата 24.10.2011, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 9
Всего: 315



а это точно дампы с внешнего хостинга? а то авось у вас там не MyISAM, а InnoDB
PM MAIL WWW   Вверх
Proxy
Дата 24.10.2011, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 24.10.2011

Репутация: нет
Всего: нет



Я могу ошибаться, но по-моему, если движок не поддерживает MyISAM при создании таблицы такая конструкция не сработает ENGINE=MyISAM.  Возможно, я не совсем точно описал проблему. Скрипт срабатывает по крону 2 раза в день и проверяет источник на обновления. Если обновлений меньше 10-20, то проблема не вылезет (нет дублей в DB), если больше то начинаются дубли причем чем больше информации, тем больше раз заносится в DB дубль . Возможно дело в настройках  хостинга. Буду рад услышать идеи. 
PM MAIL   Вверх
ElGuapo
Дата 24.10.2011, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 1.7.2006

Репутация: нет
Всего: 3



MySQL INSERT работает один раз и не имеет LIMIT'a. Если два раза добавилась запись, значит запрос mysql_query INSERT передан серверу дважды. Какие тут могут быть настройки хостинга? 

Покажите, при каких условиях у вас выполняется приведенный выше запрос. Может, тогда прояснится.
PM MAIL   Вверх
Proxy
Дата 24.10.2011, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 24.10.2011

Репутация: нет
Всего: нет



Вроде как нашел корень бед smile. Вопрос как его "вырвать". Заменил INSERT на  INSERT DELAYED получил отсутствие дублей в  DB  но и отсутствие URL's картинок в связанной тавлице. То биш нет синхронизации между mySQL,  ресайзом и сохранением картинок.  Сейчас попробую блокировать файлы images. Отпишусь потом. Если есть у кого идеи как ркшить проблему, то с меня пиво smile, если тереториально будет возможность пересечся, конечно.
PM MAIL   Вверх
Proxy
Дата 25.10.2011, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 24.10.2011

Репутация: нет
Всего: нет



Цитата(ElGuapo @  24.10.2011,  22:13 Найти цитируемый пост)
MySQL INSERT работает один раз и не имеет LIMIT'a. Если два раза добавилась запись, значит запрос mysql_query INSERT передан серверу дважды. Какие тут могут быть настройки хостинга? 

Покажите, при каких условиях у вас выполняется приведенный выше запрос. Может, тогда прояснится. 


Вот полный код:
Код

<?php
set_time_limit(1800);
require_once ( 'fnc/simple_html_dom.php');
require_once ( 'fnc/db_scrapper_fnc.php');
require_once ('fnc/thumb_fnc.php');
require_once ('../db/db_fns.php');

$brands = array();
$brands = getDbBrands(); //get list of brands for the search
$date_array = array();
$empty_flag = 0;    
$main_url = 'some url';

$html = new simple_html_dom();
/*Main page analazer */
$html->load_file($main_url);
$i =0;
foreach ($html->find('div.tborder') as $main_content) {        
    foreach ($main_content->find('span[id] a') as $topictitle) {
        if ($i != 1) {
            $title = $topictitle->plaintext;
            $link = $topictitle->href;
            $pos = strpos($link, '?');
            $link = substr($link, 0, $pos);        
            $flag = $topictitle->href;
            $pos = strpos($flag, '/topic,');
            $flag = substr($flag, $pos + 7);
            $pos = strpos($flag, '.');
            $flag = substr($flag, 0, $pos);    // topic id
            foreach ($main_content->find('strong') as $nic)        
                $nic_name = $nic->plaintext;            
            
            $aduction_id = getAuctionId('some name');        
            /*Looking for brands in the forum topics*/
            foreach ($brands as $brands_id => $brand_name) {
                if (stristr($topictitle->plaintext, $brand_name)) {
                    if (!checkDbData($flag, $aduction_id)  && !duplicateCheck($date_array, $flag)) {// check duplicate links and check if the flag and auktion id are in database 
                        ++$empty_flag;    
                        $date_array[$flag] = array('title'=>$title,'link'=>$link,'brands_id'=>$brands_id);                    
                    }                    
                }
            }
        }$i++;    
    }    
}
$html->clear(); 
unset($html);
/*ttpic data*/
if($empty_flag) { //if the listing doesen't have new links do nothing
    
    foreach($date_array as $key => $value) {        
        $flag = $key;    
        $title = $date_array[$key]['title'];
        $link = $date_array[$key]['link'];
        $brands_id = $date_array[$key]['brands_id'];        
        $html = new simple_html_dom();
        $html->load_file($main_url . htmlspecialchars_decode($link));//open topic's link
        $nick_name_array = array();
    
        foreach ($html->find('h4 a') as $nick_name_str) {            
                $nick_name_array[] = $nick_name_str->plaintext;                
        }
        
        if(!empty($nick_name_array))
            $nick_name = $nick_name_array[0];
        else 
            $nick_name = '';        
        $price_currency = array('$', '£', '€');
        $images_array = array();
        $counter = 0;
        foreach ($html->find('div.inner') as $content) {
                    
            foreach ($content->find('img') as $img) {
                //echo $img->src.'<br>';
                if(isset($img->src) && !stristr($img->src, '.gif') && !stristr($img->src, ' ') && !stristr($img->src, '%20')) {
                    /*downloading and resize pictures */
                    if($counter < 5) {                        
                        $image_name = imgCreateName();                        
                        $ch = curl_init();                        
                        $fp = fopen ('../'.$image_name, "w"); 
                        curl_setopt($ch, CURLOPT_URL, $img->src);                    
                        curl_setopt($ch, CURLOPT_HEADER, 0);
                        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
                        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
                        curl_setopt ($ch, CURLOPT_FILE, $fp);                     
                        curl_exec ($ch); 
                        curl_close ($ch); 
                        fclose ($fp);        
                        
                        if(is_image('../'.$image_name)) { //if it's a picture resize it
                            if ($counter == 0)
                             imgResizer( '../'.$image_name, '../'.$image_name, 140, 140);
                            else
                             imgResizer( '../'.$image_name, '../'.$image_name, 60, 60);  
                         
                         $images_array[$counter] =  $image_name;    
                         ++$counter;
                        }
                        else {
                            unlink('../'.$image_name);
                        }                     
                    }
                }
                
            }
            $price = '';
            $currency = '';
            $price_str = $content->plaintext;
        
            foreach ($price_currency as $key => $value) {
                if(stristr($price_str, $value)) {
                    $pos = strpos($price_str, $value);
                    $price = substr($price_str, $pos);
                    $pos = strpos($price, ' ');
                    $price = substr($price, 1, $pos);
                    $price = str_replace(' ','',$price);
                    $currency = $value;
                }
            }        
        }
        
        $preferences = '';            
        $location ='';
        if (is_numeric($price) || !empty($images_array)) // insert to db only data that has a picture or doesn't have picture but has a prise value
            addMainDate($flag,$aduction_id,$title,$main_url.$link,$brands_id,$price,$currency,$nick_name,$location,$images_array,$preferences);
        
        $html->clear(); 
        unset($html);
    
    }
}
?>


Код

function addMainDate($flag,$aduction_id,$title,$link,$brands_id,$price,$currency,$nick_name,$location,$images_array,$preferences) {
        
        $aduction_id = addslashes($aduction_id);
        $title = addslashes($title);
        $link = addslashes($link);
        $brands_id = addslashes($brands_id);
        $price = addslashes($price);
        $currency =addslashes($currency);
        $nick_name = addslashes($nick_name);
        $location = addslashes($location);        
        $preferences =    addslashes($preferences);
        $ddate = date("Y-m-d");
        $conn = db_connect();
        $result = mysql_query("INSERT INTO Dates SET
                            date_title = '$title',
                         date_price = '$price',
                         date_curency = '$currency',
                         date_location = '$location',
                         date_link = '$link',
                         date_flag = '$flag',
                         date_nick = '$nick_name',
                         auctions_id = '$aduction_id',
                         brands_id = '$brands_id',
                         date_pref = '$preferences',
                         date_date = '$ddate'                        
                            ",$conn);        
        
            $id = mysql_result(mysql_query("SELECT LAST_INSERT_ID()", $conn), 0);
            
            if($id) {                
                    foreach($images_array as $key =>$im) {
                        
                        if($key == 0) {
                            $result = mysql_query("INSERT DELAYED INTO Images SET
                                        date_id = '$id',
                                     images_big = '$im'                                                     
                                        ",$conn); 
                        }
                        else {
                            $result = mysql_query("INSERT DELAYED INTO Images SET
                                        date_id = '$id',
                                     images_small = '$im'                                                     
                                        ",$conn); 
                        }
                    }
            }        
    }

Проблема возникает только на этом носте и толко если больше 10-20 новых линков. 

PM MAIL   Вверх
Proxy
Дата 26.10.2011, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 24.10.2011

Репутация: нет
Всего: нет



Все решил проблему. Один добрый админ поменял настройки крона и один и тотже скрипт по нескольку раз вызывался. Спосибо всем кто откликнулся smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.0519 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.