数据库插入和删除的解决方案

时间:2013-05-06 04:38:35

标签: php mysql sql

我只想要一个建议或我可以处理情况的方法

我有一个模块,我曾经在这个模块中抓取一个网站并让当前的电影在附近的电影院里运行。我有两个表1)一个用于电影,另一个用于影响电影的电影院,这些电影首先插入电影表。

现在我每天早上都设置我的文件cron Job。因此,在我的代码中,我首先删除两个表中的所有数据并插入新数据。 但是通过这个我通常会放弃最终用户给出的所有评分,特别是电影。

为了克服这种情况,我想到了一些解决方案

我创建了一个新查询

INSERT INTO jos_movie (movie_name, language, cast,movie_release,director,rating,rating_count,movie_ids)
SELECT * FROM (SELECT 'test','null','yahoo','Dec 21, 2012','himmat',250,230,'43677') AS tmp
WHERE NOT EXISTS (
    SELECT movie_name FROM jos_movie WHERE movie_name = 'test')

类似我也为电影桌制作了相同的方法。

通过它,它将检查并不会覆盖表格中的电影。但这种方法存在一些问题。如果电影院老板确实删除了该特定电影的节目,例如“测试”。然后通过上面的查询它不会删除它。它会留在那里。

对于我的主题行感到抱歉,因为我无法为这个问题考虑好主题。

那么如何才能实现一个结果,以便现有的影片在表格中不会得到更新,如果它不在我的脚本的抓取结果数组中就会被删除。

这是我的表格结果

这是电影表结果

enter image description here

这是电影桌

enter image description here

这是我正在使用的代码。         

$con=mysql_connect('localhost','test','test');
mysql_select_db('test',$con);

// Use cURL to get the RSS feed into a PHP string variable.
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,'myrsslink.xml');
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$xml = curl_exec($ch);
curl_close($ch);

$arrData = array();
// Create an array of item elements from the XML feed.
$news_items = element_set('item', $xml);
$del_movie = "delete from jos_movie";
mysql_query($del_movie);

$del_cinema = "delete from jos_cinema";
mysql_query($del_cinema);

foreach($news_items as $item) {
    $title = value_in('title', $item);
    $url = value_in('link', $item);
    $cast = value_in('description', $item);
    //curl_setopt($ch, CURLOPT_URL,$url);
    //curl_setopt($ch, CURLOPT_HEADER, false);
    //curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    //$html = curl_exec($ch);
    $arrTitle = explode('-',$title);
    $html = file_get_html($url);
    $htmlShowTime = '';

    // find all span tags with class=gb1 moviTimes moviTmngBox
    foreach($html->find('ul[style=line-height:2em;]') as $e)
        $htmlShowTime = $e->plaintext;

    $movie_name = $arrTitle[0];

    $apiKey = '30f44b6ef9472d414e50d2acaa058b60';
    $url = sprintf('http://api.themoviedb.org/2.1/Movie.search/en/xml/%s/"%s"',$apiKey,rawurlencode(trim($movie_name)));

    //$xml = simplexml_load_file("http://api.themoviedb.org/2.1/Movie.search/en/xml/accd3ddbbae37c0315fb5c8e19b815a5/"$movie_name"");
    $xml = simplexml_load_file($url);
    $movies = $xml->movies->movie;
   foreach ($movies as $movie){
        $arrMovie_id = $movie->id;
    }
    $arrStr = explode(':',$htmlShowTime);
    $release = substr($arrStr[3],0,strlen($arrStr[3])-8);
    $director = substr($arrStr[5],0,strlen($arrStr[5])-11); 

    $sql_movie = "insert into jos_movie(movie_name,language,cast,movie_release,director,rating,rating_count,movie_ids)values('$movie_name','null','$cast','$release','$director',250,230,'$arrMovie_id')";
    //echo $sql.'<br>';
   // echo $sql_movie;

    mysql_query($sql_movie);

    $sqlCount = 'select max(id) from jos_movie' or die("cannot select DB");
    $data = mysql_query($sqlCount);
    echo $data;
    print_r($data);
    $result = mysql_fetch_array($data);
    $id = $result[0];
    echo '<br>'.$id.'<br>'; 

    //$id = mysql_insert_id();
    //echo $id;

        // find all span tags with class=gb1
    foreach($html->find('div.moviTmngBox') as $e){
        $tagTitle =  $e->find('a',0);
        $tagTime  = $e->find('div.moviTimes',0);
        $name = $tagTitle->title;
        $time = $tagTime->innertext;

    $trimName = '';
    $temName = strtolower(str_replace(' ','',$name));

    if(strpos($temName,'indraaudi1') !== false)
      $trimName = 'Indra Audi 1' and  $cinemaId = '1' and $long='32.726602' and $lat='74.857026';
    elseif(strpos($temName,'indraaudi2') !== false)
     $trimName = 'Indra Audi 2' and $cinemaId = '2'and $long='32.726602' and $lat='74.857026';
    elseif(strpos($temName,'indraaudi3') !== false)
      $trimName = 'Indra Audi 3'and $cinemaId = '3' and $long='32.726602' and $lat='74.857026';
    elseif(strpos($temName,'apsra') !== false)
      $trimName = 'Apsra' and $cinemaId = '4' and $long='32.700314' and $lat='74.858023';
    else{
        $trimName = trim(substr($name,18,strlen($name))) and $cinemaId = '5' and $long='32.7300' and $lat='74.8700' ;
    }

        //echo $tagTime->innertext.'<br/>';
        $sql = "insert into jos_cinema(cinema_name,show_time,movie_id,cinemaId,logitude,latitude)values('$trimName','$time',$id,$cinemaId,$long,$lat)";
        //echo $sql.'<br/>';
        mysql_query($sql);
        //$arrTem = array($tagTitle->title,$tagTime->innertext);

    }

}//end rss feed loop

