Aller au contenu

Création historique des titres diffusés


casa36

Messages recommandés

Bonjour,

 

Je suis en train de réaliser un nouveau site pour la radio où je suis bénévole (chut ! c'est une surprise), et j'aimerais comme sur l'ancien qu'il y est un système d'historique de titres. Malheureusement n'étant pas super doué en dev (voir même allergique je dirais), je ne peux rien récupérer de l'ancien CMS pour avoir une base car le code source est chiffré... Le futur site utilise wordpress.

 

Mais je pense que ça ne doit pas être super compliqué à réaliser. J'ai déjà mis en place l'envoi du titre en cours dans un fichier txt avec webradiotools.

 

Je pensais donc lire ce fichier à intervalle régulier, et stocker la liste des 30 dernières chansons (c'est bien suffisant à mon avis) dans un autre fichier puis afficher le tout sur le site, avec un peu de css pour embellir le tout. Un affichage de l'heure avant le titre serait un plus si c'est possible.

 

Pour le moment, j'ai écrit ça : (oui je sais c'est très simpliste)

<?php$fp = fopen ("title.txt", "r");$contenu_du_fichier = fgets ($fp);$cheminHisto = 'histo.txt';$titre = fopen($cheminHisto, 'w+');fputs($titre, $contenu_du_fichier);fclose($titre);fclose ($fp);?>

Il faut maintenant que ça fasse une liste (en gros un simple retour à la ligne) dans la limite de 30, et je n'arrive pas  trouver la fonction kivabien... J'ai essayé avec :

fputs($titre, "\n");fputs( $titre, $contenu_du_fichier);

Mais ça se contente de dupliquer le même titre sur 2 lignes comme je le pensais. Et j'ai eu beau chercher, je n'ai pas trouvé d'exemple de ce que je veux faire...

 

Merci d'avance

Lien vers le commentaire
Partager sur d’autres sites

Remplace le w+ par r+ ou a+,

$titre = fopen($cheminHisto, 'r+');

Cela marchera et continuera d'écrire à la fin de fichier au lieu de le remettre à zero. Après, tu lis seulement les 30 dernière lignes de ce fichier et hop. Tu peux utiliser r+ pour écrire au lieu de a+ pour écrire au début du fichier.

 

Pour résumer,

  • w+ remet le contenu de ton fichier à zero et écrit dedans,
  • a+ écrit le contenu à la fin du fichier,
  • r+ écrit le contenu au début du fichier.

 

Après ce n'est ni optimal, ni propre. Il est préférable plutôt d'utiliser une base de donnée.

Lien vers le commentaire
Partager sur d’autres sites

Alors ça fonctionne bien et ça n'efface pas, problème, si j'actualise le script ça recopie la même chose tant que ça ne passe pas au titre suivant... comment empêcher ça ? est-ce qu'avec un truc comme if $titre=same else nocopy ? Quel sont les bonnes fonctions par contre ?

 

D'autre part si je ne mets pas fputs($titre, "\n"); ça colle les titres les uns aux autres et dans ce cas ça ne marche qu'avec a+ qui écrit le plus récent en fin de fichier.

Lien vers le commentaire
Partager sur d’autres sites

Je crois avoir trouvé pour rafraîchir le script d'historique au bon moment : quand le script de webradiotools est déclenché. J'ai essayé en intercalant un refresh dans le code mais ça ne fonctionne pas.... Par contre si j’appelle le script de WRT via le navigateur, là ça m'affiche bien au bout du temps défini mon script d'histo avec la chanson. Du coup je ne comprends pas pourquoi c'est pas pris en compte quand la chanson est mise à jour.

 

Même en le calant à déférents endroits, toujours rien...

 

Le code que je voudrais incorporer :

$delai=1; $url='http://monsite.com/wordpress/player/histo.php';header("Refresh: $delai;url=$url");

Le code de WRT :

<?php/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////    WebRadioTools      /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  http://www.webradiotools.org   ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////$file_title    ='title.txt';    // CHMOD 777$file_broadcast='emission.txt'; // CHMOD 777$file_onair    ='onair.xml';    // CHMOD 777if ((isset($_POST['titre'])) || ((isset($_POST['emission_titre'])) && (isset($_POST['emission_debut'])) && (isset($_POST['emission_duree'])) )){  if ((isset($_FILES['data']['name'])) && (isset($_FILES['data']['tmp_name'])))  {    @unlink($file_onair);    fclose(fopen($file_title, "w+"));    if ($zip = zip_open($_FILES['data']['tmp_name']))    {      while ($zip_entry = zip_read($zip))      if (zip_entry_open($zip, $zip_entry, "r"))      {        if( preg_match( '#^.*#', dirname(zip_entry_name($zip_entry)) ) )        {          if ($fd = @fopen($file_onair, 'w+'))          {            fwrite($fd, zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)));            fclose($fd);          }          zip_entry_close($zip_entry);        }      }    }  }     if (isset($_POST['titre']))  {    $title=stripslashes(trim($_POST['titre']));    if ($title!='')    {      if (file_exists($file_title)) {@unlink($file_title);}      fclose(fopen($file_title, "w+"));      $file = fopen($file_title, 'r+');      fwrite($file, $title);      fclose($file);    }  }  if ((isset($_POST['emission_titre'])) && (isset($_POST['emission_debut'])) && (isset($_POST['emission_duree'])))  {    $next_broadcast=stripslashes(trim($_POST['emission_titre']));    $next_broadcast_timestamp_start=stripslashes(trim($_POST['emission_debut']));    $next_broadcast_timestamp_end=stripslashes(trim($_POST['emission_duree']));    if (file_exists($file_broadcast)) {@unlink($file_broadcast);}    fclose(fopen($file_broadcast, "w+"));    $file = fopen($file_broadcast, 'r+');    fwrite($file, $next_broadcast_timestamp_start."\n");    fwrite($file, $next_broadcast_timestamp_end."\n");    fwrite($file, $next_broadcast);    fclose($file);   }}else{  // You can edit this PHP file from here... // Vous pouvez éditer ce fichier PHP à partir d'ici...  $sautligne='<br/>';  $mode=trim($_GET['mode']);  if (($mode=='titre') || ($mode==''))     if ((file_exists($file_title)) && ($title=readfile($file_title)))     {        echo $title[0];        if ($mode=='') echo $sautligne.$sautligne;     }  if (($mode=='emission') || ($mode==''))     if (file_exists($file_broadcast))     {      $file = fopen($file_broadcast, 'r+');      $heure=fgets($file);      if ($heure!=-1)      {        echo date('l d/m H:i', $heure).' - '.fgets($file).' mn'.$sautligne;        echo fgets($file).$sautligne.$sautligne;      }      fclose($file);     }  // ... to here  // ... jusqu'ici}
Lien vers le commentaire
Partager sur d’autres sites

Alors j'ai bien avancé :  j'ai trouvé comment stocker les titres dans la base et les afficher de nouveau, ainsi que le rajout de l'heure avant. Du coup je vais abandonner le ficher texte car il trop contraignant notamment concernant la mise en forme, je ne peux pas modifier la police par exemple, juste changer la couleur et l'alignement quand je l’appelle via php ou la balise objet.

 

Avec la base toutes ces contraintes disparaissent.

 

J'ai même réussi à intégrer tout ça au script de WRT, à chaque fois que ça change de titre, ça inscrit le titre précédent à la base :cool: Par contre j'ai cherché pour afficher le tout en inversant (le plus récent en premier), j'ai trouvé des exemples, mais je n'arrive pas à l’intégrer avec ma requête.

 

Il me reste plus que la limitation à 30 titres et ça sera bon :)

 

Voici le code que j'utilise :

<?php$date = date("H:i");$fp = fopen ("title.txt", "r");$titre = fgets ($fp);try{    $bdd = new PDO('mysql:host=localhost;dbname=player;charset=utf8', 'username', 'password');}catch(Exception $e){        die('Erreur : '.$e->getMessage());}$req = $bdd->prepare('INSERT INTO player(heure, titre) VALUES(:heure, :titre)');$req->execute(array(    'heure' => $date,    'titre' => $titre,    ));echo 'Le titre a bien été ajouté !';?>

Le code pour la lecture :

<?phptry{    // Connexion MySQL        $bdd = new PDO('mysql:host=localhost;dbname=player;charset=utf8', 'username', 'password');}catch(Exception $e){    // erreur        die('Erreur : '.$e->getMessage());}// Récupération contenu base$reponse = $bdd->query('SELECT * FROM player');// Affichage entrée une à unewhile ($donnees = $reponse->fetch()){?><link rel="stylesheet" href="style.css" />    <p>   <?php echo $donnees['heure']; ?> <?php echo $donnees['titre']; ?><br />   </p><?php}$reponse->closeCursor(); // Terminé?>

Pour l'ordre inverse j'ai trouvé cet exemple :

$sql = "SELECT * ORDER BY Date DESC LIMIT 20";$req = mysql_query($sql);for($i = mysql_num_rows($req) - 1 ; $i >= 0 ; --$i) {if (!mysql_data_seek($result, $i)) {echo "Cannot seek to row $i: " . mysql_error() . "\n";continue;}if (!($row = mysql_fetch_assoc($result))) {continue;}echo $row['last_name'] . ' ' . $row['first_name'] . "<br />\n";}

Intégré à WRT :

<?php/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////    WebRadioTools      /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  http://www.webradiotools.org   ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////$date = date("H:i");$fp = fopen ("title.txt", "r");$titre = fgets ($fp);$file_title    ='title.txt';    // CHMOD 777$file_broadcast='emission.txt'; // CHMOD 777$file_onair    ='onair.xml';    // CHMOD 777if ((isset($_POST['titre'])) || ((isset($_POST['emission_titre'])) && (isset($_POST['emission_debut'])) && (isset($_POST['emission_duree'])) )){  if ((isset($_FILES['data']['name'])) && (isset($_FILES['data']['tmp_name'])))  {    @unlink($file_onair);    fclose(fopen($file_title, "w+"));    if ($zip = zip_open($_FILES['data']['tmp_name']))    {      while ($zip_entry = zip_read($zip))      if (zip_entry_open($zip, $zip_entry, "r"))      {        if( preg_match( '#^.*#', dirname(zip_entry_name($zip_entry)) ) )        {          if ($fd = @fopen($file_onair, 'w+'))          {            fwrite($fd, zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)));            fclose($fd);          }          zip_entry_close($zip_entry);        }      }    }  }     if (isset($_POST['titre']))  {    $title=stripslashes(trim($_POST['titre']));    if ($title!='')    {      if (file_exists($file_title)) {@unlink($file_title);}      fclose(fopen($file_title, "w+"));      $file = fopen($file_title, 'r+');      fwrite($file, $title);      fclose($file);    }  }  if ((isset($_POST['emission_titre'])) && (isset($_POST['emission_debut'])) && (isset($_POST['emission_duree'])))  {    $next_broadcast=stripslashes(trim($_POST['emission_titre']));    $next_broadcast_timestamp_start=stripslashes(trim($_POST['emission_debut']));    $next_broadcast_timestamp_end=stripslashes(trim($_POST['emission_duree']));    if (file_exists($file_broadcast)) {@unlink($file_broadcast);}    fclose(fopen($file_broadcast, "w+"));    $file = fopen($file_broadcast, 'r+');    fwrite($file, $next_broadcast_timestamp_start."\n");    fwrite($file, $next_broadcast_timestamp_end."\n");    fwrite($file, $next_broadcast);    fclose($file);   }}else{  // You can edit this PHP file from here... // Vous pouvez éditer ce fichier PHP à partir d'ici...  $sautligne='<br/>';  $mode=trim($_GET['mode']);  if (($mode=='titre') || ($mode==''))     if ((file_exists($file_title)) && ($title=readfile($file_title)))     {        echo $title[0];        if ($mode=='') echo $sautligne.$sautligne;     }  if (($mode=='emission') || ($mode==''))     if (file_exists($file_broadcast))     {      $file = fopen($file_broadcast, 'r+');      $heure=fgets($file);      if ($heure!=-1)      {        echo date('l d/m H:i', $heure).' - '.fgets($file).' mn'.$sautligne;        echo fgets($file).$sautligne.$sautligne;      }      fclose($file);     }  // ... to here  // ... jusqu'ici}try{    $bdd = new PDO('mysql:host=localhost;dbname=player;charset=utf8', 'username', 'password');}catch(Exception $e){        die('Erreur : '.$e->getMessage());}$req = $bdd->prepare('INSERT INTO player(heure, titre) VALUES(:heure, :titre)');$req->execute(array(    'heure' => $date,    'titre' => $titre,    ));echo 'Le titre a bien été ajouté !';?>
Lien vers le commentaire
Partager sur d’autres sites

Je bloque sur les 30 chansons maxi, j'ai essayé plusieurs combinaisons mais rien ne marche... voici le code actuel (en l'état pour voir si ça fonctionne ça m'affiche "Array" à la place du nombre de titres, alors qu'en passant par phpmyadmin, la requête donne bien le nombre de lignes).

 

D'autre part je cherche un truc pour remettre à zéro l’incrémentation car quand je supprime le 1 (donc le plus ancien) les autres restent numérotés à partir de 2, hors il faudrait que ça remettre à 1 sinon ça va faire de faire des chiffres énormes au bout d'un moment...

 

J'ai aussi réglé mon problème d'affichage d’ordre inverse avec un SELECT * FROM player ORDER BY id DESC

<?php$date = date("H:i");$fp = fopen ("title.txt", "r");$titre = fgets ($fp);try{    $bdd = new PDO('mysql:host=localhost;dbname=player;charset=utf8', 'user', 'pass');}catch(Exception $e){        die('Erreur : '.$e->getMessage());}$reponse = $bdd->query('SELECT COUNT(*) FROM player');while ($count = $reponse->fetch())echo $count; if ($count > 30);{ $bdd->exec('DELETE FROM player WHERE id=1');$req2 = $bdd->prepare('INSERT INTO player(heure, titre)VALUES(:heure, :titre)');$req2->execute(array(    'heure' => $date,    'titre' => $titre,    ));echo 'Le titre a bien été ajouté !';  }if ($count < 30);{//$req2 = $bdd->prepare('INSERT INTO player(heure, titre)//VALUES(:heure, :titre)');$req2->execute(array(    'heure' => $date,    'titre' => $titre,    ));echo 'Le titre a bien été ajouté !';  }?>
Lien vers le commentaire
Partager sur d’autres sites

Heu, je me suis dis que j'allais te dépanner, mais je comprends rien à ton truc en fait. Et pourtant, je suis développeur (de métier). En fait, j'pige pas ce que t'essaies de faire.

 

Bref, dans ton code, ce que j'en comprends, c'est que tu regardes d'abord combien t'as de titres en base de données. Jusque là, c'est à peu près compréhensible.

Par contre après : 

 

Si strictement + 30 titres alors {

- Tu supprimes le titre qui a un id = 1 

- Tu prépares une requête d'insertion

- Tu exécutes ta requête d'insertion

}

Si strictement - 30 titres alors {

- Tu exécutes ta requête d'insertion

}

 

Au-delà du fait que ton code est "scolaire" et peu optimisé (le echo qui est dupliqué alors qu'il pourrait être uniquement après le 'if then else'), c'est surtout pas juste.

 

Premier point : déjà, si tu as pile 30 éléments renvoyés, ça va s'arrêter tout bonnement d'insérer quoi que ce soit. Tu testes si inférieur ou si supérieur, mais le =30 n'est traité nulle part. 

=> Si tu veux distinguer les 2 situations, fait un simple 'if then else'. Comme ça, le else gérera tous les autres cas sans que tu t'en soucies.

 

Deuxième point : dans la première partie, tu supprimes l'élément qui a un id=1. Techniquement, tu supprimes la ligne de la table qui a un id=1. C'est bien. Mais j'imagine que c'est un id incrémenté automatiquement dans ta base de données (ce n'est pas précisé ans tes messages). Auquel cas, toutes tes nouvelles lignes feront +1 par rapport au maximum des numéros des id. Une fois la ligne supprimée la première fois, tu n'auras plus jamais de ligne avec id=1 (sauf si tu as un recyclage des id inutilisés mais vu tes compétences, je ne pense pas).

 

A mon avis, je pense que tu cherchais à faire : si j'ai + de 30 éléments dans ma table, je supprime le plus ancien avant d'insérer la nouvelle ligne. Au final, t'as un pool de toujours 30 éléments. 

Perso, j'trouve ça un peu con-con. Pourquoi tu ne mets pas dans ta base systématiquement le nouveau titre à ajouter, indépendamment de combien y en avait déjà ? Et c'est à l'affichage où tu ne montres que les 30 derniers titres de la requête. Te casse pas la tête inutilement...

 

Dernier point : dans la première partie, tu prépares ta requête et tu l'exécutes. Ok, ça doit insérer qqchose. Par contre, quand t'es dans l'autre partie, tu exécutes cash ta requête, sans avoir préparer la requête à binder. ça doit pas bien fonctionner ton truc (surtout que tu as justement commenté les lignes qui prépare la requête à binder de cette partie, et je vois pas pourquoi). Tu devrais donc plutôt préparer ta requête en dehors du if then else (avant), et l'exécuter en dehors également (après). Dans ton if then else, si tu tiens à faire ton truc, il n'y a que le cas où $count est >30 éléments où tu feras ton "delete"....et juste le delete.

 

 

Je t'en dis pas +, t'as l'air assez dégourdi pour te démerder par toi-même. Mais fais simple ! :-)

Lien vers le commentaire
Partager sur d’autres sites

Merci pour ta réponse, oui j'ai remarqué que j'ai fait des erreurs, en retestant d'autres possibilités après coup. Pour le niveau scolaire, je suis en plein dedans, je l'ai dit au début que j'étais nul en prog :razz:

 

Mon plus gros soucis pour le moment viens du count de la table que je n'arrive pas à faire fonctionner et qui empêche du coup le reste de marcher, pour le reste ça va.

 

Premier point : Pour le else après le if je n’étais pas sûr, mais je voulais effectivement le mettre. Je veux que dans tous les cas on ajoute un titre après en avoir ou pas supprimé un.

 

Deuxième point :  Exactement, et c'est pour ça que je voudrais savoir s'il existe une commande pour réinitialiser l'id (sans effacer la table), car conserver tous les titres et n'afficher que ce dont j'ai besoin c'est possible mais au bout d'un moment l'id va devenir énorme (et ça va pas bloquer aussi ? c'est limité il me semble ?), ou alors je vide la table toutes les 1000 chansons atteintes par exemple, je vois que ça...

 

Dernier point  : Ben en fait la requête est la même pour le if et le else donc pas besoin de l'écrire 2 fois, non ?

Lien vers le commentaire
Partager sur d’autres sites

Je crois que j'ai enfin trouvé la solution : fini les if et else, j'exécute à chaque fois une comparaison avec la date d'ajout, et tout les titres périmés d'un jour sont supprimés et hop. Du coup ça a drôlement raccourci le code, on ne peut pas faire plus simple à mon avis.

 

Une fois intégré au script WRT, ça fonctionne comme l'autre. Y'a plus qu'à attendre  voir si la suppression des titres est effective.

<?php$heure = date("H:i");$fp = fopen ("title.txt", "r");$titre = fgets ($fp);try{    $bdd = new PDO('mysql:host=localhost;dbname=player;charset=utf8', 'user', 'pass');}catch(Exception $e){        die('Erreur : '.$e->getMessage());}$bdd->exec('Delete from player where TO_DAYS(NOW()) - TO_DAYS(ajout_date) > 1');$req2 = $bdd->prepare('INSERT INTO player(heure, titre, ajout_date)VALUES(:heure, :titre, NOW())');$req2->execute(array(    'heure' => $heure,    'titre' => $titre,    ));?>
Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...