IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Messages d'erreur Fonctions


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 92
    Par défaut Messages d'erreur Fonctions
    Bonjour,
    J'ai reçu l'aide d'un passioné du forum pour construire cette fonction.
    J'en explique rapidement l'utilité, elle permet de récuperer certaines variables dans un texte collé.
    Le problème c'est que j'ai quelques messages d'erreurs.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    <html>
    	<head><title>Simulateur de Combats Spatiaux</title></head>
    	<body>
    	<FONT FACE="tahoma">
    	<CENTER>
    		<form name="formulaire" method="post" action="Complexe.php"
    		<CENTER><FONT COLOR="RED" SIZE=+2><B><U>Défenseur</COLOR="RED"></FONT COLOR="RED" SIZE=+2></B></U><br/><br/></CENTER>
    		<FONT SIZE=+1><B><U>Collez ici votre Rapport d'Espionnage</FONT SIZE=+1></B></U><br/><br/>		
    		<textarea name="formulaire" id="CadreFormulaire" rows="10" cols="40">
    		</textarea><br/><br/>
    		<input type="submit" name="valider" value="Envoyer"/>
    		</form>
    	</CENTER>
    	<FONT FACE="tahoma">
    	<?php
    	if(isset($_POST['valider'])){ 
     
    function recupVariables( $chaine , $data ){
    	//création du masque de sélection des lignes à traiter	
    	if( is_array( $data ) ) $mask = '`^(' . implode( '|' , $data ) . ')`i';
    	else $mask = '`^(' . $data . ')`i';
    	// on transforme la chaine d'entrée en tableau
    	$tabOriginal = explode( "\n" , $chaine );
    	// sélection des lignes intéressantes du tableau 	
    	$tab = preg_grep( $mask , $tabOriginal );
    	$out = array();	
    	foreach( $tab as $ligne ){
    		list( $var , $val ) = explode( ':' , $ligne );
    		if( !is_array( $data ) ) return trim( $val );
    		$out[  trim( $var ) ] = trim( $val );
    	}
    	return $out;
    }
    $tabRecherches = array( 'Tour de Combat' , 'Canon Laser' , 'Grand Canon Laser' , 'Rayon Tracteur' , 'Lanceur de Missiles' , 'Satellite à Ions' , 'Batterie Electromagnétique' , 'Canon à Plasma' , 'Canon Electromagnétique' ,  'Silos à Missiles HEM' , 'Complexe de Défense Orbital' , 'Missile d\'Interception Intelligent' , 'Technologie Amélioration de la Coque' , 'Technologie Amélioration de l\'Armement' , 'Technologie Bouclier de Protection' );
    $Défenses = recupVariables( $_POST['formulaire'] , $tabRecherches );
     
    echo $Défenses['Tour de Combat'] . '<br /><br />';
     
    function recupVaisseau( $chaine ){
    	//comme dans la fonction recupVariables, on transforme la chaine d'entrée en tableau	
    	$tabOriginal = explode( "\n" , $chaine );
    	//on sélectionne toutes les lignes contenant des parenthèses (à priori VAISSEAU( NOMBRE ) si j'ai bien capté)
    	$listeVaisseaux = preg_grep( '`\(`' , $tabOriginal );
    	$out = array();	
    	foreach( $listeVaisseaux as $key=>$val ){
    		//création d'un nouvel objet de données qui représentera le vaisseau		
    		$vaisseau = new stdClass();
     
    		// regex permettant de d'identifier le nom du vaisseau et le nombre	
    		preg_match( '`^(?P<nom>.+?)\s*\(\s*(?P<nombre>\d+?)\s*\)$`' , $val , $t );
    		$vaisseau->nom = trim( $t['nom'] );
    		$vaisseau->nombre = trim( $t['nombre'] );
    		$vaisseau->caracteristiques = array();		
    		$k = 0;
    		while( $tabOriginal[ $key + (++$k) ] != '' ){
    			if( strpos( $tabOriginal[ $key + $k ] , ':' ) == true ){
    				list( $var , $val ) = explode( ':' , $tabOriginal[ $key + $k ] );
    				$vaisseau->caracteristiques[ trim( $var ) ] = trim( $val );
    			}
    			else $vaisseau->caracteristiques[ trim( $tabOriginal[ $key + $k ] ) ] = 1;
    		}
    		$out[] = $vaisseau;
    	}
    	return $out;
    }
    		$tab = recupVaisseau( $_POST['formulaire'] );
    	foreach( $tab as $vaisseau ){
    		echo 'Nom : ' . $vaisseau->nom . '<br />';
    		echo 'Nombre : ' . $vaisseau->nombre . '<br />';
    		echo 'Attaque : ' . $vaisseau->caracteristiques['Attaque'] . '<br />';
    		echo 'Bouclier : ' . $vaisseau->caracteristiques['Bouclier'] . '<br/>';
    		echo 'Coque : ' . $vaisseau->caracteristiques['Coque'] . '<br/>';
    }
     
    }
    ?>
    Les messages sont :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Notice: Undefined index: nom in C:\Program Files\wamp\www\test.php\Complexe.php on line 51
     
    Notice: Undefined index: nombre in C:\Program Files\wamp\www\test.php\Complexe.php on line 52
     
    Notice: Undefined offset: 125 in C:\Program Files\wamp\www\test.php\Complexe.php on line 55
    Je remercie Petit Bidon pour le travail qu'il a fourni, mais j'ai préféré poster dans cette section pour bénéficier d'une aide un peu plus rapide car je comprend que petitbidon n'a pas que sa a faire !
    Je vous remercie d'avance

  2. #2
    Membre émérite Avatar de FCYPBA
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 745
    Par défaut
    Salut,

    Il manque un bout du code mais je peux te donner quelques pistes pour localiser les erreurs ( qui ne sont que des informations )

    Elles concernent toutes un tableau dans lequel tu essaie d'accéder à une case inexistante ( soit par nom, soit par index )

    Il faudrait tester l'existance de ces colones au sein du tableau avant de les récupérer pour éviter ces messages d'avertissements. Un simple isset($tableau[nom']); peut faire l'affaire

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 92
    Par défaut
    Pour les
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Notice: Undefined index: nom in C:\Program Files\wamp\www\test.php\Complexe.php on line 51
     
    Notice: Undefined index: nombre in C:\Program Files\wamp\www\test.php\Complexe.php on line 52
    et ben c'est un peu comme les truc en dessous ($vaisseau->caracteristiques['Attaque'])
    Sauf que eux : $vaisseau->nom font rapport a un truc un peu plus compliqué : (les lignes 51 et 52:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $vaisseau->nom = trim( $t['nom'] );
    		$vaisseau->nombre = trim( $t['nombre'] );
    )
    Que J'ai du mal a saisir. Peut-etre faut-il les rentrer dans un tableau ou alors le regex n'est pas optimum. J'ai besoin de vous pour çà

  4. #4
    Membre émérite Avatar de FCYPBA
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 745
    Par défaut
    En effet, le problème doit se situer au niveau de l'expression régulière.
    Elle ne doit pas fonctionner et comme tu ne vérifies pas qu'elle matche ou bien que le tableau $t contient des éléments, on a un tableau vide

    Il faudrait mettre en place un test sur le retour de preg_match pour vérifier que cela a bien fonctionné

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if (preg_match( '`^(?P<nom>.+?)\s*\(\s*(?P<nombre>\d+?)\s*\)$`' , $val , $t ) ){
    //traitement
    }
    else {
    //erreur recontrée
    }

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Par défaut
    Le problème vient du fait que le preg_grep se limite à chercher une parenthèse pour séléctionner les index à traiter.

    Il est donc possible qu'il y ait une parenthèse en fin de texte qui fasse planter le truc... Aussi bizarre que ça puisse paraître, la fonction fonctionne parfaitement avec le texte que tu m'avais passé pour tester.

    Peut-être que raffiner la fonction permettra de résoudre le soucis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $listeVaisseaux = preg_grep( '`^.+?\(\s*\d+\s*\)$`' , $tabOriginal );
    remplacer la ligne dans la fonction recupVaisseau.

    Le test de FCYPBA apportera également une "sécurité" supplémentaire, même si le problème se situe en amont.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 92
    Par défaut
    Bonjour ,je vais tester, des que j'aurai un petit moment ^^ mais en modifiant le preg_grep, et en testant avec les deux rapports sur le topic débuter je n'ai plus de messages d'erreurs, sauf que je n'ai plus rien a part le nombre de tour de combat ou autre chose qui s'affiche, plus de caractéristiques de vaisseaux nada.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    <html>
    	<head><title>Simulateur de Combats Spatiaux</title></head>
    	<body>
    	<FONT FACE="tahoma">
    	<CENTER>
    		<form name="formulaire" method="post" action="Complexe.php"
    		<CENTER><FONT COLOR="RED" SIZE=+2><B><U>Défenseur</COLOR="RED"></FONT COLOR="RED" SIZE=+2></B></U><br/><br/></CENTER>
    		<FONT SIZE=+1><B><U>Collez ici votre Rapport d'Espionnage</FONT SIZE=+1></B></U><br/><br/>		
    		<textarea name="formulaire" id="CadreFormulaire" rows="10" cols="40">
    		</textarea><br/><br/>
    		<input type="submit" name="valider" value="Envoyer"/>
    		</form>
    	</CENTER>
    	<FONT FACE="tahoma">
    	<?php
    	if(isset($_POST['valider'])){ 
     
    function recupVariables( $chaine , $data ){
    	//création du masque de sélection des lignes à traiter	
    	if( is_array( $data ) ) $mask = '`^(' . implode( '|' , $data ) . ')`i';
    	else $mask = '`^(' . $data . ')`i';
    	// on transforme la chaine d'entrée en tableau
    	$tabOriginal = explode( "\n" , $chaine );
    	// sélection des lignes intéressantes du tableau 	
    	$tab = preg_grep( $mask , $tabOriginal );
    	$out = array();	
    	foreach( $tab as $ligne ){
    		list( $var , $val ) = explode( ':' , $ligne );
    		if( !is_array( $data ) ) return trim( $val );
    		$out[  trim( $var ) ] = trim( $val );
    	}
    	return $out;
    }
    $tabRecherches = array( 'Tour de Combat' , 'Canon Laser' , 'Grand Canon Laser' , 'Rayon Tracteur' , 'Lanceur de Missiles' , 'Satellite à Ions' , 'Batterie Electromagnétique' , 'Canon à Plasma' , 'Canon Electromagnétique' ,  'Silos à Missiles HEM' , 'Complexe de Défense Orbital' , 'Missile d\'Interception Intelligent' , 'Technologie Amélioration de la Coque' , 'Technologie Amélioration de l\'Armement' , 'Technologie Bouclier de Protection' );
    $Défenses = recupVariables( $_POST['formulaire'] , $tabRecherches );
     
    echo $Défenses['Tour de Combat'] . '<br /><br />';
     
    function recupVaisseau( $chaine ){
    	//comme dans la fonction recupVariables, on transforme la chaine d'entrée en tableau	
    	$tabOriginal = explode( "\n" , $chaine );
    	//on sélectionne toutes les lignes contenant des parenthèses (à priori VAISSEAU( NOMBRE ) si j'ai bien capté)
    	$listeVaisseaux = preg_grep( '`^.+?\(\s*\d+\s*\)$`' , $tabOriginal );
    	$out = array();	
    	foreach( $listeVaisseaux as $key=>$val ){
    		//création d'un nouvel objet de données qui représentera le vaisseau		
    		$vaisseau = new stdClass();
     
    		// regex permettant de d'identifier le nom du vaisseau et le nombre	
    		preg_match( '`^(?P<nom>.+?)\s*\(\s*(?P<nombre>\d+?)\s*\)$`' , $val , $t );
    		$vaisseau->nom = trim( $t['nom'] );
    		$vaisseau->nombre = trim( $t['nombre'] );
    		$vaisseau->caracteristiques = array();		
    		$k = 0;
    		while( $tabOriginal[ $key + (++$k) ] != '' ){
    			if( strpos( $tabOriginal[ $key + $k ] , ':' ) == true ){
    				list( $var , $val ) = explode( ':' , $tabOriginal[ $key + $k ] );
    				$vaisseau->caracteristiques[ trim( $var ) ] = trim( $val );
    			}
    			else $vaisseau->caracteristiques[ trim( $tabOriginal[ $key + $k ] ) ] = 1;
    		}
    		$out[] = $vaisseau;
    	}
    	return $out;
    }
    		$tab = recupVaisseau( $_POST['formulaire'] );
    	foreach( $tab as $vaisseau ){
    		echo 'Nom : ' . $vaisseau->nom . '<br />';
    		echo 'Nombre : ' . $vaisseau->nombre . '<br />';
    		echo 'Attaque : ' . $vaisseau->caracteristiques['Attaque'] . '<br />';
    		echo 'Bouclier : ' . $vaisseau->caracteristiques['Bouclier'] . '<br/>';
    		echo 'Coque : ' . $vaisseau->caracteristiques['Coque'] . '<br/>';
    }
     
    }
    ?>

Discussions similaires

  1. message d'erreur : Fonction indéfinie
    Par Kiko93 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 11/12/2011, 18h33
  2. Message d'erreur "Fonction indéfinie" anormal
    Par laurentSc dans le forum Langage
    Réponses: 2
    Dernier message: 23/06/2011, 14h56
  3. Message d'erreur fonction envoi touches dans macro
    Par isabelle b dans le forum IHM
    Réponses: 4
    Dernier message: 26/06/2008, 22h15
  4. Réponses: 2
    Dernier message: 11/01/2007, 00h28
  5. Réponses: 2
    Dernier message: 01/06/2006, 15h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo