8792 sujets

Développement web côté serveur, CMS

Bonjour,

Mon site propose de poster la vidéo youtube à partir du nom de la vidéo.
Par exemple pour poster la video:
http://www.youtube.com/watch?v=jFNoqFjVSKo[/url]
L'utilisateur rentre jFNoqFjVSKo dans mon formulaire.

Le nom est stocké dans ma BDD, et une page affiche la video.

Je voudrai savoir comment intercepter l erreur 404 au cas ou la video Youtube n existe pas.

Merci Smiley biggrin
Bonjour,
ça dépend comment tu t'y prends, il nous faudrait un peu plus de détails pour te répondre efficacement.
l'utilisateur rentre le code de la video dans le champ du formulaire.
Il valide.

L'info est enregistrer dans une BDD:
mysql_query("INSERT INTO `video` ( `id` , `pseudo` , `titre` , `code` , `timestamp` )
VALUES ('', '$pseudo', '$titre', '$code', '".time()."' );");


Dans la page d'accueil, on affiche la vidéo:
	<p><news_titre>Titre: <?php echo $titre ; ?> Posté par : <?php echo $pseudo; ?> le : <?php echo date('d/m/Y à H\hi', $timestamp); ?>
		</news_titre></p>
<div align="center">
<object width="425" height="350"><param name="movie" value="http://www.youtube.com/v/[b]<?php echo $code; ?>[/b]"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/[b]<?php echo $code; ?>[/b]" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"></embed></object>
</div>
Smiley biggrin

Voila, n hesite pas a me demander d autre chose
Modifié par yaw (25 Jan 2007 - 10:34)
Hmmm... je vois.
La réponse ne va sûrement pas être celle à laquelle tu t'attendais, mais je te propose de tenter d'ouvrir le fichier côté serveur, juste pour voir s'il existe.
C'est une idée, il existe sûrement une solution plus efficace.

Exemple :

$fic = fopen("http://www.youtube.com/.........", 'r');
if (!$fic) echo "La vidéo n'existe pas sur le site de youtube";
else {
fclose($fic);
echo "<object ......... >";
}


Je ne suis pas sûr que file_exists fonctionne avec le protocole HTTP, mais si oui, il ne suffirait alors plus que d'une seule ligne if(file_exists("http://......") pour savoir.
Faudrait lire le début de se que retourne le fopen, nan ? Histoire de voir la première ligne de l'entête Http retourné... Si youtube respecte le procotole et envoi bien un 404 ;(
j 'ai testé ça:
if(file_exists("http://www.youtube.com/watch?v=$code"))

la condition n'est pas vérifié si le code de la vidéo est mauvaise ni si elle est bonne.

Je suis donc passé à la deuxième méthode:
	$fic = fopen("http://www.youtube.com/watch?v=$code", 'r');
	if (!$fic) echo "La vidéo n'existe pas sur le site de youtube";

		else {
			fclose($fic);

			connect();
			mysql_query("INSERT INTO `video` ( `id` , `pseudo` , `titre` , `code` , `timestamp` )
			VALUES ('', '$pseudo', '$titre', '$code', '".time()."' );");
			header('Location:../index.php');
			exit();
			}


ça marche pas, la condition est tjrs vérifié. Je crois qu il n y a pas d erreur 404 qd le code de la vidéo est mauvaise sur youtube.
Smiley ohwell
Arf... il va donc en effet falloir vérifier l'en-tête HTTP. Mais c'est pas avec fopen qu'on fait ça. Fsockopen est la seule solution.


$f = fsockopen("www.youtube.com", 80);
fwrite($f, "GET /...... HTTP/1.1");

Ensuite, il faut lire une ligne avec fread et voir si elle contient HTTP/1.x 200 OK ou HTTP/1.x 404 Not Found, puis fermer la connexion avec fclose
Si la vidéo existe pas, les headers suivants sont envoyés :
HTTP/1.x 303 See Other
Date: Fri, 26 Jan 2007 08:21:59 GMT
Server: Apache
Cache-Control: no-cache
Location: /index?unavail
Keep-Alive: timeout=300
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html; charset=utf-8
Ah, youtube fait des spécificités.

En clair : tu lis la première ligne, tu explode le résultat, et tu vérifies l'élément 1 du tableau. 200 = c'est bon, pas 200 = c'est pas bon.