Un souci de finalisation avec explode PHP MySql

Résolu/Fermé
Sebas22 Messages postés 110 Date d'inscription jeudi 13 mai 2010 Statut Membre Dernière intervention 24 juillet 2018 - 14 févr. 2018 à 10:24
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 - 26 févr. 2018 à 19:03
Bonjour,
Bonjour yg_be s'il est là en ce moment,
Je suis en train de faire un tableau à 2 colonnes, la première qui liste des noms d’après le champ Describer_initials d’une table et la seconde qui compte les occurrences identiques et j’ai déjà avancé (je réussis à faire le tableau à 2 colonnes avec les « bons » résultats mais je bloque sur un point, car mon champ Describer_initials a une particularité il agrège souvent mais pas toujours des noms séparés par ‘|’ et je veux désagréger ces noms pour les compter séparément
Voici mon code (j’ai commenté-désactivé avec // les lignes de code qui posent problème, celles dans lesquelles j’essaie d’introduire la fonction explode, mais çà ne marche pas)
echo '<blockquote><h3><a id="DESCRIBERS"></a>Statistics by name of describers :</h3></blockquote>';
	
	echo '<table class="sortablenarrow" id="you"><tr><th>NAME OF DESCRIBERS</th><th>COUNTER ALL TAXA</th></tr>';
	
	$requete = $connexion->prepare("SELECT Describer_initials, COUNT(Describer_initials) AS counter FROM taxabase3 WHERE Describer_initials is not null and trim(Describer_initials) != '' GROUP BY Describer_initials ORDER BY COUNT(Describer_initials) DESC, Describer_initials ASC");
	
	$requete->execute();
    $result[1] = $requete->fetchAll();
	//$explode1 = '';
	foreach  ($result[1] as $row) {
		
	//$explode1 = explode("|", $row["Describer_initials"]);
	
	echo '<tr><td>' . $row["Describer_initials"] . '</td><td>' . $row ["counter"] . '</td></tr>';
	//echo '<tr><td>' . $row["$explode1"] . '</td><td>' . $row ["counter"] . '</td></tr>';

	}	

	echo '</table>';
	echo '<p> </p>';
	echo '<p> </p>';

Un petit coup de pouce pour finaliser, svp? (sauf si je me trompe, je ne dois pas être loin)
Note quand j’active les lignes de codes à problème, j’ai les erreurs suivantes qui sont signalées :
Notice: Array to string conversion in D:\xxxx.php on line 301
Notice: Undefined index: Array in D:\xxx.php on line 301

La ligne 301 étant:
echo '<tr><td>' . $row["$explode1"] . '</td><td>' . $row ["counter"] . '</td></tr>';
J’ai aussi essayé :
echo '<tr><td>' . array($row["$explode1"]) . '</td><td>' . $row ["counter"] . '</td></tr>';
Mais l’explode ne se fait pas et j’ai la même erreur qui commence en plus par Array186 (186 étant le premier compte sans explode)
Merci de votre aide (j’ai trop pagaillé)
Seb




6 réponses

jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
14 févr. 2018 à 11:48
Bonjour,

Lorsque tu fais un explode... ça te retourne un ARRAY
Tu dois donc boucler dessus...

Un truc du genre
foreach  ($result[1] as $row) {
	$Describer_initials = !empty($row["Describer_initials"]) ? $row["Describer_initials"] : NULL;
	if($Describer_initials){
		$explode1 = explode("|", $Describer_initials);
		if(!empty($explode1)){
			foreach($explode1 as $D){
				echo '<tr><td>' . $D . '</td><td>' . $row ["counter"] . '</td></tr>';	
			}
		}
	}
}


NB: Je t'invite vivement à appliquer le contenu de ce lien : https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs

Ainsi que de celui ci : https://forums.commentcamarche.net/forum/affich-37584947-php-gestion-des-erreurs-debogage-et-ecriture-du-code

0
Sebas22 Messages postés 110 Date d'inscription jeudi 13 mai 2010 Statut Membre Dernière intervention 24 juillet 2018 5
14 févr. 2018 à 15:04
Bonjour Jordane45,

Merci beaucoup de cette réaction rapide est précise.

J’ai appliqué et il n’y a plus de bug… mais cela ne fait pas bien le job.
L’explode fonctionne mais il fait comme s’il créait un ‘describer’ nouveau après avoir désaggrégé plusieurs ‘describer’, un peu comme s’il créait des doublons distincts.
Je vais être plus clair (!)… par exemple, voici 5 lignes théoriques du champ :
Jordane P.H.
Pépin A.C.|Jordane P.H.|Dupont N.N.
Pépin A.C.|Dupont N.N.|Jordane P.H.
Martin A.|Jordane P.H.
Jordane P.H.

Alors les résultats sont
Jordane P.H. 2 (et pas 5)
Et plus loin dans le tableau j’aurais
Jordane P.H. 1
Et plus loin encore
Jordane P.H. 1
Et plus loin encore
Jordane P.H. 1
Avec à d’autres endroits dans le tableau
Pépin A.C. 1 (et pas 2)
Puis une autre fois Pépin A.C., plus bas
Et idem pour Dupont N.N.
Donc là ce n’est plus un problème de code, mais plutôt de corrélation entre l’objectif et le résultat.
Avec les 5 lignes précédentes, je voudrais le tableau résultant suivant :
Jordane P.H. 5
Pépin A.C. 2
Dupont N.N. 2
Martin A. 1
Par sécurité je reprend le code avec tes ajouts.
echo '<blockquote><h3><a id="DESCRIBERS"></a>Statistics by name of describers :</h3></blockquote>';
	
	echo '<table class="sortablenarrow" id="you"><tr><th>NAME OF DESCRIBERS</th><th>COUNTER ALL TAXA</th></tr>';
	
	$requete = $connexion->prepare("SELECT Describer_initials, COUNT(Describer_initials) AS counter FROM taxabase3 WHERE Describer_initials is not null and trim(Describer_initials) != '' GROUP BY Describer_initials ORDER BY COUNT(Describer_initials) DESC, Describer_initials ASC");
	
	$requete->execute();
    $result[1] = $requete->fetchAll();
	$explode1 = '';
	foreach  ($result[1] as $row) {
	
	$Describer_initials = !empty($row["Describer_initials"]) ? $row["Describer_initials"] : NULL;
	if($Describer_initials){
		$explode1 = explode("|", $Describer_initials);
		if(!empty($explode1)){
			foreach($explode1 as $D){
				echo '<tr><td>' . $D . '</td><td>' . $row ["counter"] . '</td></tr>';	
			}
		}
	}		
}
	echo '</table>';
	echo '<p> </p>';
	echo '<p> </p>';


Je me demande si le souci ne serait pas dans le code suivant que je ne comprend pas:
$Describer_initials = !empty($row["Describer_initials"]) ? $row["Describer_initials"] : NULL


A+ Seb
0
Sebas22 Messages postés 110 Date d'inscription jeudi 13 mai 2010 Statut Membre Dernière intervention 24 juillet 2018 5
16 févr. 2018 à 12:34
Bonjour,

Pas de réaction???
La suppression de la ligne
$Describer_initials = !empty($row["Describer_initials"]) ? $row["Describer_initials"] : NULL;
Entraîne un bug donc c’est pas çà.
Il semble que le tri dans la requête ne s’applique pas au code php.
J’ai regardé le manuel PHP et il semble qu’il faudrait ajouter une ligne du type
ksort($explode1);
J’ai essayé à plusieurs endroits mais cela ne marche pas.
J’ai essayé de passer par un intermédiaire (avant le tri ‘sort’) du type
foreach ($explode1as $cellexplode1) { ksort($cellexplode1);}
Mais cela ne marche pas plus.
J’y ai passé 6 heures !
Je suis mal , là.
Quelqu’un peut-il aider ?
Merci d’avance

Seb

PS : voici le dernier code auquel je suis arrivé pour info pour montrer que je ne suis pas resté les bras croisées, mais c’est plein de bugs.
$requete->execute();
    $result[1] = $requete->fetchAll();
	$plan21 = '';
	$tabdescriber_counter = array();
		
    	foreach  ($result[1] as $row) 
	{
		{
		$plan21 = explode("|", $row["Describer_initials"]);
		foreach ($plan21 as $cellplan21)
		{
			$cellplan21[$counter][] = 
				array($row[$cellplan21],
                                       $row[$counter]);
		}	
	}
	ksort($tabdescriber_counter);
	foreach($tabdescriber_counter 
                as $describer => $tabcounter)
	{
		foreach($tabcounter as $Original_array)
		{
			echo '<tr><td><b>' . $describer .
                            '</b></td><td><i>'. $Original_array[0] . '</i></td></tr>';
		}
	}
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
17 févr. 2018 à 10:06
J'ai du mal à voir ce que tu veux faire.

Pour mieux comprendre... il faudrait que tu nous donnes
- un exemple du résultat obtenu actuellement (le code html.. pas juste du blabla...) + une capture écran de l'affichage
- un exemple du résultat attendu (le code html que tu auras simulé à la main.. pas juste du blabla...)


Dans l'idéal il faudrait aussi nous montrer le contenu de ta variable $result[1] (tu n'as qu'à en faire un print_r )
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
Modifié le 17 févr. 2018 à 12:32
bonjour, je suggère:
- de simplifier le select:
SELECT Describer_initials FROM taxabase3 WHERE Describer_initials is not null and trim(Describer_initials) != ''  

- de faire ensuite:
$tabcellplan21 = array();
foreach  ($result[1] as $row) 
 {
 foreach (explode("|", $row["Describer_initials"]) as $cellplan21)
  {
   $tabcellplan21[] = $cellplan21;
  } 
 }
$compteurs=array_count_values($tabcellplan21);
foreach ($compteurs as $describer=>$count) {
    echo '<tr><td><b>' . $describer .
                            '</b></td><td><i>'. $count . '</i></td></tr>';
}
0
Sebas22 Messages postés 110 Date d'inscription jeudi 13 mai 2010 Statut Membre Dernière intervention 24 juillet 2018 5
17 févr. 2018 à 17:33
Bonjour Jordane45 et yg_be,

Oui Jordane tu devais être fatigué, c'est exactement ce que j'avais fait dans le post précédent.

Merci vivement (encore!) yg_be, c'est clair et (brillamment) court, mais il y a un petit bug, le pire pour moi car très général (Notice: Undefined)... mais cela doit être simple à corriger.

J'ai le message d'erreur suivant:

Notice: Undefined index: Describer_initials in D:\_Data\Killi-Data\wamp\www\killidataphpmysql\mem221bersmysql\aa-header-stats-counts1.php on line 299
Call Stack
# Time Memory Function Location
1 0.0050 371928 {main}( ) ..\xxxx.php:0

L'erreur est répétée x fois puis cela se termine par le nombre 65

J'ai vérifié 10 fois ton code original et sa copie dans la page, mais c'est pareil.

Par sécurité, je copie mon code ci-après:

$requete = $connexion->prepare("SELECT Describer_initials FROM taxabase3 WHERE Describer_initials is not null and trim(Describer_initials) != ''");
	
	//$Describer_initials = !empty($row["Describer_initials"]) ? $row["Describer_initials"] : NULL;
	//$cellplan21 = 'Describer_initials';
	//$tabcellplan21 = '';
	$tabcellplan21 = array();
	foreach  ($result[1] as $row) 
	{
	foreach (explode("|", $row["Describer_initials"]) as $cellplan21)
	//var_dump($Describer_initials); die();
	//var_dump($cellplan21); die();
	{
	$tabcellplan21[] = $cellplan21;
	} 
	}
	$compteurs=array_count_values($tabcellplan21);
	foreach ($compteurs as $describer=>$count) {
    echo '<tr><td><b>' . $describer .
                            '</b></td><td><i>'. $count . '</i></td></tr>';
	}
	


J'ai aussi essayé de définir les variables (ici par du code commenté), mais cela ne change rien

A+, Seb
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
17 févr. 2018 à 17:58
plutôt ainsi:
$requete = $connexion->prepare("SELECT Describer_initials FROM taxabase3 WHERE Describer_initials is not null and trim(Describer_initials) != ''");
 $requete->execute();
 $result[1] = $requete->fetchAll();	
$tabcellplan21 = array();
foreach  ($result[1] as $row) 
{
     foreach (explode("|", $row["Describer_initials"]) as $cellplan21)
     {
          $tabcellplan21[] = $cellplan21;
     } 
}
$compteurs=array_count_values($tabcellplan21);
foreach ($compteurs as $describer=>$count) {
    echo '<tr><td><b>' . $describer .
                            '</b></td><td><i>'. $count . '</i></td></tr>';
    }
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Sebas22 Messages postés 110 Date d'inscription jeudi 13 mai 2010 Statut Membre Dernière intervention 24 juillet 2018 5
21 févr. 2018 à 12:03
Bonjour Jordane45 et yg_be,

A mon tour d'être fatigué!

C'était une grosse boulette d'inattention!

Je marque comme résolu, ton code est parfait yg_be.

Merci à tous les 2.

yg_be, est-ce que je peux te demander encore quelques instants pour ma "formation" en PHP-MySQL (pas urgent).

Si je veux afficher les résultats dans l'ordre croissant ou décroissant pour la colonne 1 ou 2, je dois utiliser (je crois) ksort dans la partie php, mais je ne vois pas comment faire en dehors de la requête sql (et là çà ne marche pas, tu l'as pointé).

J'aimerais aussi comprendre ton raisonnement pour écrire le code des foreach avec des '{' et '}'.
Pourquoi 3 for each? pourquoi l'ouverture de '{' après le 1er?
Si tu devais parler ou écrire ce raisonnement, tu dirais quoi?

En tous cas re-merci!

Vous êtes super tous les 2.

Seb
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
21 févr. 2018 à 13:33
pour trier, bien que je n'ai pas compris ce que tu entends pas colonne 1 ou 2, il suffit peut-être d'ajouter
ksort($compteurs);
après la ligne 12.
explication du raisonnement:
foreach  ($result[1] as $row)
// pour chaque ligne de la réponse à la requête sql 
{
      foreach (explode("|", $row["Describer_initials"]) as $cellplan21)
     {
          // pour chaque initiale présente dans cette ligne
          $tabcellplan21[] = $cellplan21;
     } 
}
$compteurs=array_count_values($tabcellplan21);
// pour chaque initiale présente dans le tableau $compteurs
foreach ($compteurs as $describer=>$count) {
    echo '<tr><td><b>' . $describer .
                            '</b></td><td><i>'. $count . '</i></td></tr>';
    }

les accolades encadrent les instructions exécutées dans la boucle foreach
0
Sebas22 Messages postés 110 Date d'inscription jeudi 13 mai 2010 Statut Membre Dernière intervention 24 juillet 2018 5
26 févr. 2018 à 18:48
Bonjour yg_be,

Merci! les commentaires m'ont bien aidé à mieux comprendre sur for each!

Pour le tri c'était une question exploratoire, car le tableau inclut un javascript qui permet de trier chacune des colonnes.
J'ai testé le ksort ($compteurs) et çà marche pour la colonne de gauche du tableau.
Pour la colonne de droite j'ai essayé plein de trucs mais pas moyen.
Je pense que le code doit alors être repris complètement!
Mais c'était juste par curiosité (ce n'était pas une nouvelle question)

Merci encore!
Seb
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
26 févr. 2018 à 19:03
as-tu essayé
asort ($compteurs)
?
0