Dodawanie funkcji MySQL z pliku .sql przez PHP

0

Dzień dobry.

Mam taki problem:
Próbuję zainstalować w bazie funkcje użytkownika (moje). Jednak ciągle coś mu nie pasuje. Na Stacku pisali by wywalić DELIMITER, ale i tak nie działa. Z DELIMITERem działało przez phpMyAdmin, ale w php nie. Po usunięciu delimitera nie działa ani tu, ani tu. Wklejam kod jednej z funkcji:

DROP FUNCTION IF EXISTS zwrocDlaMom;;
CREATE FUNCTION zwrocDlaMom(showId int)
RETURNS DECIMAL(12, 6)
BEGIN
    DECLARE wynik DECIMAL(12, 6);

    SET wynik =
    (SELECT www.res 
    FROM 
    (
        select sho.id as one, tit.title as two, sts.id as three, 1.0 / 100.0 * (100 - tit.cinema) * sts.amount * tit.duration / 
        (
            select xxx as test
            from 
            (
                select ss.setId, sum(duration) as xxx 
                from shows ss 
                join movies mvt on mvt.id = ss.title 
                where ss.setId = sts.id
                group by ss.setId
            ) as test
        ) as res
        from movies tit
        join shows sho on sho.title = tit.id
        join invoices invo on invo.id = sho.invoice and invo.company = tit.company
        join sets sts on sts.id = sho.setId
        where sho.id = showId
    ) as www);

    return wynik;
end;;

I kod php instalujący:

function executeMultiQuery($multiQuery)
{
    connectTo();

    global $debugMode;
    global $wrongQuery;
    global $connection;
    global $dbName;

    //useDb($dbName);

    $result = $connection->multi_query($multiQuery);

    if ($result == FALSE && $debugMode == TRUE)
        $wrongQuery = "Błąd w zapytaniu: " . $multiQuery . "<br>";

    return $result;
}

$files = scandir("./queries");

foreach ($files as $fileName)
    if ($fileName != "." && $fileName != "..")
        if (executeMultiQuery(file_get_contents("./queries/" . $fileName)) == FALSE)
        {
            printWrongQuery();

            exit("<br>BŁĄD");
        }

executeMultiQuery zwraca false i mówi, tak jak zaprogramowałem, że jest błąd w zapytaniu.
phpMyAdmin mówi: #1064 - Something is wrong in your syntax obok '' w linii 4

Proszę o pomoc.
Dzieki
Michał

0

Dzień dobry.

Już sobie z tym, z pomocą internetu, poradziłem. Otóż okazuje się, że trzeba rozbić każdy z tych plików na dwa:

  1. jeden, z DROP FUNCTION IF EXISTS funName;
  2. i drugi z definicją funkcji.

i każdy z tych plików przekazujemy do funkcji mysqli->query($zawartoscPliku);
Oczywiście, należy tak nazwać pliki, że jeżeli wykonujemy to z automatu, pobierając nazwy plików przy pomocy funkcji scandir, to nazwy plików z dropem muszą być przed plikami z definicjami, bo inaczej: albo skrypt zwróci false, jeżeli funkcja już istniała, albo utworzy funkcję i zaraz ją skasuje.

http://php.net/manual/en/mysq[...]ckstart.stored-procedures.php
https://stackoverflow.com/que[...]e-function-statement-with-php
Załączam kod:

$files = scandir("./queries");

foreach ($files as $fileName)
    if ($fileName != "." && $fileName != "..")
        if (!executeQuery(file_get_contents("./queries/" . $fileName)))
        {
            printWrongQuery();

            exit("<br>BŁĄD");
        }

Moja funkcja executeQuery może zostać zastąpiona gołym $mysqli->query(...);

Dzięki
Z poważaniem
Michał.

0

Zamiast rozbijać przyjrzałbym się mysqli->multi_query().

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0