簡體   English   中英

如何使用 Laravel 8 使用存儲過程進行用戶輸入

[英]How to do user input with Stored Procedure with Laravel 8

I've installed Laravel 8 on my Linux Mint 20 for my projects and I've searched many sources on how to use stored procedure in Laravel with user input parameters which one of the sources is: How to execute Stored Procedure from Laravel

但是當我嘗試從 tambah_transaksisupplier.blade.php 添加數據時,它看起來像這樣:

Illuminate\Database\QueryException SQLSTATE[42000]:語法錯誤或訪問沖突:1064 您的 SQL 語法有錯誤; 檢查與您的 MariaDB 服務器版本相對應的手冊,以在第 1 行的“exec spSupplier namasupplier,alamatsupplier”附近使用正確的語法(SQL:exec spSupplier namasupplier,alamatsupplier)

這是 tambah_transaksisupplier.blade.php 的一段,它用於添加新數據,使用存儲過程作為添加數據的接口

<p>
    <form action="/home/tambah_transaksisupplier/store_supplier" method="post">
        <h2>TAMBAH SUPPLIER</h2>
        <p>Supplier yang sudah pernah menyuplai sebelumnya, tetap diisi nama dan alamatnya untuk kode transaksi masuk</p><br>
        {{csrf_field()}}
            
            Supplier     :<br>
            <input type="text" name="namasupplier" value=""><br></br>
            Alamat Supplier     :<br>
            <input type="text" name="alamatsupplier" value=""><br></br>

            <input type="Submit" name="tambah_supplier" value="Tambahkan Supplier"><br> </input><br>
    </form>
</p>

這是 homeController.php 的一塊,用於處理在 controller 文件中使用存儲過程添加數據

public function store_supplier(Request $request)
{

    DB::select(DB::raw("exec spSupplier namasupplier, alamatsupplier"),[
        'namasupplier' => $request,
        'alamatsupplier' => $request
    ]);

    return redirect('home/tambah_transaksisupplier');
}

如果您需要知道,這里是包含存儲過程的 SQL

DELIMITER ##
CREATE PROCEDURE spSupplier(vNamaSupplier VARCHAR(255), vAlamatSupplier VARCHAR(255))
BEGIN

    DECLARE kdSup, nSup, aSup, vTMbaru, vKSbaru VARCHAR(255) DEFAULT '';
    DECLARE ada, totdata, caridata INT DEFAULT 0;

    DECLARE cCariNamaAlamat CURSOR FOR
    SELECT kodesupplier, namasupplier, alamatsupplier FROM Supplier;

    SELECT COUNT(*) INTO totdata FROM Supplier;
    SELECT UPPER(vNamaSupplier) INTO @uNamaSupplier;
    SELECT UPPER(vAlamatSupplier) INTO @uAlamatSupplier;
    
    SET caridata = 1;
    OPEN cCariNamaAlamat;
    WHILE caridata<=totdata DO
        FETCH cCariNamaAlamat INTO kdSup, nSup, aSup;
            IF @uNamaSupplier=nSup AND @uAlamatSupplier=aSup THEN
                SET ada=1;
                SELECT (CAST(SUBSTRING(MAX(notransmasuk),4,4)AS INT)+1) INTO @vtmbaru FROM TransaksiMasuk;
                SET vTMbaru = (CASE
                    WHEN @vtmbaru <10 THEN CONCAT('TM-000', @vtmbaru)
                    WHEN @vtmbaru <100 THEN CONCAT('TM-00', @vtmbaru)
                    WHEN @vtmbaru <1000 THEN CONCAT('TM-0', @vtmbaru)
                    WHEN @vtmbaru <10000 THEN CONCAT('TM-', @vtmbaru)
                END);
                INSERT INTO TransaksiMasuk VALUES
                (vTMbaru,NOW(),kdSup);
            END IF;
            SET caridata=caridata+1;
    END WHILE;
    CLOSE cCariNamaAlamat;

    IF ada = 0 THEN
        SELECT (CAST(SUBSTRING(MAX(kodesupplier),4,4)AS INT)+1) INTO @supplierbaru FROM Supplier;
        
        SET vKSbaru =(CASE
            WHEN @supplierbaru <10 THEN CONCAT('S-000', @supplierbaru)
            WHEN @supplierbaru <100 THEN CONCAT('S-00', @supplierbaru)
            WHEN @supplierbaru <1000 THEN CONCAT('S-0', @supplierbaru)
            WHEN @supplierbaru <10000 THEN CONCAT('S-', @supplierbaru)
        END);

        INSERT INTO Supplier VALUES
        (vKSbaru,@uNamaSupplier,@uAlamatSupplier);

        SELECT (CAST(SUBSTRING(MAX(notransmasuk),4,4)AS INT)+1) INTO @vtmbaru FROM TransaksiMasuk;

        SET vTMbaru =(CASE
            WHEN @vtmbaru <10 THEN CONCAT('TM-000', @vtmbaru)
            WHEN @vtmbaru <100 THEN CONCAT('TM-00', @vtmbaru)
            WHEN @vtmbaru <1000 THEN CONCAT('TM-0', @vtmbaru)
            WHEN @vtmbaru <10000 THEN CONCAT('TM-', @vtmbaru)
        END);
                
        INSERT INTO TransaksiMasuk VALUES
        (vTMbaru,NOW(),vKSbaru);

    END IF;
END
##
DELIMITER ;

誰能給我一個解決方案,我應該怎么做才能修復它? (尤其是在 controller 文件中)

我想你應該使用下面的代碼:

DB::select('exec spSupplier(?,?)',array($value1,$value2));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM