[RESOLU] Passage au Mysqli

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] Passage au Mysqli

Re: Passage au Mysqli

par inovea » 15 sept. 2014, 11:52

Merci pour ta réponse.
Mon formulaire fonctionne parfaitement à présent, sur mon formulaire j'ai modifié les valeurs (value) pour "disponible" et "enfants" de "oui"/"non" en "1"/"0".

De plus, j'ai vu sur internet qu'il n'était pas utile de fermer la requête avec mysqli_free_result($query); lorsqu'on avait qu'une seule requête qui plus est un SELECT ou UPDATE. J'ai supprimé cette ligne donc et toute marche à merveille!

Merci à tous de vos conseils en tout cas, vous m'avez beaucoup aider. Je met le sujet en résolu!

Re: Passage au Mysqli

par toytoy » 15 sept. 2014, 09:37

tu vas te faire taper sur les doigts pour ton "up" ^^

Pour les requêtes sql, si tu veux utilisez une chaîne de caractère il te faut des quote, si bien que lorsque ta requête est exécuter elle respecte cette syntaxe:

SELECT nom FROM user; // nom est le nom d'une colonne

SELECT nom FROM user WHERE nom='toto'; //nom est le nom d'une colonne, toto est une chaîne de caractère, ici on sélectionne tous les noms de la table user quand nom vaut toto

SELECT nom FROM user WHERE nom=prenom //nom et prenom sont des noms de colonnes Ici on sélectionne tous les noms dans la table user quand le nom et le prenom sont identiques

Donc quand tu construits ta requête en php, si tes variables sont des types string, il ne faut pas oublier des ' en plus, ex:

$nom = "toto";
$requete = 'SELECT nom FROM user WHERE nom=' . $nom; // il rechercheras la colonne "toto" !
$requete = 'SELECT nom FROM user WHERE nom="' . $nom . '"'; // il rechercheras les nom qui valent "toto"

Re: Passage au Mysqli

par inovea » 14 sept. 2014, 19:03

Un petit up pour ne pas tomber dans l'oubli ! :p

Re: Passage au Mysqli

par inovea » 13 sept. 2014, 08:29

Merci pour votre aide encore une fois.
J'ai donc bien modifié mon
mysqli_free_result($requete);
en
mysqli_free_result($resultat);
comme tu me l'as suggéré Moogli.

J'ai aussi revu les guillemets de la syntaxe de ma requête, je ne sais pas si celle-ci est correcte mais mes variables $disponible, $enfants et $nb_enfants prennent bien le code couleur des variables sous DreamWeaver

Cependant, le message d'erreur a changé puisqu'à présent le retour est : Erreur sql: Unknown column 'oui' in 'field list'
Voici le code en question :
$requete = "UPDATE Mariage SET disponible = ".$disponible." , enfants = ".$enfants.", nb_enfants = '$nb_enfants' WHERE id = ".$id." ";
print "<br>$requete";
// Requete
$resultat = mysqli_query($bdd, $requete);
     if (!$resultat) // et remplacer on $requete par $resultat
        die ('Erreur sql: '.mysqli_error($bdd));
    else
    {
        mysqli_free_result($resultat);
    }
}
Si auquel cas, l'erreur proviendrait de mon formulaire, je vous liste le code :
<div id="formulaire-reservation">
					<form method="post" action="reservation.php">
                       <h3>Réservation de la famille <?php echo $_SESSION['Auth']['nom']; ?></h3>
                       <p>Bonjour <span><?php echo $_SESSION['Auth']['prenom'] ?> !</span><br />
                    <p>
                    Serez vous disponible?
                         <label>Oui
                            <input type="radio" name="disponible" id="oui" value="oui">
                        </label>
                        <label>Non
                            <input type="radio" name="disponible" id="non"value="non">
                        </label>
                    </p>
                    <p>
                    Serez-vous accompagnez d'enfants?   
                         <label>Oui
                            <input type="radio" name="enfants" onClick="afficher()" id="oui" value="oui">
                        </label>
                        <label>Non
                            <input type="radio" name="enfants" onClick="cacher()" id="non" value="non">
                        </label>
                         
                    <p id="champ_cache">
                        Combien d'enfants?
                        <input type="number" value="0" max="3" min="0" name="nb_enfants"/>
                   </p>
                       <p> 
                         <input type="submit" value="Valider" />
                        </p>
                  

Re: Passage au Mysqli

par ynx » 12 sept. 2014, 14:34

Il s'agit bien de la fonction myqsli_free_result() qui correspond à la syntaxe procédurale.
En syntaxe objet l'équivalent est effectivement mysqli_result::free() (la méthode free() de la classe mysqli_result).

