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

Fermé
tipitap Messages postés 21 Date d'inscription mercredi 4 février 2009 Statut Membre Dernière intervention 28 juin 2014 - 27 juin 2014 à 18:27
 Utilisateur anonyme - 29 juin 2014 à 06:53
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

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
tipitap Messages postés 21 Date d'inscription mercredi 4 février 2009 Statut Membre Dernière intervention 28 juin 2014
28 juin 2014 à 17:25
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
tipitap Messages postés 21 Date d'inscription mercredi 4 février 2009 Statut Membre Dernière intervention 28 juin 2014
28 juin 2014 à 17:28
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
Utilisateur anonyme
29 juin 2014 à 06:53
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