Warning: mysqli_fetch_array() expects parameter 1 to be mysq

Eléphanteau du PHP | 11 Messages

01 mai 2011, 08:14

Bonjour
Cela fait un petit moment que je cherche sans succés. Voici le script que j'utilise pour qu'un membre puisse modifier son adresse courriel et son mot de passe. Ce sript lors de l'exécution me renvoie:
Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in /home/musatgen/public_html/inscrits/profil.php on line 15

Code : Tout sélectionner

<?php session_start(); if(empty($_SESSION['inscrit'])){ header('Location: index.php'); } $inscrit = $_SESSION['inscrit']; require_once("../parametres/parametres.php"); require_once("../parametres/connexion.php"); $requete=" SELECT * FROM inscrits WHERE identifiant='".$inscrit."' "; if ($resultat = mysqli_query($connexion, $requete)) { [color=#FF0000]while ($donnees = mysqli_fetch_array($resultat)) {[/color] if(!empty($_POST)){ extract($_POST); $valid = true; if(empty($courriel)) { $valid = false; $erreur_courriel = 'Indiquez une adresse courriel'; } if(!empty($courriel) && filter_var($courriel, FILTER_VALIDATE_EMAIL)=== FALSE) { $valid = false; $erreur_courriel = 'Adresse courriel invalide'; } if(empty($motdepasse)) { $valid = false; $erreur_motdepasse = 'Choisissez votre nouveau mot de passe'; } if(!empty($motdepasse) && strlen($motdepasse)<5) { $valid = false; $erreur_motdepasse = '5 caractères minimum'; } if(!empty($motdepasse) && empty($motdepasse_c)) { $valid = false; $erreur_motdepasse_c = 'Confirmez le mot de passe'; } if(!empty($motdepasse) && !empty($motdepasse_c) && $motdepasse != $motdepasse_c) { $valid = false; $erreur_motdepasse_c = 'Mots de passe différents'; } if($valid) { $to = $courriel; $subject = 'Votre profil'; $message = '<p>Bonjour '.$identifiant.'!<br /> Vous avez modifié votre profil sur le site '.site_nom.'</p> <p>Voici vos nouvelles informations:<br /> E-mail : '.$courriel.'<br /> Mot de passe :'.$motdepasse.'<+p>'; $headers = 'From:noreply@'.site_nom.''."\r\n"; $headers.='MIME-version: 1.0'."\r\n"; $headers.='Content-type: text/html; charset=utf-8'."\r\n"; mail($to,$subject,$message,$headers); $requete=" UPDATE inscrits SET email='".$courriel."', motdepasse='".$motdepasse."' WHERE identifiant='".$inscrit."' "; if ($resultat = mysqli_query($connexion, $requete)) { $ok = 'Modification réussie, vous allez recevoir un email avec vos identifiants'; unset($_SESSION['membre']); session_destroy(); } } } } } ?> <!DOCTYPE html> <html lang="fr"> <?php require_once("../includes/head.php"); ?> <body> <div id="gauche"> <section> <h1>Votre profil</h1> <h3><?php echo 'Bonjour '.$inscrit.', vous pouvez modifier votre profil.';?></h3> <?php if(isset($ok)) echo '<div class="ok">'.$ok.'</div>';?> <form id=profil action="profil.php" method="post"> <fieldset> <div> <?php if(isset($erreur_courriel)) echo "<label class='erreur' for='erreurcourriel' >".$erreur_courriel."</label>"; else echo "<label for='courriel'>Adresse courriel :</label>"; ?> <input id=courriel type="text" name="courriel" value="<?php echo $donnees['courriel']; ?>" required autofocus /> </div> <div> <?php if(isset($erreurmotdepasse)) echo "<label class='erreur' for='motdepasse' >".$erreurmotdepasse."</label>"; else echo "<label for='motdepasse'>Nouveau mot de passe :</label>"; ?> <input type=password name=motdepasse id=motdepasse placeholder="Choisissez un mot de passe" required> </div> <div> <?php if(isset($erreurmotdepasse)) echo "<label class='erreur' for='motdepasse' >".$erreurmotdepasse."</label>"; else echo "<label for='motdepasse'>Confirmez le mot de passe :</label>"; ?> <input type=password name=motdepasse_c id=motdepasse_c placeholder="Confirmez votre mot de passe" required> </div> </fieldset> <div class="submit"><button type="submit">Modifiez</button></div> </form> <div id="login"><a href="logout.php">Logout</a></div> <?php if(isset($erreurid)) echo '<h4 class="erreur">'.$erreurid.'</h4>';?> </section> </div> <div id="droite"> <?php require_once("../includes/header.php"); ?> <footer> <section class=""> </section> </footer> </div> </body> </html>
Il est exécuté ici:
http://musatge.net/inscrits/profil.php

Merci

ViPHP
xTG
ViPHP | 7331 Messages

01 mai 2011, 11:38

C'est que la requête a échouée.
Tu ne protèges pas les paramètres, donc il y a fort à parier que $inscrit contienne des caractères qui nécessitent d'être protégés.

Pour la protection des paramètres : http://fr2.php.net/manual/fr/mysqli.rea ... string.php

Eléphanteau du PHP | 11 Messages

01 mai 2011, 15:37

Merci xTG

Je récupère la valeur de la vaiable $inscrit à la ligne 6:

Code : Tout sélectionner

$inscrit = $_SESSION['inscrit'];
dans ce cas de figure est-il nécessaire de la protéger?


Ma table inscrits:
id identifiant motdepasse courriel hachage actif
17 essai 5000 [email protected] a666587afda6e89aec274a3657558a27 1
18 essai1 2772 [email protected] b7892fb3c2f009c65f686f6355c895b5 0

Par ailleurs j'ai rajouté la ligne 16:

Code : Tout sélectionner

if ($resultat = mysqli_query($connexion, $requete)) { while ($donnees = mysqli_fetch_array($resultat)) { echo $donnees['courriel']; if(!empty($_POST)){
ce qui me donne bien à l'écran:
[email protected]
lors de l'exécution de la ligne 16:
echo $donnees['courriel'];

par contre l'exécution de la ligne 63:

Code : Tout sélectionner

<input id=identifiant type="text" name="identifiant" placeholder="Votre identifiant" value="<?php if(isset($identifiant)) echo $identifiant;?>" required autofocus />
[/color]
ne m'affiche pas: [email protected], la zone de saisie reste vide.

Si je saisie de nouvelles coordonnées, je reçoit bien le courriel mais la table n'est pas mise à jour et j'ai le message:
Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in /home/musatgen/public_html/inscrits/profil.php on line 15

En résumé la requête n'a pas échouée puisqu'elle me renvoie bien une valeur pour

Code : Tout sélectionner

echo $donnees['courriel'];
[/color] et le script envoie bien le courriel. Mais après il y a quelque chose qui coince et ça me dépasse :?

ViPHP
xTG
ViPHP | 7331 Messages

01 mai 2011, 16:33

$identifiant n'existe pas, c'est $donnees['identifiant'] qu'il faut utiliser.

Ensuite envoyer des variables dans une requête sans les protéger c'est comme laisser sa porte ouverte en pensant que personne n'y entrera.
De plus comme tu ne debug pas les erreurs de requêtes tu ne sais pas à cause de quoi une requête peut planter...
Dans ton cas tu n'as pas le message "Modification réussie, vous allez recevoir un email avec vos identifiants" mais tu n'en sais pas plus.
(Ou si tu as bien ce message la requête s'exécute bien mais ne pointe aucun résultat dans la table.

Eléphanteau du PHP | 11 Messages

04 mai 2011, 16:37

merci xTG
J'ai modifié mon script comme suit, cela fonctionne. J'ai essayé de sécuriser mes input. Je ne suis pas sur de moi sur ce point, il y a peut être des failles ou des redondances inutiles, n'hesitez pas à en faire la critique.

Code : Tout sélectionner

<?php session_start(); if(empty($_SESSION['inscrit'])){ header('Location: index.php'); } $inscrit = trim(htmlspecialchars(addslashes($_SESSION['inscrit']))); require_once("../parametres/parametres.php"); require_once("../parametres/connexion.php"); $requete=" SELECT * FROM inscrits WHERE identifiant='".$inscrit."' "; $resultat = mysqli_query($connexion, $requete); if($resultat) { $donnees = mysqli_fetch_assoc($resultat); if(!empty($_POST)){ extract($_POST); $motdepasse = trim(htmlspecialchars(addslashes($motdepasse))); $motdepasse_c = trim(htmlspecialchars(addslashes($motdepasse_c))); $valid = true; if(empty($courriel)) { $valid = false; $erreur_courriel = 'Indiquez une adresse courriel'; } if(!empty($courriel) && filter_var($courriel, FILTER_VALIDATE_EMAIL)=== FALSE) { $valid = false; $erreur_courriel = 'Adresse courriel invalide'; } if(empty($motdepasse)) { $valid = false; $erreur_motdepasse = 'Choisissez votre nouveau mot de passe'; } if(!empty($motdepasse) && strlen($motdepasse)<5) { $valid = false; $erreur_motdepasse = '5 caractères minimum'; } if(!empty($motdepasse) && empty($motdepasse_c)) { $valid = false; $erreur_motdepasse_c = 'Confirmez le mot de passe'; } if(!empty($motdepasse) && !empty($motdepasse_c) && $motdepasse != $motdepasse_c) { $valid = false; $erreur_motdepasse_c = 'Mots de passe différents'; } if($valid) { $to = $courriel; $subject = 'Votre profil'; $message = '<p>Bonjour '.$identifiant.'!<br /> Vous avez modifié votre profil sur le site '.site_nom.'</p> <p>Voici vos nouvelles informations:<br /> E-mail : '.$courriel.'<br /> Mot de passe :'.$motdepasse.'</p>'; $headers = 'From:noreply@'.site_nom.''."\r\n"; $headers.='MIME-version: 1.0'."\r\n"; $headers.='Content-type: text/html; charset=utf-8'."\r\n"; mail($to,$subject,$message,$headers); $courriel = mysqli_real_escape_string($connexion, $courriel); $motdepasse = mysqli_real_escape_string($connexion, $motdepasse); $requete=" UPDATE inscrits SET courriel='".$courriel."', motdepasse='".$motdepasse."' WHERE identifiant='".$inscrit."' "; if ($resultat = mysqli_query($connexion, $requete)) { $ok = 'Modification réussie, vous allez recevoir un email avec vos identifiants'; unset($_SESSION['inscrit']); session_destroy(); mysqli_close($connexion); } else { echo "Erreur : <strong>" . mysqli_error($connexion) . "</strong>"; } } } } else { echo "Erreur : <strong>" . mysqli_error($connexion) . "</strong>"; } ?> <!DOCTYPE html> <html lang="fr"> <?php require_once("../includes/head.php"); ?> <body> <div id="gauche"> <section> <h1>Votre profil</h1> <h3><?php echo 'Bonjour '.$inscrit.', vous pouvez modifier votre profil.';?></h3> <form id=profil action="profil.php" method="post"> <fieldset> <div> <?php if(isset($erreur_courriel)) echo "<label class='erreur' for='erreurcourriel' >".$erreur_courriel."</label>"; else echo "<label for='courriel'>Adresse courriel :</label>"; ?> <input id=courriel type="text" name="courriel" value="<?php echo $donnees['courriel']; ?>" required autofocus /> </div> <div> <?php if(isset($erreurmotdepasse)) echo "<label class='erreur' for='motdepasse' >".$erreurmotdepasse."</label>"; else echo "<label for='motdepasse'>Nouveau mot de passe :</label>"; ?> <input type=password name=motdepasse id=motdepasse placeholder="Choisissez un mot de passe" required> </div> <div> <?php if(isset($erreurmotdepasse)) echo "<label class='erreur' for='motdepasse' >".$erreurmotdepasse."</label>"; else echo "<label for='motdepasse'>Confirmez le mot de passe :</label>"; ?> <input type=password name=motdepasse_c id=motdepasse_c placeholder="Confirmez votre mot de passe" required> </div> </fieldset> <div class="submit"><button type="submit">Modifiez</button></div> </form> <?php if(isset($erreurid)) echo '<h4 class="erreur">'.$erreurid.'</h4>'; if(isset($ok)) echo '<h4 class="ok">'.$ok.'</h4>'; ?> </section> </div> <div id="droite"> <?php require_once("../includes/header.php"); ?> <footer> <section class=""> </section> </footer> </div> </body> </html>