Page 1 sur 2

Insert To probleme

Posté : 20 janv. 2012, 14:06
par demonjhon
Voila une nouvelle question pour les pro du php ^^ un peu de cirage ca fait pas de mal ;p
<?php



echo
	'nom :',$_POST['Itm_8_00_1'],
	'<br />prenom :',$_POST['Itm_8_00_2'],
	'<br />ville :',$_POST['Itm_8_00_3'],
	'<br />adresse :',$_POST['Itm_8_00_4'],
	'<br />code :',$_POST['Itm_8_00_5'],
	'<br />mail ',$_POST['Itm_8_00_6'],
	'<br />login :',$_POST['Itm_8_00_7'],
	'<br />mot de passe :',$_POST['Itm_8_00_8'];


$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host=localhost;dbname=bd_principale', 'root', '', $pdo_options);

$nom=$_POST['Itm_8_00_1'];
$prenom=$_POST['Itm_8_00_2'];
$adresse=$_POST['Itm_8_00_3'];
$adresse2=$_POST['Itm_8_00_4'];
$ville=$_POST['Itm_8_00_5'];
$code=$_POST['Itm_8_00_6'];
$mail=$_POST['Itm_8_00_7'];
$login=$_POST['Itm_8_00_8'];

echo	
	'<br />',$nom,
	'<br />',$prenom,
	'<br />',$adresse,
	'<br />',$adresse2,
	'<br />',$ville,
	'<br />',$code,
	'<br />',$mail,
	'<br />',$login;


if ( isset($_POST) && (!empty($_POST['Itm_8_00_7'])) )
{
	extract($_POST);  // je vous renvoie à la doc de cette fonction

  	// On va chercher l'adresse mail dans la base
  	$sql = "SELECT mail FROM bd_principale WHERE mail = '".addslashes($Itm_8_00_7)."'";
  	$req = $bdd->query($sql) or die(mysql_error().'<br />'.$sql);


	echo '<br /> On continu';
  		if ($req->rowCount() > 0)
			{
			echo '<br /> Adresse mail deja utilisé.';
			}	
			else

			{
			$bdd->exec('INSERT INTO bd_principale(nom, prenom, adresse, complement_adresse, ville, code_postale,  login, mail) VALUES(:nom, :prenom, :adresse, :adresse2, :ville, :code, :login, :mail)');
			}
}  

?>
et j'obtient une erreur sur ma ligne ou je cherche a inserer un nouvel enregistrement a ma base :

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ':nom, :prenom, :adresse, :adresse2, :ville, :code, :login, :mail)' at line 1' in C:\wamp\www\mon site\inscription_traitement.php on line 56
( ! ) PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ':nom, :prenom, :adresse, :adresse2, :ville, :code, :login, :mail)' at line 1 in C:\wamp\www\mon site\inscription_traitement.php on line 56

Le but de tout ca est de recup des données d'un formulaire, faire un traitement puis enregistrer mes données dans une tables ! la base quoi.
vous verrez dans le code mes manip de jeuno mais c pas grave ca me permettai d'avancer au fur et a mesure de l'ecriture car je ne suis pas encore familiariser avec la syntaxe.

Re: Insert To probleme

Posté : 20 janv. 2012, 14:08
par demonjhon
Autres questions connaissais vous un editeur de texte pour php qui affiche de la meme maniere que sur le fofo (meilleur lecture des erreures de syntaxe).

Re: Insert To probleme

Posté : 20 janv. 2012, 14:13
par xTG
Ouille... Semblerait que toi et PDO cela fasse deux. :P
Plutôt que de te faire une explication qui se verrait incomplète je préfère te rediriger vers un tutorial traitant de cette librairie :
http://www.siteduzero.com/tutoriel-3-34 ... x-bdd.html

Dans ton cas il s'agit de comment on utilise les requêtes préparées. :)

Re: Insert To probleme

Posté : 20 janv. 2012, 15:13
par demonjhpn
Il n'y a qu'un ligne qui me pose soucis et qui concerne le insert to.

La connexion a la base fonctionne bien.
Ma question est donc dans cette ligne :
$bdd->exec('INSERT INTO bd_principale(nom, prenom, adresse, complement_adresse, ville, code_postale,  login, mail) VALUES(:nom, :prenom, :adresse, :adresse2, :ville, :code, :login, :mail)');
que dois je mettre dans values ? j'ai tester de mettre les variables directement style :Itm_8_00_8
et dans la version que j'ai poster g tester d'affecté ces variables a d'autre variable pour etre sur que j'arrivais bien a recuperer leur contenu.
Que me manque t-il ?

