2 requêtes sur 1 interrogation SQL, la bête n'aime pas

tipitap Messages postés 23 Statut Membre -  
 Utilisateur anonyme -
Bonjour,

voilà, je suis en train de créer une page pour un site collaboratif.

Voici le schéma:

Une personne s'inscrit sur une page:
- à l'enregistrement, elle donne un pseudo, un mot de passe

A l'enregistrement (submit), une autre page s'ouvre:
- une session est créée avec son pseudo et mot de passe;
- les données sont transmises à la base SQL, qui renvoie en retour un numéro auto-incrémenté (clé primaire).

Ensuite, la personne peut proposer un contenu sur une autre page:
- les informations sur le contenu sont renvoyées à la base SQL.

Mais je voudrais lier ce contenu à la personne. Je dois donc récupérer son numéro Id, à partir du mot de passe et et du pseudo qui sont en cookies.

Voici le code que j'ai rédigé:

----------Appel à la base---------------------------------------------------------
$connexion = mysql_connect($serveurbd, $userbd, $mdp);
mysql_select_db($nombd,$connexion);

----------requete pour retrouver le numéro du contributeur--------------
$Ref_contr =
"SELECT 'Id_contr'
FROM 'Contributeurs'
WHERE pseudo= '$pseudo'
AND mdp_contr=$mdp_contr";*/

---------requete pour insérer le contenu ---------------------------------------
$requete =
"INSERT INTO Contenus
(Contenus.Titre_cont, Contenus.Type_cont, Contenus.Editeur_cont, Contenus.Adresse_cont,
Contenus.Lang_cont, Contenus.Description_cont, Contenus.Ref_dom, Contenus.Ref_contr)
VALUES ('$Titre_cont', '$Type_cont', '$Editeur_cont', '$Adresse_cont',
'$Lang_cont', '$Description_cont', '$Ref_dom', '$Ref_contr')";

----------commande------------------------------------------------------------------
mysql_query($requete, $connexion);

Vous devinez quoi?
J'ai besoin de la 1ère requête pour remplir la 2e.
Mais la 1ère fait tout planter, et mon enregistrement ne passe plus jusqu'à la base...

Quelqu'un sait-il comment je pourrais m'en sortir?

Merci d'avance!

Benoit

