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/mysqli.quickstart.stored-procedures.php
https://stackoverflow.com/questions/14569528/execute-mysql-create-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