разгледайте Подготвени отчети
използва се с concat()
както често са.
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 ;
Вашият съхранен процес нямаше шанс да работи, тъй като дори не използваше вашия параметър. Това, което направихте, беше да заровите нещо вътре в низов литерал. Освен това varchar(124) е малко странен :p
Почти единственият успех, който хората постигат с подготвените изрази, е използването на потребителска променлива (с @
) срещу неуспешни опити за използване на локални променливи (от DECLARE). Така че това може да ви спести няколко часа блъскане на главата в бъдеще.
От страницата с ръководство за PHP Съхранени процедури :
Що се отнася до извикването на съхранената процедура от mysqli
, моля, погледнете Отговор
от Пабло Тобар. Не изглежда особено приятно с много променливи, но изглежда това е мястото. Предупреждение за спойлер:използвайте mysql променливи, а не PHP променливи.
Разбира се, Пабло не връщаше набор от резултати, а по-скоро пишеше в OUT
var в съхранената процедура. Може би трябва да направите това, което той направи за IN
параметри и извикайте multi_query()
, след това store_result()
, след това fetch_all()
(накратко, PHP препратката е страница нагоре).
Като алтернатива ще бъде направено повикване, както е направено от Palladium тук .
И в двата случая трябва да се вземе предвид случая, за да се избегне известната уязвимост при преминаване на SQL инжектиране към рутинни процедури за запомнени процедури.