4 réponses

  1. Utilisateur anonyme
     
    Bonjour

    Il manque des morceaux de ton code, ce que tu as laissé est incohérent.
    On peut quand même voir qu'il te manque des '' autour de $mdp_contr dans
    $Ref_contr = 
    "SELECT Id_contr 
    FROM Contributeurs 
    WHERE pseudo= '$pseudo' 
    AND mdp_contr='$mdp_contr'";


    Questions complémentaires : tu ne sais pas que les fonctions mysql_ sont obsolètes ? Il vaudrait mieux utiliser PDO.
    As-tu échappé les valeurs que tu mets dans tes requêtes avec mysql_real_escape_string ?
    0
  2. tipitap Messages postés 23 Statut Membre
     
    Bonjour le père,

    merci pour ta réponse. Les guillemets m'avaient échappé...

    J'ignorais que les fonctions mysql_ étaient obsolètes, et je n'ai aucune connaissance de PDO...

    Je ne comprends pas ta question:
    "As-tu échappé les valeurs que tu mets dans tes requêtes avec mysql_real_escape_string ?" Que veut dire "échapper"?

    Bonne journée!
    0
  3. tipitap Messages postés 23 Statut Membre
     
    Voici le texte entier; cela semblera peut-être plus cohérent?

    <?php
    session_start();
    include('bibli_contenu.php');
    entete('Enregistrement');
    affiche_menu();

    echo "</br>";
    //transformation des réponses du formulaire en variables
    $Id_contr = $POST['Ref_contr'];
    $Titre_cont = $_POST['titre'];
    $Type_cont = $_POST['type'];
    $Adresse_cont = $_POST['adresse'];
    $Editeur_cont= $_POST['editeur'];
    $Lang_cont = $_POST['lang'];
    $Ref_dom= $_POST['domaine'];
    $Description_cont = $_POST['description'];

    //Envoi dans la base
    $connexion = mysql_connect($serveurbd, $userbd, $mdp);
    mysql_select_db($nombd,$connexion);

    /*requete pour retrouver le numéro du contributeur
    $Ref_contr =
    "SELECT 'Id_contr'
    FROM 'Contributeurs'
    WHERE pseudo= '$pseudo'
    AND mdp_contr='$mdp_contr'";*/

    $requete =
    "INSERT INTO Contenus
    (Contenus.Titre_cont, Contenus.Type_cont, Contenus.Editeur_cont, Contenus.Adresse_cont,
    Contenus.Lang_cont, Contenus.Description_cont, Contenus.Ref_dom, Contenus.Ref_contr)
    VALUES ('$Titre_cont', '$Type_cont', '$Editeur_cont', '$Adresse_cont',
    '$Lang_cont', '$Description_cont', '$Ref_dom', '$Ref_contr')";
    //D'abord requête, puis connexion, et pas l'inverse...
    mysql_query($requete, $connexion);

    //demande à Mysql de nous dire quel est le chiffre qu'elle a auto-incrémenté pour l'enregistrement
    $Id_cont = mysql_insert_id();

    //Affichage du contenu par requête à MySQL
    echo "<b>Nous vous remercions pour votre enregistrement.</b>";
    echo "<br />";
    echo "Il porte le numéro '$Id_cont'";

    $requete = "select * from Contenus where Id_cont=$Id_cont";
    $resultat = mysql_query($requete, $connexion);
    $contenu = mysql_fetch_array($resultat);

    pied ();
    ?>
    0
  4. Utilisateur anonyme
     
    J'ignorais que les fonctions mysql_ étaient obsolètes
    Donc tu ne lis pas le manuel php ? Tu dois être très fort, moi je pratique depuis plus de 10 ans (en amateur) et j'ai encore souvent besoin de le consulter ^^
    je n'ai aucune connaissance de PDO
    Il n'y a pas grand chose à apprendre. Et tout est expliqué dans le manuel.

    Que veut dire "échapper"
    Imagine que tu ais une requête avec une variable php :
    "SELECT * FROM matable WHERE champ='$variable'"

    Ta variable vaut "l'homme"
    Quand php remplace $variable par sa valeur, ta requête devient
    "SELECT * FROM matable WHERE champ='l'homme'"

    Si tu regardes ce qui se passe après le where, tu vois la condition champ = 'l' et ce qui suit, c'est à dire homme', est une erreur de syntaxe. En effet, la valeur qui suit champ commence par une apostrophe, et s'arrête à la première apostrophe suivante. Donc s'il y a une apostrophe dans ta variable, ça va planter à tous les coups.
    Pour éviter ce problème, il faut insérer un \ avant les apostrophes dans les requêtes, comme indiqué dans le manuel (hum, hum) mysql. C'est ce qu'on appelle "échapper" les apostrophes.
    Je t'ai montré le cas des apostrophes, mais il y a d'autres caractères qui peuvent poser des problèmes du même style.
    Tous ces cas sont traités très simplement par une fonction en php : mysql_real_escape_string. Il faut que tu utilises cette fonction pour chaque variable que tu mets dans une requête.
    Dans ton cas :
    $Id_contr = mysql_real_escape_string($POST['Ref_contr']); 
    ...
    $Description_cont = mysql_real_escape_string($_POST['description']); 

    Attention, il faut avoir fait la connexion à la base de données AVANT d'appeler mysql_real_escape_string.
    Note que tu n'as pas ce problème d'échappement avec les requêtes préparées utilisées par PDO.

    Pour la résolution de ton problème, tu as défini une variable $Id_contr, mais dans la requête tu as mis $Ref_contr.
    Quand tu as une erreur à l'exécution d'une requête, pense à utiliser mysql_error() pour avoir un message d'erreur un peu explicite :

    mysql_query($requete) or die (mysql_error()); // le paramètre $connexion est inutile
    0