rozważ Przygotowane oświadczenia
używany z concat()
tak jak często.
DROP PROCEDURE if exists myStoredProc101;
DELIMITER $$
CREATE PROCEDURE myStoredProc101
( pSanitized VARCHAR(124)
)
BEGIN
set @mySql:=concat("SELECT DISTINCT ID FROM user where match(name) against ('* *",pSanitized,"* *')");
PREPARE stmt1 FROM @mySql;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
END
$$
DELIMITER ;
Twój przechowywany proc nie miał szans zadziałać, ponieważ nawet nie używał twojego parametru. To, co zrobiłeś, to zakopanie czegoś wewnątrz literału napisowego. Również varchar(124) jest trochę dziwny :p
Prawie jedyny sukces, jaki ludzie odnoszą z przygotowanymi oświadczeniami, to użycie zmiennej użytkownika (z @
) a nieudane próby użycia zmiennych lokalnych (od DECLARE). Dzięki temu w przyszłości możesz zaoszczędzić kilka godzin machania głową.
Ze strony podręcznika PHP Zapisane procedury :
Co do wywoływania zapisanego proc z mysqli
, zapoznaj się z Odpowiedź
od Pabla Tobara. Nie wygląda to szczególnie przyjemnie z wieloma zmiennymi, ale wydaje się, że tak właśnie jest. Alert spoilera:używaj zmiennych mysql, a nie zmiennych PHP.
To prawda, Pablo nie zwracał zestawu wyników, ale pisał do OUT
var w zapisanym proc. Być może musisz zrobić to, co zrobił dla IN
parametrów i wywołaj multi_query()
, a następnie store_result()
, a następnie fetch_all()
(w skrócie, PHP odwołuje się do strony w górę).
Alternatywnie, połączenie może zostać wykonane przez Palladium tutaj .
W obu przypadkach należy wziąć pod uwagę przypadek, aby uniknąć znanej luki w przekazywaniu wstrzyknięcia SQL przejdź do procedur zapisanych w bazie.