Tableau pour afficher des données SQL

Xalor
Invité n'ayant pas de compte PHPfrance

05 janv. 2013, 16:52

Bonjour,

J'essaye de mettre dans un tableau des données venant d'une table créer sous mysql, pourtant rien ne s'affiche, je ne comprends pas, l'erreur doit venir du tableau ou de la façon d'obtenir les données :?
Une ligne sur deux est de couleur bleu et j'ai enlevé pour des raisons évidentes le mot de passe et le nom d'utilisateur.

Merci d'avance pour ceux qui pourront m'apporter des réponses.

<?php
function showlist()
{

$hote = "localhost"; // l'adresse du serveur mySQL
$user = ""; // le nom d'utilisateur
$mdp = ""; // son mot de passe
$db = "projet"; // le nom de la base de données



$link = @mysql_connect( $hote, $user, $mdp ); // tentative de connexion au serveur
if( !$link ) // si échec, arrêter le script
die( "Impossible de se connecter à mysql : " . mysql_error() );

$ok = mysql_select_db( $db ); //Sélection de la base de donnée
if( !$ok ) // si échec, arrêter le script
die( "Impossible de sélectionner la bdd : " . mysql_error() );

$sql = "SELECT * FROM Magasin ;";
$result = mysql_query( $sql ); //Ma requète sql
if( !$result ) // si échec, arrêter le script
die( "Impossible d'exécuter la requête : " . mysql_error() );

echo "<table width=10 border='0'>"; //début du tableau dans lequel les éléments vont apparaître
echo "<tr align='left'><th>Quantité</th><th>Ref fabricant</th><th>Designation</th><th>Distributeur</th><th>Ref distributeur</th><th>Boitier</th></tr>"; //première ligne du tableau

while( $ligne = mysql_fetch_row( $result ) ){
// conversion du tableau $ligne en une liste de variables
// pour faciliter la manipulation :
list($ID, $RefFabric, $Designation, $Distributeur, $RefDistrib, $Boitier, $Quantité) = $ligne;


$i = 0;
if ($i % 2 == 0)
{
echo "<tr bgcolor='#0000FF'><td align='left'>$ID</td><td align='left'>$RefFabric</td><td align='left'>$Distributeur</td><td align='left'>$RefDistrib</td><td align='left'>$Boitier</td><td align='left'>$Quantité</td></tr>";
}
else
{
echo "<tr bgcolor='#eeeeee'><td align='left'>$ID</td><td align='left'>$RefFabric</td><td align='left'>$Distributeur</td><td align='left'>$RefDistrib</td><td align='left'>$Boitier</td><td align='left'>$Quantité</td></tr>";
}
$i++;
}
echo "</table>";
}
?>

Eléphant du PHP | 120 Messages

06 janv. 2013, 02:48

Bonsoir =)

A priori, rien ne me semble faux dans ce code. Mais quelque chose me dit que tu as oublié d'appeler la fonction après l'avoir définie. Il faut impérativement invoquer une fonction pour que le code qui y est contenu soit exécuté.
function showlist() {
    // Ton code
}
showlist(); // Appel de la fonction
Cependant, il y a quelques détails sur lesquels j'aimerais tirer ton attention :
Tout d'abord, à partir de la version 5.5 de PHP, l'extension MySQL est dépréciée. Ce qui signifie que son utilisation va générer des messages d'erreur. Il est même probable que cette extension sera retirée dans la version 5.6 ou 6 de PHP, ce qui rendra ton code totalement infonctionnel. Je te conseille donc d'utiliser mysqli ou PDO à la place.
De plus, en citant ton message pour voir ton code de plus près, j'ai vu que tu indentes ton code d'une façon assez peu commune et pas très claire. Je te conseille d'augmenter le niveau de ton indentation uniquement lorsque tu commences un nouveau bloc (if, while, for, ...) et de ne pas indenter de façon arbitraire ton code.

Perine

Xalor
Invité n'ayant pas de compte PHPfrance