C'est un bon réflexe de toujours libérer la mémoire si un script effectue plusieurs requête à la suite, mais c'est facultatif pour ce code puisque la mémoire sera de toute façon libérée à la fin du script (c-a-d juste après avoir exécuté l'unique requête).

Bonne journée

Re: Passage au Mysqli

par moogli » 12 sept. 2014, 14:16

salut,


le message d'erreur complet c'est mieux pour s'y retrouver :)

en clair le tiens te dit mysqli_free_result prend en paramètre une ressource (issu de mysqli_query par exemple) alors que tu lui fournit une chaîne de caractère.

par contre la donc ne connait pas mysqli_free_result mais mysqli_result_free :s

quoi qu'il y en soit c'est la variable $resultat qu'il faut que tu utilise et non pas la chaîne de caractère qui contient la requête SQL ($requete) :)


@+

Re: Passage au Mysqli

par inovea » 11 sept. 2014, 17:29

En effet après avoir supprimé le guillemet, je n'ai plus d'erreur SQL, ça ne tient parfois à pas grand chose! Merci à toi :)
Cependant j'ai toujours cette erreur qui persiste :
Warning: mysqli_free_result() expects parameter 1

Le nombre d'enfants présents s'enregistre bien dans ma base de données, mais qu'on choisisse "disponible" ou " non disponible" la valeur reste égale à 0.
$id = $_SESSION['Auth']['id'];
$requete = "UPDATE Mariage SET disponible ='$disponible' , enfants = '$enfants', nb_enfants = '$nb_enfants' WHERE id = '$id' ";
print "<br>$requete";
// Requete
$resultat = mysqli_query($bdd, $requete);
     if (!$resultat) // et remplacer on $requete par $resultat
        die ('Erreur sql: '.mysqli_error($bdd));
    else
    {
        mysqli_free_result($requete);
    }
}

Re: Passage au Mysqli

par ynx » 11 sept. 2014, 16:51

sirakawa te présente la syntaxe objet, puisque tu utilises la syntaxe procédurale il faut simplement remplacé par :
$resultat = mysqli_query($bdd, $requete);
mais l'idée était surtout d’exécuter ta requête :)

Tu as bien erreur de syntaxe sql dans ta requête : supprime le premier guillemet simple devant UPDATE.
Requête corrigée :
UPDATE Mariage SET disponible = 'oui', enfants = 'oui', nb_enfants = '3' WHERE id = '2'

Re: Passage au Mysqli

par inovea » 11 sept. 2014, 14:48

Merci encore une fois de ton aide, on avance je pense, mais je t'avoue ne pas tout saisir.
J'ai procédé à tes modifications, voilà le code d'ailleurs :
// Identification des variables
$id = $_SESSION['Auth']['id'];
$requete = "'UPDATE Mariage SET disponible ='$disponible' , enfants = '$enfants', nb_enfants = '$nb_enfants' WHERE id = '$id' ";
print "<br>$requete";
// Requete
$resultat = $mysqli->query($requete); //me semblait evident.....
     if (!$resultat) // et remplacer on $requete par $resultat
        die ('Erreur sql: '.mysqli_error($bdd));
    else
    {
        mysqli_free_result($requete);
    }
}
Et j'ai deux retours d'erreur :
Notice: Undefined variable: mysqli in /homepages/19/d344013182/htdocs/Inovea/mariage/reservation.php on line 22

Fatal error: Call to a member function query() on a non-object in /homepages/19/d344013182/htdocs/Inovea/mariage/reservation.php on line 22
La ligne 22 correspond à -> $resultat = $mysqli->query($requete);

Re: Passage au Mysqli

par sirakawa » 11 sept. 2014, 13:58

$requete = "'UPDATE Mariage SET disponible ='$disponible' , enfants = '$enfants', nb_enfants = '$nb_enfants' WHERE id = '$id' ";
//permet
print "<br>$requete"; 
$resultat = $mysqli->query($requete);; //me semblait evident.....
     if (!$resultat) // et remplacer on $requete par $resultat

Re: Passage au Mysqli

par inovea » 11 sept. 2014, 13:46

Merci de ta réponse Sirakawa.
J'ai donc suivi tes conseils et modifié mon code, je me permets de le partager à nouveau a cas où il y ait des erreurs :
session_start();
require("inc/connexion.php");
require("inc/auth.php");
// Si Auth n'est pas validé on revoie vers l'Acceuil
if(!Auth::isLogged())
header('Location: index.php');
  
// on teste si les variables du formulaire sont déclarées

