Vérifier que URL pointe vers Flux RSS

Petit nouveau ! | 3 Messages

28 mai 2012, 18:55

Bonjour à tous,
je réalise actuellement un lecteur de flux RSS.
Cette étape concerne l'entrée du flux en base de données.
  • Je verifie que le nom et l'adress du flux ne sont pas déjà présent.
    Si il s'agit d'une nouvelle URL, je vérifie quelle pointe vers un Flux RSS
    L'URL étant correcte je rentre tout cela en base de données
J'ai néanmoins un soucis la fonction me semble bonne mais quand je teste avec une URL bidon,
la saisi s'effectue en BD. Je solicite votre aide.


<?php

if(isset($_POST) && !empty($_POST)){
	extract($_POST, EXTR_OVERWRITE);
	
        /*
            Vérifier que le nom et l'url ne soit pas en DB
        */
	$sql="SELECT nom, url FROM site WHERE nom =".'$nom'. "AND url =".'$url'." ";
	$result=$connexion->query($sql);

	if($result == true){
                echo'nom ou url déjà esistant';		
		header("Location:index.php#form");
	}else{
		
	/*
	** Vérifier que l'URL saisie pointe vers un flux RSS
	*/
	
			function validerRSS($url){
			
			    $validateur = 'http://feedvalidator.org/check.cgi?url='; //adress du validateur de flux
			
				if( $reponse = @file_get_contents($validateur . urlencode($url)) ){
					
					if( stristr( $reponse , 'flux valide' ) !== false ){
						$a=1;
						return true;
									
					}else{	
						$a=0;					
						return false;						
					}
				}else{
			
			            return false;
                                }

			}//fin function

		if(validerRSS()== true){
		$sql="INSERT INTO site VALUES ('', '$nom', '$categorie', '$url')";
			$result =$connexion->prepare($sql);
			$result->execute();	
			header("Location:index.php");
		}
						
		}//fin vérifier url
			
}//Fin Si $_POST

?>

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

28 mai 2012, 23:10

salut,

va falloir déboguer un peu :
- vire l'arobase : tu a besoin des messages d'erreurs lorsque tu developpe (et d'ailleurs si tu ne veux pas les voir ensuite configure l'error_reporting).
- affiche le contenu des variables (var_dump / print_r)

les $a = ne serveur à rien dans la fonction tu peux les virer.

utilise une variable intermédiaire pour le retour de validerRSS afin de savoir ce qu'elle retourne.

met en commentaire le header pour éviter les problèmes lors du deboguage.

isset($_POST) (ou tout autre super globale) va forcément retourner vrai puisse qu'elles sont toujours définies. utilise seulement empty.

Utiliser extract t'expose à écraser des variables.

@+
Il en faut peu pour être heureux ......

Invité
Invité n'ayant pas de compte PHPfrance

28 mai 2012, 23:20

salut
fais un:
var_dump($result) , tu verras ton problème avec ton if($result==true)
+

Eléphanteau du PHP | 33 Messages

29 mai 2012, 07:51

function IsValidFeed($sURL) {
    $sURL  = 'http://feedvalidator.org/check.cgi?url=' . urlencode($sURL);
    $sPage = file_get_contents($sURL);
    
    if (strstr($sPage, 'This is a valid RSS feed.')) {
        return TRUE;
    }
    
    return FALSE;
}

Petit nouveau ! | 3 Messages

30 mai 2012, 05:35

Merci de vaux réponses déjà
Apres modification mon code le suivant;
neanmoins je ne peut toujours pas vérifier l'url et évidement inserer en base de données la redirection se fait immediatement avant la partie execution de la fonction IsValidateFeed();

j'ai fait un var_dump() / print_r();
voici le résultat; A mon sens la requête sql associé est bonne

Image

Voici le code
<?php

								/*
									Formulaire Traitement
								*/

try{
	$connexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
	/*
		** Vérifier que l'URL saisie retourne un flux RSS
	*/


function IsValidFeed($sURL) {
    $sURL  = 'http://feedvalidator.org/check.cgi?url=' . urlencode($sURL);
    $sPage = file_get_contents($sURL);
    
    if (strstr($sPage, 'This is a valid RSS feed.')) {
        return TRUE;
    }
    
    return FALSE;
}

if( isset($_POST) && !empty($_POST)){
	$url = preg_replace('#[^A-Za-z0-9]#i', '',$_POST['url_site']);
	$nom = preg_replace('#[^A-Za-z0-9]#i', '',$_POST['nom']);
	$categorie = preg_replace('#[^A-Za-z0-9]#i', '',$_POST['categorie']);
	
	//Verif avant INSERT
	$sql="SELECT nom, url FROM site WHERE nom ='" .$_POST['nom']."' AND url = '".$_POST['url_site']."' ";
	$result=$connexion->query($sql);

	if($result != null){
		
		header("Location:index.php?error");
	}else{
		
		//Execution fonction
		$sUrl='';
	$sUrl = preg_replace('#[^A-Za-z0-9]#i', '',$_POST['url_site']);
		if(validerRSS($sUrl) == true){
			
			$sql="INSERT INTO site VALUES ('', '$nom', '$categorie', '$url')";
		
			$result = $connexion->prepare($sql);
			$result->execute();				
			header("Location:index.php");
		
		}
						
	}
			
}//Fin Si $_POST

}catch(PDOException $e) //message d'erreur
								{
        							echo $e->getMessage();
								}

