Envoie des images dans la base de données

Ce sujet est résolu
82125
,

Bonjour à tous, j'ai un petit probleme voici mon code php:

$workid = $_GET['id'];
//$work_id = "3602";
//var_dump($workid);
//var_dump($work_id);
 if (isset($_FILES['images'])) {
    $manager = new ImageManager();
    $images = $_FILES['images']['tmp_name'];
         foreach($images as $image){
            $db ->query("INSERT INTO images SET work_id=$workid"); 
            $image_id = $db ->lastInsertId();
            $image_name =  $image_id . '.jpg';
            $image_name = $db->quote($image_name);
            $db ->query("UPDATE images SET name=$image_name WHERE id=$image_id");
            $manager->make($image)->orientate()->fit(150,100)
            ->save('../img/tmp_img/' .$image_id . '.jpg');
            }         
          }

Quand j’exécute ce code avec l'initialisation directe de ma variable workid voir le code en commentaire: $workid = "3602"; l'insertion dans la BDD $db ->query("INSERT INTO images SET work_id=$workid"); passe bien mais si j’essaie de l’exciter avec le workid récupéré dans ma variable GET, $workid = $_GET['id']; ce qui est mon but Rien ne marche et pourtant le $_GET['id'] contient belle et bien l'id de la réalisation, quand j’essaie de le var_dump de deux variables celle iniatilisée et celle recuperéevar_dump($workid); et var_dump($work_id);
ça donne ça:

C:\wamp\www\site\users\work_edit.php:60:string '3602' (length=4)
C:\wamp\www\site\users\work_edit.php:61:string '3602' (length=4)

donc ça donne exactement la même chose, je ne comprend vraiment pourquoi avec le $workid = $_GET['id']; indique 0, votre aide svp

11 Réponse

82125
,

Merci bien pour toutes vos réactions ça m'a vraiment aidé et m'a donné des pistes qui m'ont permis à trouver une solution:
j'y suis arrivé en plaçant la valeur du GET[id] dans une variable de SESSION

 if(isset($_GET['id'])){
     $_SESSION['Auth']['worid'] = $_GET['id'];
     }

et après l'utiliser en faisant

 $workid = $_SESSION['Auth']['worid']; 

et là ça marche parfaitement l'enregistrement se passe à merveille comme je le voulais. Merci pour tout .

40917
,

Bonjour,
Car tu insères un string alors qu'il te faut un int.
Active les erreurs PDO et ensuite passe pas des requêtes préparer qui t'éviteront ce genre de problème et sécurisera ton code.

82125
,

Merci bien votre réaction, apres quelques corrections selon vos remarques voici mon nouveau code:

$workid = $_GET['id'];
 if (isset($_FILES['images'])) {
    $manager = new ImageManager();
    $images = $_FILES['images']['tmp_name'];
         foreach($images as $image){
            $req = $db->prepare("INSERT INTO images SET work_id= ?");
            $req->execute([$workid]);
            $image_id = $db ->lastInsertId();
            $image_name =  $image_id . '.jpg';
            $image_name = $db->quote($image_name);
            $req = $db->prepare("UPDATE images SET name=$image_name WHERE id= ?");
            $req->execute([$image_id]);
            $manager->make($image)->orientate()->fit(150,100)
            ->save('../img/tmp_img/' .$image_id . '.jpg');
            }         
          }

Mais l'insertion ne se fais toujour pas il y'a t-il moyen de peut etre convertir le *$_GET['id'] * du string en interger?
merci bien

109584
,

Salut ce que je vais te dire ne va pas t'aider mais évite les espaces comme sur cette ligne $db ->lastInsertId()

82125
,

Merci bien pour votre remarque TheGrinch

17162
,

Bonjour.

y'a t-il moyen de peut etre convertir le *$_GET['id'] * du string en interger?

Oui, par exemple :

$workid = (integer)$_GET['id'];
// Ou :
$workid = (int)$_GET['id'];

Par contre, je te conseille de vérifier que le paramêtre id est bien passé dans l'url et que sa valeur ne soit pas vide, exemple :

if (!empty($_GET['id'])) {
    $workid = (int)$_GET['id'];
    // Puis le reste de ton code
} else {
    // Le paramêtre 'id' est manquant ou sa valeur est vide ...
}
82125
,

Merci bien pour votre réaction en convertissant le workid en entier $workid = (int)$_GET['id']; les images sont bien uploadées dans la BDD mais avec une seule erreurs: un mauvais workid qui est à 0
pour ce qui est de la verification de l'id s'il est bien passé dans l'url, ca passe parfaitement la variable exite bien et quand je le verifie par un VAR_DUMP la valeur est bien ajoutée selon l'id envoyé) Merci encore

17162
,