if (isset($_POST['disponible']) && isset($_POST['enfants']))
{
    $disponible = mysqli_real_escape_string($bdd, $_POST['disponible']);
    $enfants = mysqli_real_escape_string($bdd, $_POST['enfants']);
    $nb_enfants = mysqli_real_escape_string($bdd, $_POST['nb_enfants']);
 
// lancement de la requête
$id = $_SESSION['Auth']['id'];
$requete = "'UPDATE Mariage SET disponible ='$disponible' , enfants = '$enfants', nb_enfants = '$nb_enfants' WHERE id = '$id' ";
//permet
print "<br>$requete"; 
    if (!$requete)
        die ('Erreur sql: '.mysqli_error($bdd));
    else
    {
        mysqli_free_result($requete);
        // Redirection en Javascript
        //echo '<script language="Javascript">
			//	document.location.replace("$confirmation.php");
				//</script>)';
    }
}
Et donc les print"$requete" mais retourne :
'UPDATE Mariage SET disponible ='oui' , enfants = 'oui', nb_enfants = '3' WHERE id = '2'

Accompagné de ce même message d'erreur :
Warning: mysqli_free_result() expects parameter 1 to be mysqli_result, string given in /homepages/19/d344013182/htdocs/Inovea/mariage/reservation.php on line 26

Re: Passage au Mysqli

par sirakawa » 11 sept. 2014, 11:40

// lancement de la requête
$query = mysqli_query($bdd, 'UPDATE Mariage SET disponible = "'.$disponible.'", enfants = "'.$enfants.'", nb_enfants = "'.$nb_enfants.'" WHERE id = "'.$_SESSION['Auth']['id'].'"');
// lancement de la requête
$id = $_SESSION['Auth']['id'];
$requete = "'UPDATE Mariage SET disponible ='disponible' , enfants = '$enfants', nb_enfants = '$nb_enfants' WHERE id = '$id' ";
//permet
print "<br>$requete"; qu'on peut visualiser et copier coller dans phpmyadmin si besoin

Re: Passage au Mysqli

par inovea » 10 sept. 2014, 20:09

Merci pour toutes vos réponses.
Pour vous répondre à mon tour, oui j'ai bien placé mon fameux mysqli_free_result avant le header et si je dis pas de betise cette ligne doit vérifier que ma requête s'execute :
if (!$query)
die ('Erreur sql: '.mysqli_error($bdd));
else

_______


Voici le code en question :
<?php
session_start();
require("inc/connexion.php");
//require("inc/auth.php");
// Si Auth n'est pas validé on revoie vers l'Acceuil
//if(!Auth::isLogged())
//header('Location: index.php');
  
// on teste si les variables du formulaire sont déclarées

if (isset($_POST['disponible']) && isset($_POST['enfants']))
{
    $disponible = mysqli_real_escape_string($bdd, $_POST['disponible']);
    $enfants = mysqli_real_escape_string($bdd, $_POST['enfants']);
    $nb_enfants = mysqli_real_escape_string($bdd, $_POST['nb_enfants']);
 
    // lancement de la requête
    $query = mysqli_query($bdd, 'UPDATE Mariage SET disponible = "'.$disponible.'", enfants = "'.$enfants.'", nb_enfants = "'.$nb_enfants.'" WHERE id = "'.$_SESSION['Auth']['id'].'"');
    if (!$query)
        die ('Erreur sql: '.mysqli_error($bdd));
    else
    {
        mysqli_free_result($query);
        // Redirection
        header('Location: confirmation.php');
    }
}
else
    echo 'Les variables du formulaire ne sont pas déclarées';
?>	

Re: Passage au Mysqli

par toytoy » 10 sept. 2014, 17:15

les " sont acceptés par MySQL, donc je vois pas ou est le problème :/

Re: Passage au Mysqli

par ynx » 10 sept. 2014, 17:05

Salut,

Le message d'erreur indique que le paramètre transmis à la fonction mysqli_free_result n'a pas le bon type. Le paramètre attendu doit être une ressource de type mysqli_result, or tu lui fournis un booléen.
mysqli_free_result($query); // $query correspond ici à FALSE
Ta variable $query est égale à FALSE car ta requête sql ne s'est pas exécutée correctement (surement une erreur de syntaxe).
Doc de mysqli_query : Retourne FALSE en cas d'échec (http://php.net/manual/fr/mysqli.query.php)

Il faut donc toujours vérifier si nos requêtes sont bien exécutées :
$result = mysqli_query($bdd, "ma requete sql");

if (!$result) {
    echo "Erreur SQL : " . mysqli_error($bdd);
} else {
    // la requête s'est bien exécutée
}
Enfin, ton erreur sql doit venir de l'utilisation des guillemets doubles, il me semble que MySQL n'accepte que l'utilisation des guillemets simples (il te suffit d'inverser les guillemets de ta requête).

PS : attention aux injections sql, il faudrait utiliser mysqli_real_escape_string pour protéger tes données.
PS2 : mysqli_free_result n'est pas forcément nécessaire si tu n'effectue qu'une seule requête sur ta page puisque la mémoire sera de toute façon libérée à la fin de ton script

Bonne journée