06 janv. 2013, 03:30

Bonsoir,

Je créer cette fonction dans un "fichier librairie" que j'inclue dans la page principal et j'appel bien la fonction comme suit :

<body>
<table border='0' >
<tr>
<td> <h1>Gestion du magasin général </h1> </td>
ShowForm();
<td> <h3> <form action="login.php" method="POST">
Login <input size=4 type="text"name="login"/> Mot de passe <input size=4 type="password"name="mdp"/>
<input type="submit"/>
</form> </h3>
</td>
</tr>

<tr>
<td colspan="2"> <?php showlist(); ?> </td>

</tr>
</body>
</html>

pour ce qui est de mysql, il est vrai que je n'ai pas encore eu trop de problème mais je vais regarder sérieusement ceci.
Enfin pour l'indentation il est possible que les copier-coller de code la modifie un peu tout comme je sais que mon indentation est quelque peu chaotique et rend la lisibilité moindre pour les lecteurs.

Xalor

Xalor
Invité n'ayant pas de compte PHPfrance

06 janv. 2013, 03:32

Ah et seul la première ligne du tableau se met, en faite c'est à partir du while que plus rien n'apparait.

Eléphant du PHP | 120 Messages

06 janv. 2013, 14:08

Es-tu sûr que la table de la base de données n'est pas vide ? Que se passe-t-il si tu mets error_reporting(-1); au début du script ?
D'ailleurs il est déconseillé de sélectionner tous les champs d'une table à l'aide de "*", il est préférable de spécifier tous les champs. D'ailleurs il est aussi déconseillé d'utiliser des accents dans les noms de variables.

Mammouth du PHP | 2278 Messages

06 janv. 2013, 14:24

Tout bêtement:
"mysql_fetch_row() retourne un tableau indexé numériquement, qui correspond à la prochaine ligne du résultat MySQL result et déplace le pointeur interne de données d'un cran. "
conséquemment un test simple serait:
while( $ligne = mysql_fetch_row( $result ) )
{
print_r($ligne); //ligne est un tableau
}
mais :
hile ($ligne = mysql_fetch_array($result, MYSQL_ASSOC))
donne diretement un tableau associatif avec comme clefs les noms de champs...
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphant du PHP | 120 Messages

06 janv. 2013, 14:28

Il a utilisé fetch_row afin de pouvoir utiliser list() sur le tableau retourné, car list() ne fonctionne pas avec les tableaux associatifs.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

06 janv. 2013, 14:59

hile ($ligne = mysql_fetch_array($result, MYSQL_ASSOC))
autant directement utiliser mysql_fetch_assoc :)
Il a utilisé fetch_row afin de pouvoir utiliser list() sur le tableau retourné, car list() ne fonctionne pas avec les tableaux associatifs.
pourquoi utiliser list ?
hors mis le fait amusant de risquer d'écraser une variable ? :)
liste ne rend rien plus facile, autant utiliser la concaténation, c'est beaucoup plus clair que de mettre des variables dans une chaîne de caractère :)

pour le code.

$i étant affecté (à zéro) dans la boucle while sa valeur sera toujours zéro, donc toujours la même couleur de ligne.

du coup le code serait un poil mieux ainsi, et au passage on fait plaisir au standard en utilisant des " pour délimiter les attributs html ;)
<?php
echo '<table>';
$i = 0;
while( $ligne = mysql_fetch_assoc( $result ) ){
	if ($i % 2 == 0){
	$color = '0000FF';
	}else{
		$color = 'eeeeee';
	}
	echo '<tr bgcolor="#'.$color.'">
			<td align="left">'.$ligne['id'].'</td>
			<td align="left">'.$ligne['RefFabric'].'</td>
			<td align="left">'.$ligne['Distributeur'].'</td>
			<td align="left">'.$ligne['RefDistrib'].'</td>
			<td align="left">'.$ligne['Boitier'].'</td>
			<td align="left">'.$ligne['Quantité'].'</td>
		</tr>';
	$i++;
}
echo "</table>";
}
@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 120 Messages

