Souci de Undefined index dans un comptage Mysql

Résolu/Fermé
Sebas22 Messages postés 110 Date d'inscription jeudi 13 mai 2010 Statut Membre Dernière intervention 24 juillet 2018 - 28 mars 2017 à 18:05
ThEBiShOp Messages postés 8378 Date d'inscription jeudi 22 mars 2007 Statut Contributeur Dernière intervention 8 février 2021 - 29 mars 2017 à 17:53
Bonjour,

Voilà j’ai un code dont la requête SQL marche dans PhpMyAdmin de wamperver.
Lorsque je veux afficher les résultats de la requête pour la page dans localhost, j’ai un souci avec le message d’erreur :
Notice: Undefined index: counter in D xxxx.php on line 79

La ligne 79 est:
$counter = $_POST['counter'];
C’est pareil avec $_GET
J’ai vu sur CCM (page https://forums.commentcamarche.net/forum/affich-37636387-php-notice-undefined-index que c’est une broutille et qu’il faut tester
$counter = !empty($_POST['counter']) ? $_POST['counter'] : NULL;
Si je fais cela il n’y a plus de message d’erreur, la 1ère colonne s’affiche correctement, mais pas le comptage pour chaque ligne (la 2ème colonne est totalement vide).
Voici le bout de code :
$requete = $connexion->prepare("SELECT Full_subgenus_valid_sp, COUNT(Full_subgenus_valid_sp) AS counter FROM taxabase2 WHERE Full_subgenus_valid_sp is not null and trim(Full_subgenus_valid_sp) != '' GROUP BY Full_subgenus_valid_sp ORDER BY Full_subgenus_valid_sp");
	//$counter = $_POST['counter'];
	$counter = !empty($_POST['counter']) ? $_POST['counter'] : NULL;
	$requete->execute();
    $result[1] = $requete->fetchAll();
	foreach  ($result[1] as $row) {
	
	echo '<tr><td><i>' . $row["Full_subgenus_valid_sp"] .							
                            '</i></td><td>'. $counter . '</td></tr>';
	}	


Un coup de pousse serait bienvenu !
Merci d’avance

Seb


4 réponses

ThEBiShOp Messages postés 8378 Date d'inscription jeudi 22 mars 2007 Statut Contributeur Dernière intervention 8 février 2021 1 565
29 mars 2017 à 16:29
Pour ta première question.

Comme je disais dans mon 1er message, il faut que tu comprennes d'où vient tes données.
Les variables $_POST et $_GET permettent de récupérer des données qui sont passées par une requête HTTP, typiquement, ça peut venir d'un formulaire. Dans ton formulaire, tu définies la méthode qui peut être post ou get, et les données seront passées à la page cible de ton formulaire suivant cette méthode.
En post, les données sont passées dans la requête HTTP, c'est la méthode la plus utilisée.
En get, les données sont passées dans l'url de la form http://www.url.com?champ1=truc&champ2=bidule
tu pourras donc récupérer $_GET['champ1'] et $_GET['champ2']
Tu peux utiliser les get directement en les ajoutant dans le href d'un lien, c'est très pratique d'ailleurs.

Comme tu travailles avec une requête SQL, ce n'est pas ce que tu veux, il ne faut donc pas utiliser ça.

Ensuite, pour comprendre
$counter = !empty($_POST['counter']) ? $_POST['counter'] : NULL;
il faut que tu comprennes ce que cette ligne veut dire.
Il s'agit d'un opérateur ternaire.
Cette ligne équivaut exactement à ceci que tu auras plus facilité à compprendre :
if (!empty($_POST['counter'])) {
	$counter = $_POST['counter'];
} else {
	$counter = NULL;
}

Evite peut être ce genre de syntaxe pour l'instant...
Du coup ta variable $counter avait forcément une valeur, et c'était NULL vu que $_POST['counter'] n'existe pas.

D'une façon plus générale, n'utilise un code que si tu le comprends. Il y a toujours plusieurs manière de faire une même chose, et utiliser du code que tu ne comprends pas te posera des problèmes.


Et pour ta 2ème question, c'est difficile de répondre sans savoir ce que tu as dans ta base de données, mais si tu obtiens ce que tu veux dans phpmyadmin, vas-y, ton tableau semble correct.
Par contre, retire les lignes :
$counter1 = !empty($_POST['counter1']) ? $_POST['counter1'] : NULL;
$counter2 = !empty($_POST['counter2']) ? $_POST['counter2'] : NULL;

pour les raisons que je viens de cité, ça ne sert à rien vu que tu n'utilises pas $counter1 et $counter2 ensuite et ça n'a pas de sens parce que tu n'as pas de $_POST (si j'ai bien compris ton code...)
1
ThEBiShOp Messages postés 8378 Date d'inscription jeudi 22 mars 2007 Statut Contributeur Dernière intervention 8 février 2021 1 565
28 mars 2017 à 18:24
Salut,

