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
Auteur
Réponse acceptée

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

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());
}

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.

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);
$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 ?

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);
}

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

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

ah oui effectivement, merci Kenor