PHP : pb insertion SQL sur données calculées

Résolu/Fermé
Kobran - 13 juin 2011 à 17:33
 Kobran - 13 juin 2011 à 20:07
Bonjour à tous,

J'ai un soucis avec une requête devant insérer un enregistrement en BDD.
Je vous présente le code ci-dessous.
Il fonctionne car l'enregistrement ce déroule correctement... MAIS...
les valeurs $attach_left et $attach_top sont toujours égales respectivement à 300 et 100.

Dans la requête d'insert, je suis obligé de laisser les quotes en italiques car sinon ça ne fonctionne pas... et là non plus, je ne sais pas pourquoi !!

L'idée du code : je crée une nouvelle entité que je peux associer à une autre entité. Si je l'associe alors je dois recalculer le positionnement left et top.

Please, un coup de main s'il-vous-plaît ???!!!

Merci d'avance.

Yann.

[code]

// Récupération de l'entité de rattachement et son positionnement et calcul du positionnement du fils

$sql_attach = "SELECT * FROM adm_orga_ent WHERE id_ent=".mysql_escape_string($_POST['parent'])."";
mysql_query($sql_attach) or die('Erreur SQL !<br>'.$sql_attach.'<br />'.mysql_error());

$attach = mysql_fetch_array($sql_attach);
$attach_left = intval($attach['left'])+300;
$attach_top = intval($attach['top'])+100;


// Insertion en base de données

$sql = 'INSERT INTO adm_orga_ent (id_org,text,border,background,texte,parent,dat_maj,width,height,'left' , 'top') VALUES ('.mysql_escape_string($_POST['id_org']).',"'.addslashes(mysql_escape_string($_POST['text'])).'","'.mysql_escape_string($_POST['border']).'","'.mysql_escape_string($_POST['background']).'","'.mysql_escape_string($_POST['texte']).'","'.mysql_escape_string($_POST['parent']).'","'.date("d/m/Y H:i:s").'","300","50",'.$attach_left.','.$attach_top.')';

mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error());

/code

1 réponse

dariumis
Messages postés
571
Date d'inscription
mardi 16 mars 2010
Statut
Membre
Dernière intervention
18 avril 2018
61
Modifié par dariumis le 13/06/2011 à 17:50
Salut, mais tes deux variables sont des chaines de caractères dans ta base??? Le seul truc possible que je vois, serait que dans ton select il ne trouve pas $_POST['parent'] donc déjà je ferais un echo de la requête select et je l'executerais direct dans la base pour voir ce quelle retourne. Puis je ferais un echo de: $attach_left et $attach_top juste apres ces ligne pour voir si elle existent bien.

$attach_top = intval($attach['top'])+100;  
$attach_left = intval($attach['left'])+300;
0
dariumis
Messages postés
571
Date d'inscription
mardi 16 mars 2010
Statut
Membre
Dernière intervention
18 avril 2018
61
Modifié par dariumis le 13/06/2011 à 17:51
Comme ça:

// Récupération de l'entité de rattachement et son positionnement et calcul du positionnement du fils 

echo $sql_attach = "SELECT * FROM adm_orga_ent WHERE id_ent=".mysql_escape_string($_POST['parent']).""; 
mysql_query($sql_attach) or die('Erreur SQL !<br>'.$sql_attach.'<br />'.mysql_error()); 

$attach = mysql_fetch_array($sql_attach); 
echo $attach_left = intval($attach['left'])+300; 
echo $attach_top = intval($attach['top'])+100; 


// Insertion en base de données 

echo $sql = 'INSERT INTO adm_orga_ent (id_org,text,border,background,texte,parent,dat_maj,width,height,'left' , 'top') VALUES ('.mysql_escape_string($_POST['id_org']).',"'.addslashes(mysql_escape_string($_POST['text'])).'","'.mysql_escape_string($_POST['border']).'","'.mysql_escape_string($_POST['background']).'","'.mysql_escape_string($_POST['texte']).'","'.mysql_escape_string($_POST['parent']).'","'.date("d/m/Y H:i:s").'","300","50",'.$attach_left.','.$attach_top.')'; 

mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error()); <code> 
0
Bonjour,

Merci du retour si rapide ! :-)
En fait, le $_POST['parent'] est bien renseigné.
Avant de poster, j'ai réalisé plusieurs "echo" et la variable est bien valorisée.
En BDD, les champs left et top sont bien des int.
Mais dès que je fais un echo dessus, ça crashe ! :-(

Et merci encore ! :-)

Yann.
0
dariumis
Messages postés
571
Date d'inscription
mardi 16 mars 2010
Statut
Membre
Dernière intervention
18 avril 2018
61
Modifié par dariumis le 13/06/2011 à 18:14
Mais alors si c'est des int ta pas besoin du intval()....
Mais c'est bizarre pourquoi dans ton insert tu met ça
,"300","50",
pourquoi les guillemets. ton insert il est bizarre un peu, pour y voir plus claire tu devrais plutôt commencer l'insertion de tes variables php contenant tes requête SQL par des guillemet, ça évite les embrouille je trouve.

Sinon je vois pas trop, ça doit venir du intval. non????

EDIT: Mais en fait le programme il se déroule pas jusqu'à l'insert il stope sur:
echo $attach_left = intval($attach['left'])+300;     
echo $attach_top = intval($attach['top'])+100;     

???? :)
0
Re',

Merci !
Si si, le programme va jusqu'au bout et l'insert se fait.
J'ai ajouté le intval parce que j'ai eu un doute sur le retour - à savoir retour de chaîne de caractères de sql - mais l'effet au final est justement sans effet - avec ou sans, ça change rien ! :-(

Le 300 (width) et 50 (height), ce sont des données que je définie en dur - mais qui par la suite seront traités comme left et top.

Je pense que mon problème vient de la BDD - je suis très surpris de devoir passer les paramètres left et top de l'insert avec des quotes en italiques. (je ne sais pas comment ça s'appelle). :-)

Merci d'avance.

Yann.
0
dariumis
Messages postés
571
Date d'inscription
mardi 16 mars 2010
Statut
Membre
Dernière intervention
18 avril 2018
61
Modifié par dariumis le 13/06/2011 à 18:50
Il me semble très fortement probable que le transfert de ces lignes ne ce passe pas bien:

$attach_left = intval($attach['left'])+300;     
$attach_top = intval($attach['top'])+100;      


Je suis convaincu que si tu met ça:

$attach_left = intval($attach['left'])+150;     
$attach_top = intval($attach['top'])+50;  


Le résultat que tu obtiendra seras 150 et 50 au lieu du 300, 100 que tu obtiens généralement, et tous ça car en fait $attach['left'] et $attach['top'], ne contiennent rien, donc ça peut venir soit que tu récupère mal tes variable avec cette ligne (moi j'utilise PDO) :

$attach = mysql_fetch_array($sql_attach); 


soit que ton select ne retourne rien, pour le vérifier faut faire un echo du select et l'éxecuter dans phpmyadmin si tu utilise MySQL.

Edit ou alors ton insert ne s'execute pas et tu t'en rend pas compte car si dans ta requête "300","50" étaient des chaines de caractère inséré en dure elles se présenterais de cette manière.

.... \'"300"\',\'"50"\' .....

Pareil, fais un echo de ton insert et execute le dans phpmyadmin.
0