06 janv. 2013, 15:53

Non, $i est incrémenté en dehors de la condition et je ne vois pas en quoi list() écraserais des variables dans un scope de fonction où ces variables n'existaient pas encore. D'ailleurs les variables sont évaluées dans des chaines délimitées par double-quotes et une concaténation d'autant de variables est à mes yeux bien moins claire que de les inscrire directement dans la chaine.

D'ailleurs pourquoi parles-tu de fetch_assoc(), alors que ce n'est pas le but de Xalor d'obtenir un tableau associatif ? :?

Mammouth du PHP | 2278 Messages

06 janv. 2013, 16:13

"Locutus est in deserto, dixit Ecclesiastes.":
fetch_row produit un tableau indexé numériquement : $ligne
list ($a,$b,$c)=$ligne;
par list on transforme ce tableau en une série de variables qu'on utilise ainsi;
$a, $b, $c....
par fetch_array, on obtent directement un tableau associatif qu'on utilise ainsi:
$ligne['a']; etc
Ceci étant dit, sachant qu'il vaudrait mieux passer à mysqli, on gagnerait à tout repenser
$mysqli = mysqli_init();
$resultat = $mysqli->real_connect($ServeurMysql, $RootMysql, $PassRootMysql, $NomBdd);
$resultat = $mysqli->query($requete);
while($obj = $resultat->fetch_object())
{//3
    $Titre = $obj->titre;	
    $Auteur =$obj->auteur;
    $Degre = $obj->degre;
}
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

06 janv. 2013, 22:26

while( $ligne = mysql_fetch_row( $result ) ){
// conversion du tableau $ligne en une liste de variables
] // pour faciliter la manipulation :
list($ID, $RefFabric, $Designation, $Distributeur, $RefDistrib, $Boitier, $Quantité) = $ligne;
$i = 0;
if ($i % 2 == 0)
{
echo "<tr bgcolor='#0000FF'><td align='left'>$ID</td><td align='left'>$RefFabric</td><td align='left'>$Distributeur</td><td align='left'>$RefDistrib</td><td align='left'>$Boitier</td><td align='left'>$Quantité</td></tr>";
}
else
{
echo "<tr bgcolor='#eeeeee'><td align='left'>$ID</td><td align='left'>$RefFabric</td><td align='left'>$Distributeur</td><td align='left'>$RefDistrib</td><td align='left'>$Boitier</td><td align='left'>$Quantité</td></tr>";
}
$i++;
}
echo "</table>";
}
?>
en dehors du while O_o ?

fetch_assoc parce que c'est plus à l'utilisation qu'un index numérique (surtout pour les gens qui vienne derrière.

quand au scope, si la variable existe avant elle sera écrasée (comme le $i par exemple). avec le register globals ça peu faire de beau dégât.

quand à la concaténation c'est ue question :
- de clarté : on sais où est la variable sans perdre 3 plombes à fouiller les chaines
- d'éviter les erreurs "à la con" quand on à ce type d'erreur (notamment avec les tableaux, d'où je suppose le list).

pour finir, je ne vois pas pourquoi recréer des infos qui existe et sont exploitable ;)
et comme ça on ne perd pas le file de la provenance des variables.

et pourquoi tous cela ? cherche la signature de Cyrano sur le forum ;)

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 120 Messages

06 janv. 2013, 23:30

Effectivement, je n'avais pas vu que $i était réinitialisé à chaque itération. Par contre, ça n'explique pas pourquoi rien ne s'affiche du tout.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

06 janv. 2013, 23:43

tu as quelque chose dans le source html de la page générée ?

Est ce que la requête sql retourne quelque chose ? (tu as bien des magasins dans la table ?)

peux tu nous montrer le create table de la tabel magasin, ainsi qu'un jeux de données utilisable pour faire la corrélation avec le code php.


@+
Il en faut peu pour être heureux ......