Si ton counter est une colonne du résultat de ta requête, tu dois récupérer cette valeur dans le parcours de tes résultats.
La tu essaies de récupérer ton counter dans un $_POST, ce qui veut dire que cette donnée provient d'un formulaire (pour faire simple).
Je ne pense pas que c'est ce que tu veux.
Il faudrait plutôt que tu mettes $row["counter"] dans ton echo au lieu de $counter.

Il faut que tu te représentes bien d'où viennent tes données et comment les manipuler.

Après il faut aussi que tu sois sûr que ta requête te donne ce que tu veux et que tu saches comment l'exploiter. Ce n'est pas parce que tu obtiens quelque chose dans phpmyadmin que c'est correct pour autant
0
Sebas22 Messages postés 110 Date d'inscription jeudi 13 mai 2010 Statut Membre Dernière intervention 24 juillet 2018 5
29 mars 2017 à 15:00
Bonjour ThEBishop,
Merci beaucoup.
Il fallait remplacer
                            '</i></td><td>'. $counter . '</td></tr>';
Par
<code php>
                            '</i></td><td>'. $row ["counter"] . '</td></tr>';

Et çà marche nickel!
Je me disais bien que c’était pas grand chose, mais à mon niveau mes connaissances ne sont pas hyper-solides et à un moment je ne « vois » plus rien.
Pour mon apprentissage puis-je avoir ton feedback sur la question de :
//$counter = $_POST['counter']; ou _GET
Car j’obtiens
Notice: Undefined index: counter in D xxxx.php on line 79
Par rapport à (qui marche… mais je pige pas pourquoi)
$counter = !empty($_POST['counter']) ? $_POST['counter'] : NULL;
Et 2ème point… je prévois idéalement de faire un tableau à 4 colonnes au lieu de 2 (mais à ce stade je ne peux pas le tester car il faut que je crée un nouveau champ dans ma base de donnée intitulé Full_genus_valid_sp
Ma requête simple serait :
$requete = $connexion->prepare("SELECT Full_genus_valid_sp, COUNT(Full_genus_valid_sp) AS counter FROM taxabase2 WHERE Full_genus_valid_sp is not null and trim(Full_genus_valid_sp) != '' GROUP BY Full_genus_valid_sp ORDER BY Full_genus_valid_sp");

Et donc si je veux mon tableau à 4 colonnes, le code deviendrait (c’est là que j’ai besoin de tes corrections y compris sur la requête globalisée notamment pour GROUP BY)
$requete = $connexion->prepare("SELECT Full_genus_valid_sp, COUNT(Full_genus_valid_sp) AS counter1, Full_subgenus_valid_sp, COUNT(Full_subgenus_valid_sp) AS counter2 FROM taxabase2 WHERE Full_genus_valid_sp is not null and trim(Full_genus_valid_sp) != '' and Full_subgenus_valid_sp is not null and trim(Full_subgenus_valid_sp) != ''GROUP BY Full_genus_valid_sp and Full_subgenus_valid_sp ORDER BY Full_genus_valid_sp");
$counter1 = !empty($_POST['counter1']) ? $_POST['counter1'] : NULL;
$counter2 = !empty($_POST['counter2']) ? $_POST['counter2'] : NULL;
	$requete->execute();
    $result[1] = $requete->fetchAll();
	foreach  ($result[1] as $row) {
	echo '<tr><td><i>' . $row["Full_genus_valid_sp"] .					
                            '</i></td><td>'. $row ["counter1"] . 
	‘<td><td><i>' . $row["Full_subgenus_valid_sp"] .					
                            '</i></td><td>'. $row ["counter2"] . '</td></tr>';
	}

Bon ce n’est pas incontournable car je peux toujours faire des tableaux à 2 colonnes qui se suivent!

Encore merci!
A+,

Seb
0
Sebas22 Messages postés 110 Date d'inscription jeudi 13 mai 2010 Statut Membre Dernière intervention 24 juillet 2018 5
29 mars 2017 à 17:18
Bonjour ThEBishop,

Merci beaucoup.

Tout est limpide et je marque 'résolu'.

En fait je me complique souvent la vie pour rien (par exemple avec ces $_Get ou $_Post sans formulaire)... heureusement tu es mon ange gardien!

J'apprend lentement et parfois en tâtonnant... mais (pour moi) c'est mieux.
Et produire c'est plus gratifiant (toujours pour moi) que tout comprendre avant.

Seb
0
ThEBiShOp Messages postés 8378 Date d'inscription jeudi 22 mars 2007 Statut Contributeur Dernière intervention 8 février 2021 1 565
29 mars 2017 à 17:53
Tant que tu te poses les questions, que tu essaies et que tu cherches à comprendre, moi ça me va. Il y a tellement d'utilisateurs sur ce forum qui demandent des réponses toutes pondues sans maitriser les bases et sans vouloir chercher à comprendre...
J'aiderai toujours quelqu'un qui montre de la bonne volonté donc continue comme ça.

Bon courage
0