Problème d'insertion de données de type expression régulière

Eléphanteau du PHP | 20 Messages

10 juil. 2012, 10:13

Bonjour tout le monde,


Je suis nouveau dans ce forum et débutant en php. Je souhaite enregistrer les modifications de la base de données dans une table que j'appelle modifications donc j'ai mis un champ requête qui va contenir la requête à exécuter pour mettre à jour la base de données. Ceci dit, j'ai créé une fonction qui met à jour la table modifications à chaque fois qu'il y a un changement. Voici mon code :

Code : Tout sélectionner

$result = $db_sync->CreateTable($tables_home[$i], $field); $db_change->AddRecord("$result"); function CreateTable($name, $fields, $fp) { mysql_select_db($this->database, $this->dbp); $primary_keys = array(); $sql_f = array(); for ($i = 0; $i < count($fields); $i++) { if ($fields[$i]['key'] == 'PRI') { $primary_keys[] = $fields[$i]['name']; } $sql_f[] = "`{$fields[$i]['name']}` {$fields[$i]['type']} " . ($fields[$i]['null'] ? '' : 'NOT') . ' NULL' . (strlen($fields[$i]['default']) > 0 ? " default '{$fields[$i]['default']}'" : '') . ($fields[$i]['extra'] == 'auto_increment' ? ' auto_increment' : ''); } $sql = "CREATE TABLE `{$name}` (" . implode(', ', $sql_f) . (count($primary_keys) > 0 ? ", PRIMARY KEY (`" . implode('`, `', $primary_keys) . "`)" : '') . ')'; return $sql; } function AddRecord($change_set){ $sql = "INSERT INTO changes VALUES('','$change_set',CURRENT_TIMESTAMP)"; return mysql_query($sql, $this->dbp); }

Le problème c'est qu'il n'ajoute aucune donnée sauf quand je remplace $result par une simple chaine de caractère. Aidez-moi s'il vous plait à résoudre ce problème qui me torture depuis 5 jours déjà.

Bonne journée à tous et merci d'avance pour vos réponses.

ViPHP
xTG
ViPHP | 7331 Messages

10 juil. 2012, 10:33

Échappement des données cela te parle ? => mysql_real_escape_string() ^^
Et pas de quotes autour d'une variable s'il n'y a qu'elle.

Eléphanteau du PHP | 20 Messages

10 juil. 2012, 12:20

Oui oui j'ai déjà essayé mais ça n'a pas vraiment avancé. Ce qui est bizarre c'est que par exemple pour 'DROP TABLE t2' ça marche et quand je tape la requête

Code : Tout sélectionner

INSERT INTO changes VALUES('','CREATE TABLE `t2` (`id` int(11) NULL)',CURRENT_TIMESTAMP)
à la main dans phpmyadmin ça passe aussi.

ViPHP
xTG
ViPHP | 7331 Messages

10 juil. 2012, 14:19

Bizarre. :roll:
Ah pourquoi ? Car tes exemples semblent indiquer justement ce que je raconte.
Ta requête DROP ne contient aucun quote contrairement à ton INSERT.
PhpMyAdmin échappe pour toi les données.

Eléphanteau du PHP | 20 Messages

10 juil. 2012, 14:31

Je me suis peut être mal exprimé, je voulais dire que ça marche pour le DROP et aussi pour le INSERT directement sur phpmyadmin. Par contre, quand je passe la même requête en tant qu'argument ça ne passe plus :( ça m'échappe complètement pourquoi.

ViPHP
xTG
ViPHP | 7331 Messages

10 juil. 2012, 14:46

Montres nous comment tu utilises l'échappement de variable.

ViPHP
ViPHP | 2577 Messages

10 juil. 2012, 14:52

En fait il faut faire :
$change_set = mysql_real_escape_string($change_set);
$sql = "INSERT INTO changes VALUES('','$change_set',CURRENT_TIMESTAMP)";

phpmyadmin fait comme cela.

Eléphanteau du PHP | 20 Messages

10 juil. 2012, 14:59

Voilà comment je fais moi :

Code : Tout sélectionner

$result = $db_sync->CreateTable($tables_home[$i], $fields); $t = mysql_real_escape_string($result); $db_change->AddRecord("$t");
Avec

Code : Tout sélectionner

function CreateTable($name, $fields) { mysql_select_db($this->database, $this->dbp); $primary_keys = array(); $sql_f = array(); for ($i = 0; $i < count($fields); $i++) { if ($fields[$i]['key'] == 'PRI') { $primary_keys[] = $fields[$i]['name']; } $sql_f[] = "`{$fields[$i]['name']}` {$fields[$i]['type']} " . ($fields[$i]['null'] ? '' : 'NOT') . ' NULL' . (strlen($fields[$i]['default']) > 0 ? " default '{$fields[$i]['default']}'" : '') . ($fields[$i]['extra'] == 'auto_increment' ? ' auto_increment' : ''); } $sql = "CREATE TABLE `{$name}` (" . implode(', ', $sql_f) . (count($primary_keys) > 0 ? ", PRIMARY KEY (`" . implode('`, `', $primary_keys) . "`)" : '') . ')'; return $sql; }
Et

Code : Tout sélectionner

function AddRecord($change_set){ $sql = "INSERT INTO changes VALUES('','$change_set',CURRENT_TIMESTAMP)"; return mysql_query($sql, $this->dbp); }

Eléphanteau du PHP | 20 Messages

10 juil. 2012, 15:03

Désolé c'est mal indenté.

ViPHP
ViPHP | 2577 Messages

10 juil. 2012, 15:52

il te reste à afficher le message d'erreur mysql via mysql_error()

Eléphanteau du PHP | 20 Messages

10 juil. 2012, 17:03

Merciiii Beaucoup en fait dans mon code j'ouvre plusieurs connexions avec des base de données et des fois il cherchait la table changes dans la mauvais base de données donc j'ai mis nomdelabase.changes dans la requête INSERT et pour l'instant ça a l'ai de fonctionner. Quelqu'un pourrait expliquer la source de ce problème ? Car je suis persuadé que je me connecte bien à la bonne base, la preuve c'est que quand je met une requête simple, il met à jour la table changes.