Всем привет. Есть строка с запросом к БД MySQL (полностью приводить ее не буду, ибо смысла в этом нет, да и слишком длинная она): PHP: $command_string="...CONCAT(day(Otdel.prizn5),' ', month_to_text(Otdel.prizn5),' ', YEAR(Otdel.prizn5),' ', TIME(bghm.Otdel.prizn5)) AS prizn5,..." (month_to_text()- Хранимая функция на сервере) На самом "серваке" запрос отрабатывает нормально, а в PHP нет. Ошибок никаких, просто пустой результат. Причем, если поменять на: PHP: $command_string="...Otdel.prizn5 as prizn5,..." то все работает. Подскажите пож-та, в чем может быть дело?
М-да. Дело, оказывается в вызове "хранимки". Если писать запрос без нее, ну что то типа: PHP: $command_string="...CONCAT(day(Otdel.prizn5),' ', 'Здесь должна быть вызвана функция',' ', YEAR(Otdel.prizn5),' ', TIME(bghm.Otdel.prizn5)) AS prizn5,..." то все работает. Как же тогда быть?
Показываю: PHP: <? class select_resultat_class { public $array_nastr=array(); public $obj_podkl; public $array_otdel=array(); function __construct(){ $obj=new connected_class(); $this->obj_podkl=$obj->mysql_obj; } function select_resultat_otdel_nastr(){ //Функция "вытягивает" настройки из БД $command_string='SELECT IFNULL(Prizn2,0) AS prizn2, IFNULL(Prizn3,20) AS prizn3,IFNULL(Prizn4,"prizn1") AS prizn4, IFNULL(Prizn5,0) AS prizn5 FROM Nastr WHERE prizn1 IN (SELECT prizn1 FROM Polzovatel WHERE prizn8=1) LIMIT 1'; $stmt=$this->obj_podkl->prepare($command_string); $stmt->execute(); $stmt->bind_result($prizn2,$prizn3,$prizn4,$prizn5); $stmt->fetch(); $this->array_nastr[2]=$prizn2; $this->array_nastr[3]=$prizn3; $this->array_nastr[4]=$prizn4; $this->array_nastr[5]=$prizn5; } function select_resultat_otdel_data_method(){ //Функция, которая "вытягивает" результат $command_string="SELECT Otdel.Prizn1 AS prizn1,OTDEL_KOROTKO.Prizn2 AS prizn2,OTDEL_POLN.Prizn2 AS prizn3, IFNULL(CONCAT(IFNULL(FAM.Prizn2,' '),' ',IFNULL(IMY.Prizn2,' '),' ',IFNULL(OTCH.Prizn2,' ')),'НЕТ') AS fio, CONCAT(day(BGHM.Otdel.prizn5),' ',data_to_text(Otdel.prizn5),' ',YEAR(Otdel.prizn5),' ',TIME(Otdel.prizn5)) AS prizn5, Otdel.prizn6 AS prizn6, Otdel.prizn7 AS prizn7, IFNULL(Otdel.Prizn8,0) AS prizn8, IFNULL(CASE Otdel.prizn8 WHEN 0 THEN 'НЕТ' WHEN 1 THEN 'ДА' END,'НЕТ') AS flag_prizn8 FROM OTDEL_KOROTKO RIGHT OUTER JOIN Otdel ON OTDEL_KOROTKO.Prizn1 = Otdel.Prizn2 LEFT OUTER JOIN OTDEL_POLN ON OTDEL_POLN.Prizn1 = Otdel.Prizn3 CROSS JOIN FAM INNER JOIN Polzovatel ON FAM.Prizn1 = Polzovatel.Prizn2 AND Polzovatel.Prizn1 = Otdel.Prizn4 LEFT OUTER JOIN IMY ON IMY.Prizn1 = Polzovatel.Prizn3 LEFT OUTER JOIN OTCH ON OTCH.Prizn1 = Polzovatel.Prizn4 "; $command_string=$command_string.(($this->array_nastr[2]==0)?"WHERE Otdel.Prizn8=0 OR Otdel.Prizn8 IS NULL ":" "); //в зависимости от настроек $command_string=$command_string.("order by ".$this->array_nastr[4].(($this->array_nastr[5]==0)?" asc":" desc")); //в зависимости от настроек $stmt=$this->obj_podkl->prepare($command_string); $stmt->execute(); $stmt->bind_result($prizn1,$prizn2,$prizn3,$fio,$prizn5,$prizn6,$prizn7,$prizn8,$flag_prizn8); while($stmt->fetch()){ $this->array_otdel[]=array("prizn1"=>$prizn1,"prizn2"=>$prizn2,"prizn3"=>$prizn3,"fio"=>$fio,"prizn5"=>$prizn5,"prizn6"=>$prizn6,"prizn7"=>$prizn7,"prizn8"=>$prizn8, "flag_prizn8"=>$flag_prizn8); } } } ?> Apache 2.2+PHP5.3+MySQL5.5-x64. На OpenServer 5.2.2.
походу у вас pdo, посмотрите несколько примеров, как вызывать хранимки в этой обертке MySQL https://php.ru/manual/pdo.prepared-statements.html Если писать запрос напрямую в мускуле - никаких лишних телодвижений не надо )
@Зингер Тут ребята еще могут тебе посоветовать перейти на php 7, так что и я тебе советую перейти на него. А то я как то боялся вдруг все что я учил надо переучивать будет
@ADSoft Тут про привязку параметров и ХП (спасибо, кстати, очень полезно было про PDO: PARAM_STR... ) , у меня же в строке 28 вызывается Хранимая функция сервера, которая напрямую в мускуле работает, а через PHP нет, т.е. в блок SELECT я не передаю никаких параметров. Строки 29 и 30 также должны быть "обернуты" в подобную функцию. Просто не хочется лишних телодвижений уже на клиенте. @_ne_scaju_ Попробовал в настройках OpenServer поменять модули на: Код (Text): HTTP=Apache-PHP-7-x64, PHP=PHP-7-x64, MySQL/MariaDB=MySQL-5.7-x64 Съехала верстка страницы. Как это может влиять?
читать нужно не только первый параграф, а учится находить ответы на свой вопрос! понимаете? это именно в pdo такая реализация вызова хранимок! в pdo! не в php ... это не одно и то же! а так у вас вjобще получается - веcь запрос в одну строчку... никаких тебе плюшек от pdo, зачем он вам тогда?