Retour de mysqli_result

Anton
Invité n'ayant pas de compte PHPfrance

25 mars 2021, 03:21

Bonjour,
Je galère depuis quelques jours pour avoir un "bon résultat"...
J'utilise une fonction db_resultat dont le code est :
function db_resultats($sql,$database) {
        $resultat=array();
        if (mysqli_connect_errno()) {
            printf("Échec de la connexion : %s\n", mysqli_connect_error());
	    die("Erreur");
	    exit();
        }
	if ($result = mysqli_query($database,$sql)) {
	          if ($result) {
			while ($data = mysqli_fetch_assoc($result)) {
			$resultat[] = $data;
		   }
		   mysqli_free_result($result);
	}
        return $resultat;
}
une autre fonction appelée avant ouvre la connexion à la database mysql...Bref, du classique...
Si $sql = "select * from toto"; -> Pas de problème tout fonctionne bien même si le résultat est vide pas de soucis ... cela marche comme je le souhaite. Mais si $sql="insert into toto values ('test');"; ou même un update, j'ai le retour suivant :
Warning: mysqli_free_result() expects parameter 1 to be mysqli_result, bool given in test.php on line xxx.., l'action est bien faite en base mais j'ai un Warning que je veux enlever. Je crois que c'est parqu'il n'y a pas de record en retour mais quel est le bon test à mettre ?
Est-ce quelqu'un à une idée de ce qui manque dans mon code ?

Merci de votre aide ...
A+

Mammouth du PHP | 2703 Messages

25 mars 2021, 11:26

https://www.php.net/manual/fr/mysqli.query.php
/* "Create table" ne retournera aucun jeu de résultats */
if ($mysqli->query("CREATE TEMPORARY TABLE myCity LIKE City") === TRUE) {
printf("Table myCity créée avec succès.\n");
}

avec un insert, le retour est true, donc il ne faut pas exécuter mysqli_free_result($result);

Petit nouveau ! | 1 Messages

26 mars 2021, 14:31

En fait, c'est le "while ($data = mysqli_fetch_assoc($result)) {"
qui me retour un message d'erreur pas le free_result.

Mammouth du PHP | 2703 Messages

26 mars 2021, 14:48

quel est ce nouveau message d'erreur exactement ?

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

29 mars 2021, 18:18

Salutations !

Dans le lien proposé par or1, la documentation indique pour mysqli_query " Retourne false en cas d'échec. Pour des requêtes réussites qui produisent un jeu de résultat tel que SELECT, SHOW, DESCRIBE ou EXPLAIN, mysqli_query() retournera un objet mysqli_result. Pour les autres types de requêtes ayant réussi, mysqli_query() retournera true. "

Si la valeur retour de mysqli_query est :
== false (la valeur est fausse), c'est qu'il y a eu une erreur
=== true (la valeur est vrai ET le type est booléen), c'est que la requête s'est exécutée correctement mais n'a pas produit de jeu de résultat. Il ne faut donc pas faire de fetch ou de free
autre (la valeur n'est pas fausse ET le type n'est pas booléen), c'est que la requête a retourné un jeu de résultat (même vide) et que tu peux procéder au traitement de celui-ci avec ton fetch et ton free :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...