Ce que je ne comprends pas dans ton code, c'est pourquoi faire un UPDATE d'un enregistrement pour un enregistrement qui vient d'être créé ?
Surtout que si l'extension des images uploadées doivent obligatoirement être jpg, je ne vois pas l'intérêt d'attribuer une colonne name dans la table, car tout ce que tu fais c'est récupérer l'id de l'enregistrement et y ajouter .jpg.
De plus qu'il y a une manipulation dans ton code qui peut mener à des erreurs, tu fais tes enregistrements en base de données et tu sauvegardes le fichier, sans même ni vérifier si c'est bien une image, ni si son extension est bien celle qui est attendue.
Donc soit tu acceptes plusieurs extensions pour les images et dans ce cas là tu pourrais directement enregistrer l'extension du fichier pour ensuites la récupérer l'orsque tu veux afficher l'image en la préfixant par l'id de l'enregistrement, ou alors je ne vois absolument pas l'intérêt de sauvegarder une valeur qui n'est rien d'autre que l'id de l'enregistrement et une valeur fixe.

un mauvais workid qui est à 0

Je vois mal comment le workid peut valoir 0, alors que tu dis qu'avec un var_dump tu obtiens bien la bonne valeur, ce serait bien que tu dises à quel moment cette erreur est rencontrée, si c'est lors de l'INSERT ou bien de l'UPDATE.
Ou alors, c'est que ton erreur est dans la définition pour la colonne work_id dans la table.

82125
,

Ce que je ne comprends pas dans ton code, c'est pourquoi faire un UPDATE d'un enregistrement pour un enregistrement qui vient d'être créé ?
Au faite je fait l'insert avant psk je n'ai pas l'id de l'image il faut d'abord le creer et il sagit de l'update vous inqueté pas c'est ok à ce niveau.
au faite pour les autres remarques il y'a quelques codes JS qui jerent toutes ces verifications

<script type="text/javascript">
            $(function () {
               var files = $("#files");

               $("#fileupload").fileupload({
                   url: 'work_edit.php',
                   dropZone: '#dropZone',
                   dataType: 'json',
                   autoUpload: false
               }).on('fileuploadadd', function (e, data) {
                   var fileTypeAllowed = /.\.(gif|jpg|png|jpeg)$/i;
                   var fileName = data.originalFiles[0]['name'];
                   var fileSize = data.originalFiles[0]['size'];

                   if (!fileTypeAllowed.test(fileName))
                        $("#error").html('Only images are allowed!');
                   else if (fileSize > 500000)
                       $("#error").html('Your file is too big! Max allowed size is: 500KB');
                   else {
                       $("#error").html("");
                       data.submit();
                   }
               }).on('fileuploaddone', function(e, data) {
                    var status = data.jqXHR.responseJSON.status;
                    var msg = data.jqXHR.responseJSON.msg;

                    if (status == 1) {
                        var path = data.jqXHR.responseJSON.path;
                        $("#files").fadeIn().append('<p><img style="width: 100px; height: 100px;" src="'+path+'" /></p>');
                    } else
                        $("#error").html(msg);
               }).on('fileuploadprogressall', function(e,data) {
                    var progress = parseInt(data.loaded / data.total * 100, 10);
                    $("#progress").html("Completed: " + progress + "%");
               });
            });
        </script>
<script>

Merci pour tout

17162
,

il y'a quelques codes JS qui jerent toutes ces verifications

Dans ce cas là, il y a toujours un problème, car dans le code JavaScript tu autorises également les extensions gif et png, sauf que du côté du code PHP, tu n'utilises que l'extension jpg, autant au niveau de la base de données que pour la sauvegarde de l'image, pour l'instant ça doit fonctionner car tu ne dois pour l'instant uploader que des jpg, mais si jamais par la suite tu upload un gif ou un png, tu auras forcément des erreurs.
Tu devrais donc soit au niveau JavaScript limiter les extensions au jpg, soit au niveau PHP sauvegarder l'extension de l'image dans une variable et l'utiliser pour la base de données et pour la sauvegarde du fichier sur le serveur à la place d'utiliser la valeur fixe jpg.

82125
,

Merci bien pour ce remarque c'est vraiment important je m'en était passé. et imprudemment je n'upload jusque là que des jpg je veux tout corriger.
mais pour l'instant si je peux encore simplifier mon probleme: voici deux variables

$workid = $_GET['id'];
$work_id = "3602";
var_dump($workid);
var_dump($work_id);

leurs var_dump donnent exactement la meme chose:
C:\wamp\www\site\users\work_edit.php:60:string '3602' (length=4)
C:\wamp\www\site\users\work_edit.php:61:string '3602' (length=4)
dans la requette

$req = $db->prepare("INSERT INTO images SET work_id= ?");
 $req->execute([$workid]);

si j'excute avec la premiere variable: execute([$workid]) rien ne marche on dirais qu'on ne reconnais plus la valeur de la variable ou que'elle n'ai pas correcte mais si j'excute avec la deuxieme variable:execute([$work_id]) tout marche parfaitement les images sont bien uploadé et enregistrées dans la BDD et poutant les deux variable possedent la meme valeur apres un var_dum et je recupere bien l'id passé dans l'url avec mon $_GET['id']