За последние 24 часа нас посетили 30368 программистов и 1753 робота. Сейчас ищут 850 программистов ...

Строка с запросом к MySQL

Тема в разделе "PHP для новичков", создана пользователем Зингер, 19 окт 2017.

  1. Зингер

    Зингер Активный пользователь

    С нами с:
    20 июл 2017
    Сообщения:
    127
    Симпатии:
    7
    Всем привет.
    Есть строка с запросом к БД MySQL (полностью приводить ее не буду, ибо смысла в этом нет, да и слишком длинная она):
    PHP:
    1. $command_string="...CONCAT(day(Otdel.prizn5),' ',
    2. month_to_text(Otdel.prizn5),' ',
    3. YEAR(Otdel.prizn5),' ',
    4. TIME(bghm.Otdel.prizn5)) AS prizn5,..."
    (month_to_text()- Хранимая функция на сервере)
    На самом "серваке" запрос отрабатывает нормально, а в PHP нет. Ошибок никаких, просто пустой результат.
    Причем, если поменять на:
    PHP:
    1. $command_string="...Otdel.prizn5 as prizn5,..."
    то все работает.
    Подскажите пож-та, в чем может быть дело?
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.866
    Симпатии:
    753
    Адрес:
    Татарстан
    а если псевдоним дать - тоже?
    PHP:
    1. month_to_text(Otdel.prizn5) as prizn5
     
  3. Зингер

    Зингер Активный пользователь

    С нами с:
    20 июл 2017
    Сообщения:
    127
    Симпатии:
    7
    @ADSoft. Что то я не "вкурил"... А разве синтаксис MySQL такое позволяет?
     
  4. Зингер

    Зингер Активный пользователь

    С нами с:
    20 июл 2017
    Сообщения:
    127
    Симпатии:
    7
    М-да. Дело, оказывается в вызове "хранимки". Если писать запрос без нее, ну что то типа:
    PHP:
    1. $command_string="...CONCAT(day(Otdel.prizn5),' ',
    2. 'Здесь должна быть вызвана функция',' ',
    3. YEAR(Otdel.prizn5),' ',
    4. TIME(bghm.Otdel.prizn5)) AS prizn5,..."
    то все работает.
    Как же тогда быть?
     
  5. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.866
    Симпатии:
    753
    Адрес:
    Татарстан
    полностью показывай
    как в php идет подготовка запроса или че
     
  6. Зингер

    Зингер Активный пользователь

    С нами с:
    20 июл 2017
    Сообщения:
    127
    Симпатии:
    7
    Показываю:
    PHP:
    1. <?
    2. class select_resultat_class
    3. {
    4.     public $array_nastr=array();
    5.     public $obj_podkl;
    6.     public $array_otdel=array();
    7.     function __construct(){
    8.         $obj=new connected_class();
    9.         $this->obj_podkl=$obj->mysql_obj;
    10.     }
    11.     function select_resultat_otdel_nastr(){        //Функция "вытягивает" настройки из БД
    12.         $command_string='SELECT IFNULL(Prizn2,0) AS prizn2,
    13.        IFNULL(Prizn3,20) AS prizn3,IFNULL(Prizn4,"prizn1") AS prizn4,
    14.        IFNULL(Prizn5,0) AS prizn5
    15.        FROM Nastr WHERE prizn1 IN (SELECT prizn1 FROM Polzovatel WHERE prizn8=1) LIMIT 1';
    16.         $stmt=$this->obj_podkl->prepare($command_string);
    17.         $stmt->execute();
    18.         $stmt->bind_result($prizn2,$prizn3,$prizn4,$prizn5);
    19.         $stmt->fetch();
    20.         $this->array_nastr[2]=$prizn2;
    21.         $this->array_nastr[3]=$prizn3;
    22.         $this->array_nastr[4]=$prizn4;
    23.         $this->array_nastr[5]=$prizn5;
    24.     }
    25.     function select_resultat_otdel_data_method(){    //Функция, которая "вытягивает" результат
    26.         $command_string="SELECT Otdel.Prizn1 AS prizn1,OTDEL_KOROTKO.Prizn2 AS prizn2,OTDEL_POLN.Prizn2 AS prizn3,
    27.            IFNULL(CONCAT(IFNULL(FAM.Prizn2,' '),' ',IFNULL(IMY.Prizn2,' '),' ',IFNULL(OTCH.Prizn2,' ')),'НЕТ') AS fio,
    28.            CONCAT(day(BGHM.Otdel.prizn5),' ',data_to_text(Otdel.prizn5),' ',YEAR(Otdel.prizn5),' ',TIME(Otdel.prizn5)) AS prizn5,
    29.            Otdel.prizn6 AS prizn6,
    30.            Otdel.prizn7 AS prizn7,
    31.            IFNULL(Otdel.Prizn8,0) AS prizn8,
    32.            IFNULL(CASE Otdel.prizn8
    33.            WHEN 0 THEN 'НЕТ'
    34.            WHEN 1 THEN 'ДА'
    35.            END,'НЕТ') AS flag_prizn8 FROM OTDEL_KOROTKO
    36.            RIGHT OUTER JOIN Otdel ON OTDEL_KOROTKO.Prizn1 = Otdel.Prizn2
    37.            LEFT OUTER JOIN OTDEL_POLN ON OTDEL_POLN.Prizn1 = Otdel.Prizn3
    38.            CROSS JOIN FAM INNER JOIN Polzovatel ON FAM.Prizn1 = Polzovatel.Prizn2 AND Polzovatel.Prizn1 = Otdel.Prizn4
    39.            LEFT OUTER JOIN IMY ON IMY.Prizn1 = Polzovatel.Prizn3
    40.            LEFT OUTER JOIN OTCH ON OTCH.Prizn1 = Polzovatel.Prizn4 ";
    41.         $command_string=$command_string.(($this->array_nastr[2]==0)?"WHERE Otdel.Prizn8=0 OR Otdel.Prizn8 IS NULL ":" ");     //в зависимости от настроек
    42.         $command_string=$command_string.("order by ".$this->array_nastr[4].(($this->array_nastr[5]==0)?" asc":" desc"));    //в зависимости от настроек
    43.         $stmt=$this->obj_podkl->prepare($command_string);
    44.         $stmt->execute();
    45.         $stmt->bind_result($prizn1,$prizn2,$prizn3,$fio,$prizn5,$prizn6,$prizn7,$prizn8,$flag_prizn8);
    46.         while($stmt->fetch()){
    47.             $this->array_otdel[]=array("prizn1"=>$prizn1,"prizn2"=>$prizn2,"prizn3"=>$prizn3,"fio"=>$fio,"prizn5"=>$prizn5,"prizn6"=>$prizn6,"prizn7"=>$prizn7,"prizn8"=>$prizn8,
    48.             "flag_prizn8"=>$flag_prizn8);
    49.         }
    50.     }
    51. }
    52. ?>
    Apache 2.2+PHP5.3+MySQL5.5-x64. На OpenServer 5.2.2.
     
  7. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.866
    Симпатии:
    753
    Адрес:
    Татарстан
    походу у вас pdo, посмотрите несколько примеров, как вызывать хранимки в этой обертке MySQL
    https://php.ru/manual/pdo.prepared-statements.html
    Если писать запрос напрямую в мускуле - никаких лишних телодвижений не надо )
     
  8. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @Зингер
    Тут ребята еще могут тебе посоветовать перейти на php 7, так что и я тебе советую перейти на него. А то я как то боялся вдруг все что я учил надо переучивать будет :D
     
  9. Васяня

    Васяня Активный пользователь

    С нами с:
    2 окт 2016
    Сообщения:
    238
    Симпатии:
    32
    Адрес:
    Россия, Приморский край, г. Находка.
    Без него не как)
     
  10. Зингер

    Зингер Активный пользователь

    С нами с:
    20 июл 2017
    Сообщения:
    127
    Симпатии:
    7
    @ADSoft
    Тут про привязку параметров и ХП (спасибо, кстати, очень полезно было про PDO: PARAM_STR... ) , у меня же в строке 28 вызывается Хранимая функция сервера, которая напрямую в мускуле работает, а через PHP нет, т.е. в блок SELECT я не передаю никаких параметров. Строки 29 и 30 также должны быть "обернуты" в подобную функцию. Просто не хочется лишних телодвижений уже на клиенте.

    @_ne_scaju_
    Попробовал в настройках OpenServer поменять модули на:
    Код (Text):
    1. HTTP=Apache-PHP-7-x64,
    2. PHP=PHP-7-x64,
    3. MySQL/MariaDB=MySQL-5.7-x64
    Съехала верстка страницы. Как это может влиять?
     
  11. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.866
    Симпатии:
    753
    Адрес:
    Татарстан
    читать нужно не только первый параграф, а учится находить ответы на свой вопрос!

    понимаете? это именно в pdo такая реализация вызова хранимок! в pdo! не в php ... это не одно и то же!

    а так у вас вjобще получается - веcь запрос в одну строчку... никаких тебе плюшек от pdo, зачем он вам тогда?