Partage
  • Partager sur Facebook
  • Partager sur Twitter

Condition ternaire non respecté malgré les logs

    15 mars 2024 à 12:16:19

    Bonjour,

    Voila, je cherche à insérer des images de produit en base (uniquement leurs nom) et les déplacer sur mon serveur. Je laisse l'utilisateur mettre un nombre de 4 images max. Donc pour gérer ça en PHP j'ai cette fonction :

    public function store(Request $request)
        {
            $request->validate([
                'nom' => 'required',
                'description' => 'required',
                'prix' => 'required',
                'categorie_id' => 'required',
                'stock' => 'required',
                'seller_id' => 'required',
                'pOne' => 'required',
                'pTwo' => 'required',
                'pThree' => 'required',
                'pFour' => 'required',
            ]);
    
            if (($request->reduction == null) or (empty($request->reduction)) or (!$request->has('reduction'))) {
                $reduction = 0;
            } else {
                $reduction = $request->reduction;
            }
    
            $produits = new Produits();
    
            $imageToAdd = true;
    
    
    
            if ($imageToAdd == false) {
                $photo_produit = new PhotosProduits();
                $filename = 'none.png';
                try {
                    $photo_produit->photo = $filename;
                    $photo_produit->produit_id = $produits->id;
                    if ($photo_produit->save()) {
                        $imageToAdd = true;
                    } else {
                        throw new \Exception('Une erreur est survenue lors de l\'upload de la photo');
                    }
                } catch (\Throwable $th) {
                    return response()->json([
                        'status' => false,
                        'message' => 'Erreur image none : ' . $th->getMessage()
                    ], 500);
                }
            }
    
            $produits->nom = strtolower($request->nom);
            $produits->description = strtolower($request->description);
            $produits->prix = $request->prix;
            $produits->reduction = $reduction;
            $produits->categorie_id = $request->categorie_id;
            $produits->stock = $request->stock;
            $produits->seller_id = $request->seller_id;
    
            $produits->is_ready = true;
            $produits->actif = 1;
    
            if ($produits->save()) {
                if ((!$request->pOne) and (!$request->pTwo) and (!$request->pThree) and (!$request->pFour)) {
                    $imageToAdd = false;
                    $filename = 'none.png';
                } else {
                    $images = [
                        'pOne' => 'imageOne',
                        'pTwo' => 'imageTwo',
                        'pThree' => 'imageThree',
                        'pFour' => 'imageFour',
                    ];
                    $i = 1;
                    foreach ($images as $key => $value) {
                        if ($request->input($key)) {
                            echo "Début de l'étape $i".PHP_EOL;
                            $photo_produit = new PhotosProduits();
                            echo $key . ' : ' . $value . ' : ' . $request->input($key) . PHP_EOL;
                            $filename = $produits->nom . '_' . $request->file($value)->getClientOriginalName() . '.' . $request->file($value)->extension();
                            $request->file($value)->move(public_path('images/imageProduit'), $filename);
                            $photo_produit->photo = $filename;
                            $photo_produit->produit_id = $produits->id;
                            if ($photo_produit->save()) {
                                $imageToAdd = true;
                            } else {
                                throw new \Exception('Une erreur a été détécté lors de l\'upload de l\'image ' . $i);
                            }
                            $i++;
                        }
                    }
                }
                if ($imageToAdd) {
                    $produits->is_ready = 1;
                } else {
                    $produits->is_ready = 0;
                }
                return response()->json([
                    'status' => true,
                    'message' => 'Produit ajouté avec succès',
                    'produit' => $produits
                ], 201);
            } else {
                return response()->json([
                    'status' => false,
                    'message' => 'Une erreur est survenue'
                ], 500);
            }
        }

    Ce que je ne comprends pas, c'est que j'ai une erreur sur "$request->file($value)->getClientOriginalName()". L'erreur me dit que le fichier est null. Alors que j'ai ses logs :

    "Début de l'étape 1

    pOne : imageOne : true

    Début de l'étape 2

    pTwo : imageTwo : true

    Début de l'étape 3

    pThree : imageThree : false"

    Il rentre a priori dans le IF ligne 71, alors que la valeur est "false".

    En conclusion, je ne comprends pas pourquoi il rentre dans le IF, et je ne sais pas comment corriger ça

    -
    Edité par alpacinonogeek 15 mars 2024 à 12:17:01

    • Partager sur Facebook
    • Partager sur Twitter
      15 mars 2024 à 20:06:53

      Salut,

      Il existe pas de ternaire dans ton code. Sauf erreur de ma part $request->input('XXX') renvoie une chaîne de caractères pas un booléen donc ce que tu as est normal comme comportement.

      • Partager sur Facebook
      • Partager sur Twitter
      le bienfait n'est jamais perdu
        20 mars 2024 à 16:44:56

        Bonjour,

        Si tu regardes les logs, on voit que false est bien renvoyé pour le input

        • Partager sur Facebook
        • Partager sur Twitter
          20 mars 2024 à 21:21:24

          Salut

          Est-ce que la dernière image dépasse soit la taille maximum d'upload pour un fichier, soit fait dépasser la taille maximum des données "en POST" gérées par le serveur, par hasard ?

          • Partager sur Facebook
          • Partager sur Twitter
            21 mars 2024 à 14:26:20

            Si tu rentres dans la condition alors ce n'est pas le booléen false mais une simple chaîne de caractères sinon ton "echo" ne t'afficherait pas littéralement 'true' ou 'false' .

            A toi de modifier ton code par exemple en faisant $request->input($key) == 'true' par exemple ou voir s'il existe pas un moyen de renvoyer un booléen avec une méthode existante de LARAVEL.

            Maintenant le 'false' t'indique qu'il y a une erreur (dans ton cas $request->file($value) est NULL). Est-ce que le champ file avec le name 'imageThree' existe ? Est-ce que comme l'a dit Ymox un dépassement de limite ? etc..

            Essaie tes variables avec des dd.

            • Partager sur Facebook
            • Partager sur Twitter
            le bienfait n'est jamais perdu
              23 mars 2024 à 12:57:09

              Bonjour,

              Je comprends mieux. Il est fort probable que la valeur soit un string qui est égale a true.

              Et c'est uniquement quand elle est a true que l'image qu'il lui est lié existe.

              Je vais tester, et je reviendrais

              • Partager sur Facebook
              • Partager sur Twitter

              Condition ternaire non respecté malgré les logs

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              • Editeur
              • Markdown