?>

请注意,我不会在电影中插入默认的评分值。

由于

3 个答案:

答案 0 :(得分:1)

首先创建一个良好的数据库结构: -

  1. 创建一个ID以唯一地定义表格中的每部电影。
  2. 规范化表格结构。意味着将电影细节和活动电影列表保存在单独的表中(active_movies)。请点击以下链接获取更多信息 Normalization in MYSQL

  3. 只需更新活动影片表,而不是一次又一次地为同一部影片更新完整的行。

  4. 保留所有电影的数据资料备份,以便将来帮助您显示一年内发布的所有电影的列表和详细信息,包括特定演员阵容或等级4等等。
  5. 良好的数据库结构将使您的代码更简单,易于实现。 几个有用的链接 http://searchbusinessintelligence.techtarget.in/tutorial/Database-normalization-in-MySQL-Four-quick-and-easy-steps

答案 1 :(得分:1)

可能最好配有一个临时桌。

1)加载所有数据

2)删除临时表中未存在的所有内容

3)更新存在/加入临时表的位置

4)将NOT EXISTS插入适当的表格

最后2个可能是用MERGE语句完成的,或者更好的是,你的RDBMS附带的ETL工具

说实话,你的数据模型并不是特别清楚。

答案 2 :(得分:1)

理想情况下,评级信息应该已经分开,以便电影评级信息可以与电影信息分离。但是,如果这不是您可以在您的情况下实施的,我将采取以下两个步骤。

识别已删除的电影并将其从影片表中删除(假设您的新电影信息位于movie_new表中)

DELETE y.*
  FROM
      (
       SELECT a.movie_name
         FROM jos_movie a
         LEFT OUTER JOIN movie_new b
           ON a.movie_name = b.movie_name
        WHERE b.movie_name IS NULL
      ) x, tbl_issue y
WHERE x.movie_name = y.movie_name

将新电影添加到电影桌。

INSERT INTO jos_movie
SELECT b.*
  FROM jos_movie a
 RIGHT OUTER JOIN movie_new b
    ON a.movie_name = b.movie_name
 WHERE a.movie_name IS NULL

我猜你可以采取相同的步骤到另一张桌子。