[RESOLU] Problème de tableau ARRAY avec PDO Mysql

Mammouth du PHP | 804 Messages

28 janv. 2014, 22:57

Bonjour,

Dans la suite logique de mon adaptation à PDO, je ne parviens pas à résoudre un problème de tableau

il s'agit d'une table de page et la fonction de mon code me crée un menu html multidimensionnel qui fonctionnais très bien jusque la, seulement malgré tout mes tests il me crée une erreur pas logique

Code : Tout sélectionner

Warning: Invalid argument supplied for foreach() in
la ligne qui crée l'erreur est le foreach
 foreach ($pageData[$menu]['parents'][$parentId] as $itemId) 
il me dis que le tableau n'existe pas; hors il existe bien et les variable sont bien crée

$query = 'SELECT 
            id,mn_parent,bouton,type
        FROM 
            source_menu 
        ORDER BY 
            id, bouton';
	
$prep = $db->prepare($query);
$prep->execute();

    $pageData = array( 
        'page' => array(), 
        'pageparent' => array() 
    ); 

while($row=$prep->fetch(PDO::FETCH_ASSOC))
{    
    $pageData[$row->type]['page'][$row->id] = $row; 	
    $pageData[$row->type]['parents'][$row->mn_parent][] = $row->id;

}

    
function buildMenuPage($menu,$parentId, $pageData, $niveau) 
    { 
        $niveau++;
        $html = ''; 
		
        if (empty($pageData[$menu]['parents'][$parentId])) 
        { 
            $html = "<ul class=\"s$niveau\">\n"; 
            
			echo 'menu = '. $menu .' <br/>niveau = '.$niveau ;
            
			foreach ($pageData[$menu]['parents'][$parentId] as $itemId) 
            { 
			   echo '$itemId est '. $itemId .' <br/>';
			   
               $html .= "<li><a href=\"/page.php?idpage=".$pageData[$menu]['page'][$itemId]['id']."\" > " . $pageData[$menu]['page'][$itemId]['bouton']."</a>"; 
               $html .= buildMenuPage($menu,$itemId, $pageData, $niveau); 
               $html .= "</li>\n"; 
            } 
			
               $html .= "</ul>\n"; 
        } 
        return $html ;
    }

echo buildMenuPage(1,0, $pageData, 0) ;

je suis certain que l'erreur brûle les yeux mais je ne la vois pas
merci de votre aide

ViPHP
xTG
ViPHP | 7331 Messages

29 janv. 2014, 08:30

Et est-ce que le parentId 0 existe...

Mammouth du PHP | 804 Messages

29 janv. 2014, 13:36

Oui c'est bon je confire il existe

ViPHP
xTG
ViPHP | 7331 Messages

29 janv. 2014, 14:34

Trouvé...
if (empty($pageData[$menu]['parents'][$parentId])) 
S'il est vide il est normal de ne rien pouvoir en faire.
La condition que tu souhaitais mettre en place est donc l'inverse. ;)

Mammouth du PHP | 2278 Messages

29 janv. 2014, 18:05

foreach ($pageData[$menu]['parents'][$parentId] as $itemId)
remplacer par:
$tableau = $pageData[$menu]['parents'][$parentId];
var_dump($tableau);
foreach ($tableau as $itemid)
//etc 
permetttrait d'y voir plus clair
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Mammouth du PHP | 804 Messages

29 janv. 2014, 20:09

Bonsoir,

J'obtiens l'erreur suivante
NULL Warning: Invalid argument supplied for foreach()

Mammouth du PHP | 804 Messages

29 janv. 2014, 20:27

avec le code suivant j'obtiens
$query = 'SELECT 
            id,mn_parent,bouton,type
        FROM 
            source_menu 
        ORDER BY 
            id, bouton';
	
$prep = $db->prepare($query);
$prep->execute();

    $pageData = array( 
        'page' => array(), 
        'pageparent' => array() 
    ); 
	

while($row=$prep->fetch(PDO::FETCH_OBJ))
{    
$pageData[$row->type]['page'][$row->id] = $row; 	
$pageData[$row->type]['pageparent'][$row->mn_parent][] = $row->id;
var_dump($pageData);
}
			 
function buildMenuPage($menu,$parentId, $pageData, $niveau) 
    { 
        $niveau++;
        $html = ''; 
		
        if(empty($pageData[$menu]['pageparent'][$parentId])) 
        { 
            $html = "<ul class=\"s$niveau\">\n"; 
				
			$tableau = $pageData[$menu]['pageparent'][$parentId];
			var_dump($tableau);   
		
			foreach ($tableau as $itemid)
//foreach($pageData[$menu]['pageparent'][$parentId] as $itemId ) 
	{ 		   
               $html .= "<li><a href=\"/page.php?idpage=".$pageData[$menu]['page'][$itemId]['id']."\" > " . $pageData[$menu]['page'][$itemId]['bouton']."</a>"; 
               $html .= buildMenuPage($menu,$itemId, $pageData, $niveau); 
               $html .= "</li>\n"; 
        } 
			
               $html .= "</ul>\n"; 
        } 
        return $html ;
    }

