PDO insert

Par Amstramgram, il y a 8 ans


Bonjour,

ca ne doit pas etre un reel probleme mais je ne comprend pas pourquoi les données ne s'ajout pas à la base.
PDO fonctionne bien (j'arrive à faire des select).
Mais lors d'un insert cela ne fonctionne pas, ça me retourne 0.

$args = array( 'client_ref' => '00000', 'client_pass' => 'password', 'last_token' => 'mysupertoken', 'last_log' => date('Y-m-d H:m:s'), 'first_log' => date('Y-m-d H:m:s') ); $columnString = implode(',', array_keys($args)); $valueString = ":".implode(',:', array_keys($args)); $sql = "INSERT INTO " . $table . " (" . $columnString . ") VALUES (" . $valueString . ")"; $request = $this->pdo->prepare($sql); foreach($args as $key => $value){ $request->bindValue(':' . $key, $args[$key]); } $request->execute(); return $this->pdo->lastInsertId();

Merci, bisous.

9 réponses

Amstramgram, il y a 8 ans

Ok, je savais que c'etait une connerie mais a ce point. Il faut mettre toutes les colonnes de la row... Je ne pensais pas qu'elles etaient toutes obligatoire lors d'un ajout.

Merci

Carouge10, il y a 8 ans

Bonsoir,
1/ Commente par faire un "var_dump" de $sql avant de la préparer pour vérifier qu'elle est conforme a ce que tu souhaites.
2/ Je te conseilles de toujours vérifier la bonne exécution d'une requête car pdo renvoi un code d'erreur en cas de son échec.

$stmt = $this->pdo->prepare($sql); if (!$stmt) { echo "\nPDO::errorInfo():\n"; print_r($this->pdo->errorInfo()); }
Amstramgram, il y a 8 ans

1/ "INSERT INTO app_users (client_ref,client_pass,last_token,last_log,first_log) VALUES (:client_ref,:client_pass,:last_token,:last_log,:first_log)" ce qui est correct.
2/ aucune erreur retournée.

Carouge10, il y a 8 ans

D'accord, essaye en ajoutant un espace avant le : ce qui rendra aussi ton code plus claire.

Que te rerourne :

$etat = $request->execute(); print_r($etat);
Amstramgram, il y a 8 ans
$etat = bool(false) $sql = string(152) "INSERT INTO app_users (client_ref, client_pass, last_token, last_log, first_log) VALUES ( :client_ref, :client_pass, :last_token, :last_log, :first_log)"

On est d'accord que c'est bien :

$request->bindValue(':key', "valeur");

Et les underscores ne pose pas probleme ?

Carouge10, il y a 8 ans

Non pas de soucis.
Par contre ton foreach est faux (il me semble), car tu n'as pas besoin d'aller rechercher la valeur d'un tableau en fonction de sa clé. Tu as déjà sa valeur.

foreach($args as $key => $value){ $request->bindValue(':' . $key, $value); }
Carouge10, il y a 8 ans

Tout dépend si tu as défini une valeur par défaut en créant ta base.

Plus qu'à mette le sujet en résolu

Kenor, il y a 8 ans

Attention, tite coquille :
date('Y-m-d H:m:s')
ce n'est pas H:m:s mais H:i:s

Amstramgram, il y a 8 ans

ah oui effectivement, merci Kenor