[RESOLU] Php Mysqli

Petit nouveau ! | 2 Messages

26 sept. 2012, 13:35

Bonjour !

Je m'inscris et je vous écris car je dois avoir un bug dans un script et je trouve pas où !

Est-ce qu'une âme charitable pourrait m'indiquer comment le retrouver ?

En fait je dois afficher dans une notice le contenu d'une requête et celle ci ne me renvois qu'un seul champs au lieu des 26 !
Par contre l'affichage des champs est parfait....

voilà le code :

Code : Tout sélectionner

<h3><?php echo $_GET['target'];?></h3> <?php //connexion db $mysqliconnec = mysqli_connect("xxx", "xxx", "xxx", "xxx"); if (mysqli_connect_errno($mysqliconnec)) { echo 'erreur de connexion:'.mysqli_connect_error().'<br>'; } //interrogation db et affichage des immeubles $nam = $_GET['target']; $query = 'SELECT * FROM `dbBuilding` WHERE `Name` = "'.$nam.'"'; $render .= '<table><tr><td>'; // Execute Query if($result = $mysqliconnec->query($query)) { //controle erreur if(!$result) { echo 'Erreur Requête : '.$mysqliconnec->error; } $nbrfield = $result->field_count; for($i=0; $i<$nbrfield; $i++ ) { echo $nbrfield; $champs = $result->fetch_field_direct($i); $render .= '<tr><td>'; $render .= $champs->name.'</td><td>'; $row = $result->fetch_row(); $render .= $row[$i]; $render .='</td></tr>'; } $result->free(); $render .= '</table>'; echo $render; } $mysqliconnec->close(); ?>

ViPHP
ViPHP | 2577 Messages

26 sept. 2012, 13:52

Il faut travailler avec plus de logique.

1) la requete (query) avec test d'erreur
2) faire l'entete avec une boucle (for) sur les colonnes si tu veux
3) boucler sur les ligne (while + fetch) avec une boucle sur les colonnes

Dans ton script tu mélange la boucle sur les colonnes avec celle sur les lignes.

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

26 sept. 2012, 14:06

salut,

ceci
if($result = $mysqliconnec->query($query))
{
est inutile, il y a même doublon avec celui d'en dessous.

donc simplement
$result = $mysqliconnec->query($query)
La méthode
$result->free();
permet de "libérer" le jeux de résultat, donc après l'utilisation de cette méthode tu n'auras plus la possibilité d'utiliser les données.

Cette ligne doit être après l'utilisation des données, donc du while.

<?php
		$nbrfield = $result->field_count;
		for($i=0; $i<$nbrfield; $i++ ){
			echo $nbrfield;
			$champs = $result->fetch_field_direct($i);
			$render .= '<tr><td>';
			$render .= $champs->name.'</td><td>';
			$row = $result->fetch_row();
			$render .= $row[$i];
			$render .='</td></tr>';

		}
la tu compte le nombre de champs dans le jeux de résultats (donc de colonne dans la table dbBuilding avec ta requête).
ensuite tu affiche une nouvelle ligne de tableau qui va contenir le nom du champ indiqué par l'index courant, et la valeur d'un champ correspondant à l'index courant.
et ceci autant de fois qu'il y a de champ dans ta table dbBuilding.

en clair tu ne va pas afficher toutes les infos à chaque fois mais une seule, pire tu vas tenter autant de "tour" que de champs dans la table et si ton jeux de résultat à moins de lignes que de champs $row va vite être égale à false et la ligne suivant ($render .= $row[$i];) va donc fournir une erreur (false n'est pas un tableau).

si tu ne veux pas afficher les noms de colonnes à la main pourquoi pas mais les données c'est après.

au final ton code devrait ressembler à ceci (si j'ai bien pigé ce que tu veux)
<?php 
if (!empty($_GET['target']))
	$nam =  mysqli_real_escape_string($_GET['target']);
else
	$nam = "";
?>
<h3>
	<?php echo $nam;?>
</h3>
<?php 
//connexion db
$mysqliconnec = mysqli_connect("xxx", "xxx", "xxx", "xxx");

if (mysqli_connect_errno($mysqliconnec)) {
	echo 'erreur de connexion:'.mysqli_connect_error().'<br>';
}
else {
	//interrogation db et affichage des immeubles
	$query = 'SELECT * FROM dbBuilding WHERE Name = \''.$nam.'\'';
	// Execute Query
	$result = $mysqliconnec->query($query);
	//controle erreur
	if($result === false){
		echo 'Erreur Requête : '. $mysqliconnec->error;
	}
	else {
		$render .= '<table>';
		$nbrfield = $result->field_count;
		$render .= '<tr>';
		for($i=0; $i<$nbrfield; $i++ ){
			$champs = $result->fetch_field_direct($i);
			$render .= '<td>'.$champs->name.'</td>';
		}
		$render .= '</tr>';

		while ($row = $result->fetch_row()){
			echo '<tr>';
			echo '<td>'.$row["batID"].'</td>';
			echo '<td>'.$row["Name"].'</td>';
			echo '<td>'.$row["Address "].'</td>';
			echo '<td>'.$row["Chinese"].'</td>';
			echo '<td>'.$row["dateStart "].'</td>';
			echo '<td>'.$row["dateEnd"].'</td>';
			echo '<td>'.$row["Notes"].'</td>';
			echo '<td>'.$row["TYP01 "].'</td>';
			echo '</tr>';
		}
		echo '</table>';
		$result->free();
		$result->close();
		$mysqliconnec->close();
	}
}
?>
@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 2 Messages

26 sept. 2012, 15:20

Merci à vous ! En fait j'avais pris le truc à l'envers et du coup j'ai reécris le script et du coup ça marche super !!!

Bonne journée et un très grand merci !