PHP Mantığı Sorusu
-
Eğitimini almadan hobi olarak uğraştığım için tam mantığını anlayamıyorum. İnternette baktıklarımdan da anlamadım. O yüzden yardıma ihtiyacım var. Aşağıdaki kod youtubedan videoları çekiyor. Her video çekişinde veritabanını boşaltıp tekrar kaydediyor. Benim isteğim: boşaltmasın, video_id'e baksın eğer veritabanında yoksa veritabanına o bilgileri eklesin istiyorum. Github sayfası: https://github.com/kapil-devplr/trending_youtube Anlattığım kod parçası:
<? include('db_connection.php'); $API_key = 'AIzaSyBlPryS3cIa-ugABVZ361FjqKXXrI7jQN0'; $videoList = json_decode(file_get_contents('https://www.googleapis.com/youtube/v3/videos?part=snippet,statistics&chart=mostPopular®ionCode=TR&maxResults=10&key='.$API_key.'')); //echo '<pre>'; print_r($videoList->items); $sql = "truncate table youtube_tranding_list"; $conn->query($sql); foreach($videoList->items as $item){ $channel = json_decode(file_get_contents('https://www.googleapis.com/youtube/v3/channels?id='. $item->snippet->channelId .'&key='.$API_key.'&part=snippet')); $video_id=mysqli_real_escape_string($conn,$item->id); $video_etag=mysqli_real_escape_string($conn,$item->etag); $video_date=date('Y-m-d h:i:s', strtotime($item->snippet->publishedAt)); $video_title=mysqli_real_escape_string($conn,$item->snippet->title); $video_description=mysqli_real_escape_string($conn,$item->snippet->description); $video_url='https://www.youtube.com/watch?v='.$item->id; $video_thumbnails_default=mysqli_real_escape_string($conn,$item->snippet->thumbnails->default->url); $video_thumbnails_medium=mysqli_real_escape_string($conn,$item->snippet->thumbnails->medium->url); $video_thumbnails_high=mysqli_real_escape_string($conn,$item->snippet->thumbnails->medium->url); $video_viewCount=$item->statistics->viewCount; $video_likeCount=$item->statistics->likeCount; $video_dislikeCount=$item->statistics->dislikeCount; $video_commentCount=$item->statistics->commentCount; foreach($channel->items as $channels){ $channels_title=mysqli_real_escape_string($conn,$channels->snippet->title); $channels_description=mysqli_real_escape_string($conn,$channels->snippet->description); $channels_thumbnail_default=mysqli_real_escape_string($conn,$channels->snippet->thumbnails->default->url); $channels_thumbnail_medium=mysqli_real_escape_string($conn,$channels->snippet->thumbnails->medium->url); $channels_thumbnail_high=mysqli_real_escape_string($conn,$channels->snippet->thumbnails->high->url); } $sql = "INSERT INTO youtube_tranding_list (video_id, video_etag, video_date,video_title,video_description,video_url,video_thumbnails_default,video_thumbnails_medium,video_thumbnails_high,video_viewCount,video_likeCount,video_dislikeCount,video_commentCount,channels_title,channels_description,channels_thumbnail_default,channels_thumbnail_medium,channels_thumbnail_high)VALUES ('$video_id', '$video_etag', '$video_date','$video_title','$video_description','$video_url','$video_thumbnails_default','$video_thumbnails_medium','$video_thumbnails_high','$video_viewCount','$video_likeCount','$video_dislikeCount','$video_commentCount','$channels_title','$channels_description','$channels_thumbnail_default','$channels_thumbnail_medium','$channels_thumbnail_high')"; $conn->query($sql); } $sql = "SELECT video_id, DATE_FORMAT(video_date, '%d/%m/%Y %H:%i:%s') as video_date,video_title,video_url,video_thumbnails_default,video_viewCount,video_likeCount,video_dislikeCount,video_commentCount,channels_title FROM youtube_tranding_list"; if ($result = $conn -> query($sql)) { $srno=1; echo '<table class="table table-hover"> <thead> <tr> <th scope="col">Sr.</th> <th scope="col">Video date</th> <th scope="col">Video title</th> <th scope="col">Video url</th> <th scope="col">Video thumbnails</th> <th scope="col">Statistics</th> <th scope="col">Channel</th> <th scope="col">Details</th> </tr> </thead> <tbody>'; while ($row = $result -> fetch_assoc()) { echo'<tr class="table-success"> <td>'.$srno++.'</td> <td>'.$row['video_date'].'</td> <td>'.$row['video_title'].'</td> <td> <a href="'.$row['video_url'].'" target="_blank">'.$row['video_url'].'</a></td> <td> <img src="'.$row['video_thumbnails_default'].'"> </td> <td width="20%">Video View Count: '.$row['video_viewCount'].'<br> Video like Count: '.$row['video_likeCount'].'<br> Video Dislike Count: '.$row['video_dislikeCount'].'<br> Video Comment Count:'.$row['video_commentCount'].'</td> <td>'.$row['channels_title'].'</td> <th scope="col"><a href="/video_details.php?video_id='.$row['video_id'].'" target="_blank">Details</a></button></th> </tr>'; } echo '</tbody></table>'; } $conn->close(); ?>
-
Selamlar,
Hobi olarak uğraştığınız için tam kod değil ama bilgi paylaşmaya çalışacağım.
6. satırda "truncate table youtube_tranding_list" verileri aldığınız tablonuzu her requestte siliyor. Bu satırı,
$sql= "";
Olarak güncellerseniz hem değişken tanımlanmış olur, hem de eski veriler silinmez. (edit her requestte duplicate verileri de alır veritabanı şişer sadece bilgi olması için paylaştım)
Eğer veritabanında varsa bölümünde ki kontrolü, 9. satırda başlayan foreach içerisinde 35. satırdan önce mümkünse 10. satırda yapmanız gerekiyor.
-
truncate silme tamam da veri varmı bak yoksa kaydet olayını hiç anlamadım
-
turkz bunu yazdı
truncate silme tamam da veri varmı bak yoksa kaydet olayını hiç anlamadım
Şöyle yapabilirsin;
@LevhiMahfuz'un söylediği foreach döngüsü içinde video_id'yi değişkene atadıktan sonra (13. satırdan sonra) araya ufak bir sql sorgusu yaz. Veritabanından o video_id'yi çekmeye çalışsın.
Eğer sonuç dönerse; demekki bu video_id var demektir. Bu durumda foreach'in devam etmesine gerek yok. Geri kalan kısımları atlayıp foreach'in başına dönebilir. (Google -> php continue)
Eğer sonuç dönmezse; demekki bu video_id veritabanında yokmuş. Foreach kendi işini yapmaya devam etsin.
-
bunu tamamen sql de çözebilirsin :
- truncate satırını sil
- tabloda video id sütununu primary key yap
- "insert into" yu "replace into" ile değiştir
-
yolbulucu bunu yazdı
bunu tamamen sql de çözebilirsin :
- truncate satırını sil
- tabloda video id sütununu primary key yap
- "insert into" yu "replace into" ile değiştir
"just overwrites records that have the same PRIMARY KEY or UNIQUE index, however, beware."
Ya primary key'i video idleri değilse?
-
end bunu yazdıyolbulucu bunu yazdı
bunu tamamen sql de çözebilirsin :
- truncate satırını sil
- tabloda video id sütununu primary key yap
- "insert into" yu "replace into" ile değiştir
"just overwrites records that have the same PRIMARY KEY or UNIQUE index, however, beware."
Ya primary key'i video idleri değilse?
-
yolbulucu bunu yazdıend bunu yazdıyolbulucu bunu yazdı
bunu tamamen sql de çözebilirsin :
- truncate satırını sil
- tabloda video id sütununu primary key yap :)
- "insert into" yu "replace into" ile değiştir
"just overwrites records that have the same PRIMARY KEY or UNIQUE index, however, beware."
Ya primary key'i video idleri değilse?
Gözümden kaçmış pardon.
Bu yollardan birisi, fakat eğer primary keyleri ille de nümerik olsun istiyorsa
Update + where kullanabilir bunun yerine.
Row count yapıp if içine alması kafi olacaktır.
-
Cevaplar için teşekkürler. replace into üzerinden şu sayfayı buldum https://stackoverflow.com/questions/1361340/how-to-insert-if-not-exists-in-mysql
INSERT IGNORE INTO
ile yapmak istediğim şeyi yapabildim. -
6-7 satırları silip
veri tabanında video_id yi unique yapabilirsin
35 satır hata verirse try arasına alsan olmazmı
-
wert bunu yazdı
6-7 satırları silip
veri tabanında video_id yi unique yapabilirsin
35 satır hata verirse try arasına alsan olmazmı
Teşekkürler hocam üstte arkadaşların dediği gibi video idyi pk yaptım insert ignore into ile farklı olanı ekliyorum tam istediğim şey buydu.