Re: Insert To probleme

Posté : 20 janv. 2012, 15:15
par demonjhpn
j'utilise egalement le site du zero pour m'aider a apprendre. La requete que j'ai utilisé provient d'ailleur du site du zero.
Mais c'est sa mise en application avec des variables qui pose soucis ou alors un defaut d'acces a la base mais je ne pense pas.

Merci

Re: Insert To probleme

Posté : 20 janv. 2012, 17:18
par xTG
Quand je donne des liens j'aime bien qu'on les lise. :|
La réponse à ton problème :
http://www.siteduzero.com/tutoriel-3-34 ... #ss_part_5

Re: Insert To probleme

Posté : 20 janv. 2012, 18:43
par demonjhpn
J'ai bien ton article mais je n'ai pas trouver ma reponse ;p
Comme j'ai dis plus haut je debute donc s'il te plait un peu d'indulgence !

Pour ecrire ma requete je me suis inspirer des exemples du site du zero :
http://www.siteduzero.com/tutoriel-3-14514-ecrire-des-donnees.html#ss_part_1
Peut tu me donner une idée d'ou se situe ma boulette ?

merci

Re: Insert To probleme

Posté : 20 janv. 2012, 19:47
par xTG
Dans le lien donné il y a un cas qui ressemble au tien :
<?php
// ouverture d'une connexion ...
 
$requete_prepare_1=$connexion->prepare("SELECT identifiant FROM membres WHERE ID_membre = :id"); // on prépare notre requête
$requete_prepare_1->execute(array( 'id' => 1 ));
$lignes=$requete_prepare_1->fetch(PDO::FETCH_OBJ);
echo $lignes->identifiant.'<br />';
?>
Pour les requêtes préparées.
D'une : prepare() et non exec()
De deux : execute() avec en paramètre un array contenant les valeurs à remplacer.

Le lien que tu me donnes montre bien une requête qui est correcte.
Sauf que toi tu remplaces les valeurs par des tokens qui ne sont jamais remplacés par les vrais valeurs !

Enfin pour du code propre et qui se rapproche de ce que tu as vu dans le dernier lien.
On peut utiliser query() en lui fournissant une chaîne SQL qui COMPORTE les données.
Exemple :
$bdd->query('INSERT into test(valeur1, valeur2) VALUES(' . $bdd->quote($valeur1) . ', '. $bdd->quote($valeur2) .')');

Re: Insert To probleme

Posté : 20 janv. 2012, 20:20
par demonjhpn
Le remplacement des valeurs par des tokens comme tu dis c'est en fait un test vu que ma premiere requete ne fonctionner pas.

J'avais comme requete a la base ceci:
$bdd->exec('INSERT INTO bd_principale(nom, prenom, adresse, complement_adresse, ville, code_postale,  login, mail) VALUES($nom, $prenom, $adresse, $adresse2, $ville, $code, $login, $mail)');
			
on ne peut donc pas directement les variables de cette maniere ? et avec la fonction prepare ?
je dis peut etre une enormité la ^^

je vais faire les tests avec tes info ! merci bien en tout cas.

Re: Insert To probleme

Posté : 20 janv. 2012, 20:22
par xTG
Simple problème de quote.
$variable = "test";
echo 'ceci est un $variable'; // ceci est un $variable
echo "ceci est un $variable"; // ceci est un test
Par contre la fonction quote() n'est pas là pour faire jolie, elle permet de sécuriser les données. ;)

Re: Insert To probleme

Posté : 20 janv. 2012, 22:43
par demonjhpn
<?php

$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host=localhost;dbname=bd_principale', 'root', '', $pdo_options);

if ( isset($_POST) && (!empty($_POST['Itm_8_00_7'])) )
{
	extract($_POST);  

  	// On va chercher l'adresse mail dans la base
  	$sql = "SELECT mail FROM bd_principale WHERE mail = '".addslashes($Itm_8_00_7)."'";
  	$req = $bdd->query($sql) or die(mysql_error().'<br />'.$sql);


	echo '<br /> On continu';
  		if ($req->rowCount() > 0)
			{
			echo '<br /> Adresse mail deja utilisé.';
			}	
			else

			{
			$bdd->query('INSERT into bd_principale(nom, prenom, adresse, complement_adresse, code_postale, ville, mail, login) VALUES(' . $bdd->quote($_POST['Itm_8_00_1']) . ', '. $bdd->quote($_POST['Itm_8_00_2']) .', '. $bdd->quote($_POST['Itm_8_00_3']) .', '. $bdd->quote($_POST['Itm_8_00_4']) .', '. $bdd->quote($_POST['Itm_8_00_5']) .', '. $bdd->quote($_POST['Itm_8_00_6']) .', '. $bdd->quote($_POST['Itm_8_00_7']) .', '. $bdd->quote($_POST['Itm_8_00_8']) .')');
			}
}  

