Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [Laravel] Errore con stored procedure che funziona

    ciao!

    ho creato questa stored procedure:
    codice:
    DELIMITER //
    DROP PROCEDURE IF EXISTS add_brand //
    CREATE PROCEDURE add_brand(
        IN id INT,
        IN nome VARCHAR(25),
        IN alias VARCHAR(30),
        IN visibile BOOLEAN
    )
        NO SQL
    BEGIN
        IF id = 0 THEN
            INSERT INTO brands
            VALUES (NULL, nome, alias, visibile, NOW(), NOW());
    
            SELECT LAST_INSERT_ID() AS last;
        ELSE
            UPDATE brands
            SET brand_nome     = nome,
                brand_alias    = alias,
                brand_visibile = visibile,
                brand_modifica = NOW()
            WHERE brand_id = id;
    
            SELECT id AS last;
        END IF;
    END
    se la chiami da phpmyadmin, o programmi simili, funziona senza errori.

    poi nel mio controller:
    codice:
        public function add(Request $req) {
            $data = $req->json()->all();
            $mpUtils = new MPUtils();
    
            if (!empty($data)) {
                try {
                    $res = DB::select('CALL add_brand(?,?,?,?)', array(
                        $data['brand_id'], trim($data['brand_nome']), trim(data['brand_alias']),
                        $data['brand_visibile']
                    ));
    
                    return response()->json(array(
                        "res" => "ok",
                        "id" => $res[0]->last,
                        "message" => "Operazione avvenuta con successo!"
                    ));
                } catch (QueryException $ex) {
                    return response()->json([
                        'res' => 'ko',
                        'message' => 'Errore: ' . $ex->getMessage()
                    ]);
                }
            } else {
                return response()->json(array(
                    "res" => "ko",
                    "message" => "Dati mancanti!"
                ));
            }
        }
    mi restituisce questo:
    codice:
    {
        "res": "ko",
        "message": "Errore: SQLSTATE[HY000]: General error: 2053  (SQL: CALL add_brand(201,test,test,0))"
    }
    ma la cosa bella è che sul db vedo il record aggiunto / modificato.
    in sostanza funziona, ma va in eccezione.
    è la prima volta che mi capita una cosa del genere.

    questo il json che gli passo:
    codice:
    {
        "brand_id": 201,
        "brand_nome": "test",
        "brand_alias": "test", 
        "brand_visibile": false
    }

  2. #2
    Perchè usi una stored procedure per fare un insert o un update?

    Non sarebbe molto più leggibile e debuggabile un codice così?

    codice:
    // Manca la validazione della request
    
    if (($data['brand_id'] ?? null) === 0) {
        Brand::create([
            'brand_nome' => trim($data['brand_nome'] ?? ''),
            'brand_alias' => trim($data['brand_alias'] ?? ''),
            'brand_visibile' => Carbon::now(),
            'brand_modifica' => Carbon::now(),
        ]);
    } else {
        Brand::where('id', '=', $data['brand_id'])
            ->update([
                'brand_nome' => trim($data['brand_nome'] ?? ''),
                'brand_alias' => trim($data['brand_alias'] ?? ''),
                'brand_visibile' => $data['brand_visibile'] ?? Carbon::now(),
                'brand_modifica' =>  Carbon::now(),
            ]);
    }
    Ultima modifica di filippo.toso; 15-04-2021 a 20:05 Motivo: Esempio di codice

  3. #3
    ciao!

    mi hanno chiesto di usare sempre le stored procedure.
    anche perchè se un domani voglio abbandonare laravel, non devono riscriversi tutto il codice.
    meglio o peggio che sia, mi attengo a quello che mi chiedono.

    personalmente io così mi trovo bene, e non sto avendo problemi.
    di controller così ne ho diversi, su diversi progetti, e solo questo mi da problemi.
    tra le altre cose, la procedure funziona, perchè il record viene effettivamente aggiunto o modificato.

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    189
    php è un linguaggio interpretato spesso dietro le quinte si nasconde codice C, C++ inoltre il tuo esempio parla di librerie diverse su phpmyadmin che usa mysqli mentre tu usi PDO.. concettualmente poiché non usi la stored procedure della libreria ma usi quella nativa Mysql può darsi che PDO sconosca l'istruzione o erroneamente fa altro o comunque si aspetta altro.
    Se sei un programmatore C ti consiglio di guardare il codice sorgente nel github php e se riesci nel tuo intento potrai richiedere a php.net di modificare la libreria PDO.
    In questo esempio vedo parlare solo della libreria mysqli https://www.php.net/manual/en/mysqli...procedures.php non so se faccia al caso tuo, spero ti aiuti.
    Per PDO https://www.php.net/manual/en/pdo.pr...statements.php
    Ultima modifica di darbula; 16-04-2021 a 16:19

  5. #5
    oddio, addirittura andare a vedere il codice sorgente per l'errore su un controller mi sembra esagerato !

    diciamo che non ho neanche le competenze per farlo.
    visto che solo questa stored procedure non funziona (su una ventina che già ci sono) al limite la cancello e la rifaccio.
    e rifaccio al controller!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.