Mysql
 sql >> база данни >  >> RDS >> Mysql

използване на ЗАПАМЕТЕНИ ПРОЦЕДУРИ:различни резултати в mysqli->query(CALL select_procedure) СРЕЩУ mysqli->query(SELECT ...)

разгледайте Подготвени отчети използва се с 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 инжектиране към рутинни процедури за запомнени процедури.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySql заявка за текуща корекция на баланса

  2. HTML полето за въвеждане не попълва PHP стойност след първото интервал

  3. PHP PDO Bit(1) връща грешен тип данни

  4. групиране по име на колона на клауза, без да го избирате в списъка за избор

  5. Възможно ли е динамично да се посочи стойност на запис в таблица на mysql от втори запис в таблица?