Mam wiele procedur przechowywanych dokonanych za pomocą środowiska roboczego MySQL. Działają dobrze, gdy używają środowiska roboczego MySQL do umieszczenia ich w moim testowym DB.Jak wstawiać/tworzyć procedury składowane w mySQL z PHP?
Teraz przygotowuję skrypty kreacji DB do wdrożenia, i to jest jedyna, która sprawia mi kłopot. Kiedy używam powłoki linii poleceń/mysql, skrypt działa doskonale. Dopiero gdy użyję interfejsu PHP mysql (i) do wykonania skryptu - to się nie powiedzie. Bez komentarza.
Używam skryptów tworzenia procedur, ponieważ generuje mi workbench MySQL; to znaczy, że ma ten wzór:
SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @[email protected]@SQL_MODE, SQL_MODE='TRADITIONAL';
na początku skryptu, a następnie powtórzenie dla każdej procedury:
DELIMITER $$
USE `dbname`$$
CREATE PROCEDURE `procname`(IN inputparameters)
BEGIN
... procedura idzie tu
;
END$$
DELIMITER ;
tego skryptu działa dobrze, jeśli działa z poziomu MySQL Workbench. Działa również dobrze, jeśli spróbuję tego samego z linii poleceń mysql. Ale nie wykonuje niczego, gdy wykonuję go za pośrednictwem interfejsu mysqli PHP (wykonując go za pomocą mysqli_multi_query, co działa dobrze dla innych skryptów tworzących i wypełniających DB). W interfejsie nie jest zwracany błąd, brak wyników (!). Wszystko, co otrzymuję, to "fałsz" i to wszystko. kod błędu wynosi 0, brak komunikatu o błędzie.
To dla mnie wielki WTF, i mam nadzieję, że możesz wskazać mi właściwy kierunek - jak mogę to naprawić i zainstalować procedury z PHP?
PS: dostęp do konta root/administratora jest podany i zweryfikowany (w końcu właśnie utworzyłem bazę danych z tym samym połączeniem, utworzonymi użytkownikami, wstawionymi tabelami itd.).
Spróbuj usunąć użycie 'dbname'. Spróbuj także uruchomić, jeśli używasz polecenia mysqli_query. – Knubo
Usunąłem tę instrukcję USE, bez efektu. mysqli_query również się nie powiedzie - iw tym przypadku jest oczywiste, dlaczego: ciąg zawiera wiele instrukcji, więc jeśli * działał * poprawnie, zwracałby wiele wyników - których mysqli_query nie obsługuje. - w przypadku innych skryptów funkcja mysqli_multi_query działa idealnie dobrze, zwracając jeden wiersz wyników dla każdej instrukcji. (puste wiersze na sukces, Uwaga: 1051 linii jako reakcja na POKAŻ OSTRZEŻENIA, - wszystko zgodnie z oczekiwaniami). – foo
Zbliżam się - nie ma rozwiązania, ale diagnoza. DELIMITER wydaje się być zaimplementowany po stronie klienta (!). – foo