?>

Eléphanteau du PHP | 33 Messages

30 mai 2012, 07:40

Merci de vaux réponses déjà
Apres modification mon code le suivant;
neanmoins je ne peut toujours pas vérifier l'url et évidement inserer en base de données la redirection se fait immediatement avant la partie execution de la fonction IsValidateFeed();

j'ai fait un var_dump() / print_r();
voici le résultat; A mon sens la requête sql associé est bonne

Image

Voici le code
<?php

								/*
									Formulaire Traitement
								*/

try{
	$connexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
	/*
		** Vérifier que l'URL saisie retourne un flux RSS
	*/


function IsValidFeed($sURL) {
    $sURL  = 'http://feedvalidator.org/check.cgi?url=' . urlencode($sURL);
    $sPage = file_get_contents($sURL);
    
    if (strstr($sPage, 'This is a valid RSS feed.')) {
        return TRUE;
    }
    
    return FALSE;
}

if( isset($_POST) && !empty($_POST)){
	$url = preg_replace('#[^A-Za-z0-9]#i', '',$_POST['url_site']);
	$nom = preg_replace('#[^A-Za-z0-9]#i', '',$_POST['nom']);
	$categorie = preg_replace('#[^A-Za-z0-9]#i', '',$_POST['categorie']);
	
	//Verif avant INSERT
	$sql="SELECT nom, url FROM site WHERE nom ='" .$_POST['nom']."' AND url = '".$_POST['url_site']."' ";
	$result=$connexion->query($sql);

	if($result != null){
		
		header("Location:index.php?error");
	}else{
		
		//Execution fonction
		$sUrl='';
	$sUrl = preg_replace('#[^A-Za-z0-9]#i', '',$_POST['url_site']);
		if(validerRSS($sUrl) == true){
			
			$sql="INSERT INTO site VALUES ('', '$nom', '$categorie', '$url')";
		
			$result = $connexion->prepare($sql);
			$result->execute();				
			header("Location:index.php");
		
		}
						
	}
			
}//Fin Si $_POST

}catch(PDOException $e) //message d'erreur
								{
        							echo $e->getMessage();
								}

?>
if(validerRSS($sUrl) == true){
Ce n'est plus la fonction validerRSS mais la fonction IsValidFeed.

Petit nouveau ! | 3 Messages

30 mai 2012, 18:32

ok donc j'ai tenu compte de des recommandation.
j'ai éffectué les différents tests ils sont tous concluants ;
En revanche sur mon serveur test en ligne enregistrement toujours impossible
malgré le copié collé du code local!!
aucune erreur ne ressort
<?php

								/*
									Formulaire Traitement
								*/

try{
	$connexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
	/*
		** Vérifier que l'URL saisie retourne un flux RSS
	*/


function IsValidFeed($sURL) {
    $sURL  = 'http://feedvalidator.org/check.cgi?url=' . urlencode($sURL);
    $sPage = file_get_contents($sURL);
    
    if (strstr($sPage, 'This is a valid RSS feed.')) {
        return TRUE;
    }
    
    return FALSE;
}

if( isset($_POST) && !empty($_POST)){
	$sUrl='';
	$sUrl = $_POST['url_site'];
	$url_site = $_POST['url_site'];
	$nom = $_POST['nom'];
	$categorie = $_POST['categorie'];
	
	$sql="SELECT nom, url FROM site WHERE nom ='" .$_POST['nom']."' AND url = '".$_POST['url_site']."' ";
	$result=$connexion->query($sql);
	$ligne= $result->rowCount();
	
	if($result = $ligne){	
	
		header("Location:index.php?param=error");
		
	}else{
		
		if(IsValidFeed($sUrl) == true){
			
			$sql="INSERT INTO site VALUES ('', '$nom', '$categorie', '$url_site')";
		
			$result = $connexion->prepare($sql);
			$result->execute();				
			header("Location:index.php");
		
		}//fin vérifier url
						
	}
			
}//Fin Si $_POST

}catch(PDOException $e) //message d'erreur
								{
        							echo $e->getMessage();
								}

?>

Eléphanteau du PHP | 33 Messages

01 juin 2012, 22:45

Essaye de voir où ça coince PHP: PDO::errorInfo - Manual.