Menu

Un souci de finalisation avec explode PHP MySql [Résolu]

Sebas22 117 Messages postés jeudi 13 mai 2010Date d'inscription 21 février 2018 Dernière intervention - 14 févr. 2018 à 10:24 - Dernière réponse : yg_be 4674 Messages postés lundi 9 juin 2008Date d'inscriptionContributeurStatut 21 février 2018 Dernière intervention
- 21 févr. 2018 à 13:33
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




Afficher la suite 

9 réponses

Répondre au sujet
jordane45 20060 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 22 février 2018 Dernière intervention - 14 févr. 2018 à 11:48
0
Utile
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 : http://www.commentcamarche.net/faq/46512-pdo-gerer-les-erreurs

Ainsi que de celui ci : http://www.commentcamarche.net/faq/48399-php-gestion-des-erreurs-debogage-et-ecriture-du-code

Commenter la réponse de jordane45
Sebas22 117 Messages postés jeudi 13 mai 2010Date d'inscription 21 février 2018 Dernière intervention - 14 févr. 2018 à 15:04
0
Utile
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
Commenter la réponse de Sebas22
Sebas22 117 Messages postés jeudi 13 mai 2010Date d'inscription 21 février 2018 Dernière intervention - 16 févr. 2018 à 12:34
0
Utile
2
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>';
		}
	}
jordane45 20060 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 22 février 2018 Dernière intervention - 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 )
yg_be 4674 Messages postés lundi 9 juin 2008Date d'inscriptionContributeurStatut 21 février 2018 Dernière intervention - 17 févr. 2018 à 12:27
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>';
}
Commenter la réponse de Sebas22
Sebas22 117 Messages postés jeudi 13 mai 2010Date d'inscription 21 février 2018 Dernière intervention - 17 févr. 2018 à 17:33
0
Utile
1
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
yg_be 4674 Messages postés lundi 9 juin 2008Date d'inscriptionContributeurStatut 21 février 2018 Dernière intervention - 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>';
    }
Commenter la réponse de Sebas22
Sebas22 117 Messages postés jeudi 13 mai 2010Date d'inscription 21 février 2018 Dernière intervention - 21 févr. 2018 à 12:03
0
Utile
1
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
yg_be 4674 Messages postés lundi 9 juin 2008Date d'inscriptionContributeurStatut 21 février 2018 Dernière intervention - 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
Commenter la réponse de Sebas22