Bonjour,

Désireux de monter mon site pro et aimant mettre la main dans le cambouis, je suis parti à la recherche d'un portfolio dynamique. Et je suis tombé sur la formation créer un portfolio de A à Z en 6 vidéos et dédiée aux débutants. A la 30è minute de la 4e partie concernant l'upload des photos - et après l'avoir refaite à plusieurs reprises - j'ai toujours la même erreur. (voir en bas).

Voici mon code :

/**
* ENVOI DES IMAGES
**/
        $work_id = $db->quote($_GET['id']);
        $image = $_FILES['image'];
        $extension = pathinfo($image['name'], PATHINFO_EXTENSION);
        if(in_array($extension, array('jpg','png'))){
            $db->query("INSERT INTO images SET work_id=$work_id");
            $image_id = $db->lastInsertId();
            $image_name = $image_id . '.' . $extension;
            move_uploaded_file($image['tmp_name'], IMAGES . '/works/' . $image_name);
            $image_name = $db->quote($image_name);
            $db->query("UPDATE images SET name=$image_name WHERE id=$image_id");

        }

        //header('Location:work.php');
        die();

En vérifiant le code à la recherche d'éventuelles erreurs j'ai l'erreur suivante :

( ! ) Warning: PDO::query(): SQLSTATE[HY000]: General error: 1364 Field 'name' doesn't have a default value in C:\wamp\www\essai\admin\work_edit.php on line 32
Call Stack Time Memory Function Location
1 0.0005 389280 {main}( ) ...\work_edit.php:0
2 0.0138 419848 query ( ) ...\work_edit.php:32

La ligne 32 est : $db->query("INSERT INTO images SET work_id=$work_id");

Cela fait plusieurs fois que je recode et je n'est pas trouvé pourquoi ce problème persiste.

Je vous remercie pour cette réponse qui pourra me débloquer.

Cordialement.

5 réponses


Bernard Franceschini
Auteur
Réponse acceptée

Bonjour Huggy,

Merci de la réponse.
Donc en donnant uniquement une valeur NULL au champ 'name', ceci peut me permettre l'enregistrement des données. Je teste de suite.
Après essai, ça me semble OK. Je vais pouvoir continuer.
Bon WE.
Cdlt

Sujet résolu

Le pb ne vient pas du code mais de la structure de la table 'images'
le champ 'name' n'a pas de valeur par défaut et n'autorise pas non plus la valeur NULL, du coup si on ne lui précise pas de valeur lors de l'INSERT, on ne peut pas créer de ligne.

Sinon, je peux te donner une petite technique aussi, via

(SELECT `auto_increment` FROM INFORMATION_SCHEMA.TABLES WHERE table_name = 'table')

Tu peux avoir la valeur du prochaine auto increment

Donc tu peux faire un truc ainsi :

$extension = '.' . $extension;
$db->query("INSERT INTO images (work_id, name) VALUES ($work_id, CONCAT((SELECT `auto_increment` FROM INFORMATION_SCHEMA.TABLES WHERE table_name = 'images'), $extension))");
$image_id = $db->lastInsertId();
$image_name = $image_id . $extension;
move_uploaded_file($image['tmp_name'], IMAGES . '/works/' . $image_name);

Normalement ça devrait fonctionner, ça réduirait ainsi le nombre de requêtes, mais serait-ce plus rapide, je suis pas sûr, je suppose, surtout si le serveur mysql est distant

Erreur basique tu fait un ->query alors que comme tu faire sa avec des parametres (WHERE, FROM) c'est ->prepare

Bonjour.

Erreur basique tu fait un ->query alors que comme tu faire sa avec des parametres (WHERE, FROM) c'est ->prepare

Son problème ne vient pas de là, surtout que tu n'as pas identifié la bonne requête qui lui posait problème.

Sujet résolu

Il ne suffit pas d'écrire cette phrase pour que le sujet soit considéré comme résolu, il te faut cliquer sur le bouton/lien Il a répondu à ma question à droite du message qui t'a permit de résoudre ton problème, soit à droite de celui de Huggy.