echo buildMenuPage(1,0, $pageData, 0) ;

ce tableau
array(3) { ["page"]=> array(0) { } ["pageparent"]=> array(0) { } [0]=> array(2) { ["page"]=> array(1) { [2]=> object(stdClass)#3 (4) { ["id"]=> string(1) "2" ["mn_parent"]=> string(1) "1" ["bouton"]=> string(7) "accueil" ["type"]=> string(1) "0" } } ["pageparent"]=> array(1) { [1]=> array(1) { [0]=> string(1) "2" } } } } array(4) { ["page"]=> array(0) { } ["pageparent"]=> array(0) { } [0]=> array(2) { ["page"]=> array(1) { [2]=> object(stdClass)#3 (4) { ["id"]=> string(1) "2" ["mn_parent"]=> string(1) "1" ["bouton"]=> string(7) "accueil" ["type"]=> string(1) "0" } } ["pageparent"]=> array(1) { [1]=> array(1) { [0]=> string(1) "2" } } } [1]=> array(2) { ["page"]=> array(1) { [3]=> object(stdClass)#4 (4) { ["id"]=> string(1) "3" ["mn_parent"]=> string(1) "0" ["bouton"]=> string(10) "espace dog" ["type"]=> string(1) "1" } } ["pageparent"]=> array(1) { [0]=> array(1) { [0]=> string(1) "3" } } } }
je ne vois que ca qui m'intrigue dans mon tableau
object(stdClass)#3

ViPHP
xTG
ViPHP | 7331 Messages

29 janv. 2014, 21:22

Relis mon message...
Comment veux-tu faire un foreach sur une variable vide ?

Mammouth du PHP | 804 Messages

30 janv. 2014, 14:26

Effectivement j'ai mal conditionné ma variable tableau,
  if(!empty($pageData[$menu]['pageparent'][$parentId])) 
maintenant que le tableau passe il me dit
Fatal error: Cannot use object of type stdClass as array in
je ne vois pas pourquoi il refuse cette variable ?

voici le code mis à jour
$query = 'SELECT 
            id,mn_parent,bouton,type
        FROM 
            source_menu 
        ORDER BY 
            id, bouton';
	
$prep = $db->prepare($query);
$prep->execute();

    $pageData = array( 
        'page' => array(), 
        'pageparent' => array() 
    ); 
	

while($row=$prep->fetch(PDO::FETCH_OBJ))
{    
	
	echo $row->id .' parent '.$row->mn_parent . ' et type est = a '. $row->type .'<br />'  ;
	$TB_type = $row->type;
	$pageData[$row->type]['page'][$row->id] = $row; 	
    $pageData["$TB_type"]['pageparent'][$row->mn_parent][] = $row->id;
}

			 
function buildMenuPage($menu,$parentId, $pageData, $niveau) 
    { 
        $niveau++;
        $html = ''; 
        if(!empty($pageData[$menu]['pageparent'][$parentId])) 
        { 
		 	
            $html = "<ul class=\"s$niveau\">\n"; 
				
			  /*$tableau = $pageData[$menu]['pageparent'][0];
				var_dump($tableau);
				foreach ($tableau as $itemid)*/		
				foreach($pageData[$menu]['pageparent'][0] as $itemId) 
				{ 
			
				   $html .= "<li><a href=\"/page.php?idpage=".$pageData[$menu]['page'][$itemId]['id']."\" > " . $pageData[$menu]['page'][$itemId]['bouton']."</a>"; 
				   $html .= buildMenuPage($menu,$itemId, $pageData, $niveau); 
				   $html .= "</li>\n"; 
				} 
			
              	   $html .= "</ul>\n"; 
        } 
        return $html ;
    }

echo buildMenuPage(1,0, $pageData,0) ;

Mammouth du PHP | 804 Messages

30 janv. 2014, 14:36

je me suis dis que la structure de ma table devait peu être inadapté à PDO j'ai donc changé type en smallint(2) mais rien ne change

Mammouth du PHP | 804 Messages

30 janv. 2014, 15:27

Bon apparemment le problème de type était que je n'avais pas encore enregistré de menu de type 0 comme ma première fonction le demande, mais du coup on en reviens à la même erreur de départ.
Warning: Invalid argument supplied for foreach() in
je tourne en rond depuis hier c'est épuisant et illogique

ViPHP
xTG
ViPHP | 7331 Messages

30 janv. 2014, 16:20

Fatal error: Cannot use object of type stdClass as array in
Montres nous la tête du contenu que tu veux faire passer dans le foreach.
je me suis dis que la structure de ma table devait peu être inadapté à PDO j'ai donc changé type en smallint(2) mais rien ne change
En PHP une entier fait jamais moins de 32bits, le seul impact de ta modif est donc en BDD.

Mammouth du PHP | 804 Messages

30 janv. 2014, 16:52

Je t'ai tout montré
je viens de modifier le code pour utiliser FETCH_ASSOC , idem pour la construction de mon tableau
	$pageData[$row['type']]['page'][$row['id']] = $row; 	
	$pageData[$row['type']]['pageparent'][$row['mn_parent']][] = $row->id;

Du coup il y a des améliorations et l'erreur à disparue; mais alors pourquoi OBJ ne passait il pas c'est vraiment étrange ?
$query = 'SELECT 
            id,mn_parent,bouton,type
        FROM 
            source_menu 
        ORDER BY 
            id, bouton';
	
$prep = $db->prepare($query);
$prep->execute();

    $pageData = array( 
        'page' => array(), 
        'pageparent' => array() 
    ); 
	


while($row=$prep->fetch(PDO::FETCH_ASSOC))
{    
	
	$pageData[$row['type']]['page'][$row['id']] = $row; 	
	$pageData[$row['type']]['pageparent'][$row['mn_parent']][] = $row->id;
	

	
	var_dump($pageDate);
}

			 
function buildMenuPage($menu,$parentId, $pageData, $niveau) 
    { 
        $niveau++;
        $html = ''; 

        if(isset($pageData[$menu]['pageparent'][$parentId])) 
        { 
		
            $html = "<ul class=\"s$niveau\">\n";
			 
				foreach($pageData[$menu]['pageparent'][$parentId] as $itemId) 
				{ 
				echo '<br />Jusque ici tout va bien '.$menu.','.$itemId.','.$pageData.','.$niveau.'<br />';
				 
				   $html .= '<li> > <a href=\"/page.php?idpage='.$pageData[$menu]['page'][$itemId]['id']."\" > " . $pageData[$menu]['page'][$itemId]['bouton']."</a>"; 
				   $html .= buildMenuPage($menu,$itemId, $pageData, $niveau); 
				   $html .= "</li>\n"; 
				} 
			
              	   $html .= "</ul>\n"; 
        } 
        return $html ;
    }

echo buildMenuPage(0,0, $pageData, 0) ;

En revanche ma petite ligne de code ci-dessous m'a permit de voir qu'il y avait rien dans ma $itemId ?
echo '<br />Jusque ici tout va bien '.$menu.','.$itemId.','.$pageData.','.$niveau.'<br />';
Modifié en dernier par dogmongo le 30 janv. 2014, 17:30, modifié 1 fois.

Mammouth du PHP | 804 Messages

30 janv. 2014, 17:03

J'ai réglé mon problème d'affichage de la page dans le menu
	$pageData[$row['type']]['page'][$row['id']] = $row; 	
	$pageData[$row['type']]['page'][$row['bouton']] = $row['bouton']; 	
	$pageData[$row['type']]['pageparent'][$row['mn_parent']][] = $row['id'];
Il ne me reste plus qu'à comprendre pourquoi foreach ne fait pas son boulot $itemId

Mammouth du PHP | 804 Messages

30 janv. 2014, 17:30

C'est bon j'ai résolu le problème, quand j'ai crée mes pages j'ai crée celle ci comme si j'utilisais ma fonction à un niveau supérieur, hors je n'en ai pas puisque j'appel ma fonction à un seul niveau
il n'empêche que j'avais plein d'incohérence et que tu m'a bien mis sur la voie, je t'en remercie xTG .

je vais mettre le code complet pour que quelqu'un qui pourrait en avoir besoins puisse trouver son bonheur, sur le net je n'ai pas encore vu de démonstration de menu dynamique DPO MySQL
$query = 'SELECT 
            id,mn_parent,bouton,type
        FROM 
            source_menu 
        ORDER BY 
            id, bouton';
	
$prep = $db->prepare($query);
$prep->execute();

    $pageData = array( 
        'page' => array(), 
        'pageparent' => array() 
    ); 

while($row=$prep->fetch(PDO::FETCH_ASSOC))
{    
	$pageData[$row['type']]['page'][$row['id']] = $row; 	
	$pageData[$row['type']]['page'][$row['bouton']] = $row['bouton']; 	
	$pageData[$row['type']]['pageparent'][$row['mn_parent']][] = $row['id'];
}

			 
function buildMenuPage($menu,$parentId, $pageData, $niveau) 
    { 
        $niveau++;
        $html = ''; 
		echo 'le menu est de niveau '. $niveau;
		
		$tableau = $pageData[$menu]['pageparent'][$parentId];

        if(isset($tableau)) 
        { 
            $html = "<ul class=\"s$niveau\">\n";
				foreach($tableau as $itemId) 
				{ 
				   $html .= '<li><a href="page.php?idpage='.$pageData[$menu]['page'][$itemId]['id'].'" > '. $pageData[$menu]['page'][$itemId]['bouton'].'</a>'; 
				   $html .= buildMenuPage($menu,$itemId, $pageData, $niveau); 
				   $html .= "</li>\n"; 
				} 
              	   $html .= "</ul>\n"; 
        } 
        return $html ;
    }

echo buildMenuPage(0,0, $pageData, 0) ;