?>
Et voila ca fonctionne ! huhu bien content ^^

Merci sTG ! j'aurais surement encore besoin de tes immenses connaissances ^^

Mon code est sûr ?

Re: Insert To probleme

Posté : 21 janv. 2012, 07:35
par xTG
Il y a du pdo::quote() qui manque dans ta première requête (à la place du addslashes()). :)

Re: Insert To probleme

Posté : 21 janv. 2012, 16:39
par demonjhpn
J'essai d'ajouter le pdo quote a la place du addslashe.

pourquoi cette ligne de code ne fonctionne pas ?
$truc = ' . $bdd->quote($_POST['Itm_8_00_1']) . ';
pour ma ligne de code j'ai remplacer par :
$sql = "SELECT mail FROM bd_principale WHERE mail = '. $bdd->quote($_POST['Itm_8_00_1']) . "\n"'";
Mais meme soucis il ne reconnait pas ca:
 '. $bdd->quote($_POST['Itm_8_00_1']) . "\n"'
hum ou ai donc le soucis ? une erreur de syntaxe ?
Pourtant dans ma commande
$bdd->query('INSERT into bd_principale(nom, prenom, adresse, complement_adresse, code_postale, ville, mail, login) VALUES(' . $bdd->quote($_POST['Itm_8_00_1']) . ', '. $bdd->quote($_POST['Itm_8_00_2']) .', '. $bdd->quote($_POST['Itm_8_00_3']) .', '. $bdd->quote($_POST['Itm_8_00_4']) .', '. $bdd->quote($_POST['Itm_8_00_5']) .', '. $bdd->quote($_POST['Itm_8_00_6']) .', '. $bdd->quote($_POST['Itm_8_00_7']) .', '. $bdd->quote($_POST['Itm_8_00_8']) .')');
			
la syntaxe identique convient !

:s

merci

Re: Insert To probleme

Posté : 21 janv. 2012, 17:04
par demonjhpn
<?php

$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host=localhost;dbname=bd_principale', 'root', '', $pdo_options);

$adre_echap = $bdd->quote($_POST['Itm_8_00_7']);
echo $adre_echap;

if ( isset($_POST) && (!empty($_POST['Itm_8_00_7'])) )
{
	extract($_POST);  

  	// On va chercher l'adresse mail dans la base
  	$sql = "SELECT mail FROM bd_principale WHERE mail = $adre_echap";
  	$req = $bdd->query($sql) or die(mysql_error().'<br />'.$sql);

  		if ($req->rowCount() > 0)
			{
            echo '<br /> Adresse mail deja utilisé.';
			}	
			else

			{
			$bdd->query('INSERT into bd_principale(nom, prenom, adresse, complement_adresse, code_postale, ville, mail, login) VALUES(' . $bdd->quote($_POST['Itm_8_00_1']) . ', '. $bdd->quote($_POST['Itm_8_00_2']) .', '. $bdd->quote($_POST['Itm_8_00_3']) .', '. $bdd->quote($_POST['Itm_8_00_4']) .', '. $bdd->quote($_POST['Itm_8_00_5']) .', '. $bdd->quote($_POST['Itm_8_00_6']) .', '. $bdd->quote($_POST['Itm_8_00_7']) .', '. $bdd->quote($_POST['Itm_8_00_8']) .')');
			}
}  
?>
Voila mon code fonctionne.
le extract($_POST) ca va comme commande ? ou ya mieux ?

merci

Re: Insert To probleme

Posté : 21 janv. 2012, 17:25
par xTG
Non extract() n'est pas très bien.
Le mieux est toujours d'appeler un mouton un mouton (et non un animal comme tu le fais avec extract).
Donc si c'est pour accéder à l'index nom provenant d'un formulaire en POST plutôt qu'un extract pour obtenir $nom il est préférable d'accéder à $_POST['nom'].