За последние 24 часа нас посетили 18655 программистов и 1627 роботов. Сейчас ищут 1283 программиста ...

запрос не работает в php

Тема в разделе "MSSQL", создана пользователем kickbeat, 3 окт 2018.

Метки:
  1. kickbeat

    kickbeat Новичок

    С нами с:
    3 окт 2018
    Сообщения:
    3
    Симпатии:
    0
    Доброго времени суток!

    Делаю запрос к БД MS SQL через ajax.
    Код (Javascript):
    1. function getActiveDevice(tec_id, device_id) {
    2.       $.ajax({
    3.           url: "php/sqlQuery.php",
    4.           type: "GET",
    5.           dataType: "json",
    6.           data: {
    7.             tec_id:tec_id,
    8.             device_id:device_id
    9.           },
    10.           success:function(result){
    11.               console.log("Success: ", result);
    12.             },
    13.           error:function(jqXHR, textStatus, errorThrown) {
    14.             console.log('textStatus: '+ textStatus);
    15.             console.log('error: ' + errorThrown);
    16.           }
    17.       });
    18. }

    в sqlQuery.php делается выборка и формируется массив
    PHP:
    1. <?php
    2.  
    3. $id_tec = $_GET['tec_id'];
    4. $id_device = $_GET['device_id'];
    5.  
    6. // подключение к БД
    7. include_once '../php/DBconnect.php';
    8.  
    9. if ($id_tec == 0) {
    10.   echo json_encode(array("c" => "all"));
    11.   exit();
    12. } else {
    13.     // выборка из объединенных таблиц gftec и Device по полю gftec.tabl=device.id
    14.  
    15. // !!вопрос в этом запросе!!
    16.     $db_query = "SELECT gftec.[Id]
    17.                        ,gftec.[ID_TEC]
    18.                        ,gftec.[dattime]
    19.                        ,gftec.[p]
    20.                        ,gftec.[t]
    21.                        ,gftec.[q]
    22.                        ,gftec.[tabl]
    23.                          ,Device.[ID] as 'id_dev'
    24.                          ,Device.[Name]
    25.                          ,Device.[OrderNum]
    26.                          ,Device.[IdDataType]
    27.              FROM (
    28.                SELECT * FROM gftec WHERE [ID_TEC]=".$id_tec.") AS gftec JOIN (
    29.                SELECT * FROM Device WHERE [Id_tec]=".$id_tec.") AS device ON gftec.[tabl]=device.[ID]
    30.                WHERE gftec.[Id] IN (select max(Id) FROM gftec WHERE gftec.[ID_TEC]=".$id_tec." GROUP BY gftec.[tabl])
    31.                ORDER BY device.[OrderNum]";
    32. }
    33. // формирование массива значений
    34.  
    35.     $odbc_result = odbc_exec($db_connect,$db_query);
    36.     $device_cont = odbc_num_rows($odbc_result);
    37.  
    38.     if ($odbc_result) {
    39.         for ($i=0; $i <$device_cont ; $i++) {
    40.           $res_d_name[$i] = odbc_result($odbc_result,"Name");
    41.           $res_p[$i] = odbc_result($odbc_result,"p");
    42.           $res_t[$i] = odbc_result($odbc_result,"t");
    43.           $res_q[$i] = odbc_result($odbc_result,"q");
    44.           $res_dattime[$i] = date("d:m:Y h:i:s", strtoTime(odbc_result($odbc_result,"dattime")));
    45.           odbc_fetch_row($odbc_result);
    46.       }
    47.        echo json_encode(array('c' => $device_cont, 'd_name' => $res_d_name, 'p' => $res_p, 't' => $res_t, 'q' => $res_q, 'dattime' => $res_dattime));
    48.       } else {
    49.        echo "\n - table isn't readed"; }
    50. ?>
    в средствах разработчика браузера результат всего этого:
    - в логах
    - в network есть запись о запросе, но получено 0 B

    Проблема в том, что данный SELECT был отлажен в MS SQL Server Manadement Studio. И там он отлично работает. Но при копировании запроса в php, результатом становится "синтаксическая ошибка" (результат не меняется, если вместо переменных вставляю явные значения). Как я понимаю, для php чего-то в этом запросе не хватает. Синтаксис php проверялся неоднократно - вместо переменных вставлял обычные значения, все двойные/одинарные кавычки, скобки, точки с запятой - все, вроде бы, на месте, но...

    p.s. Не знаю поможет ли эта история, но вот работающий запрос (собственно его и переделываю):
    PHP:
    1.     $db_query = "SELECT [Id]
    2.                     ,[ID_TEC]
    3.                     ,[dattime]
    4.                     ,[p]
    5.                     ,[t]
    6.                     ,[q]
    7.                     ,[tabl]
    8.                  FROM [GF].[dbo].[gftec]
    9.                  where [ID_tec]=".$id_tec." and [Id] in (select max(id) from [GF].[dbo].[gftec]
    10.                                                                  where [ID_TEC]=".$id_tec."
    11.                                                                  group by [tabl])";
    так вот изначально он был без where в 10-й строке и все в той же менеджмент студии работал отлично, но при вставке в php работать отказывался. Я уже не помню, как додумался до добавления этой 10-й строки, однако смысла ее добавления ни тогда, ни сейчас так и не понял и воспринимал, как бубен. Но вот второй запрос со схожими симптомами уже вызывает подозрения...
    [​IMG] [​IMG]

    0
     
  2. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    Проверьте вложенные запросы по отдельности. И проверьте что они возвращаются и подходит ли это для внешних запросов.
     
  3. kickbeat

    kickbeat Новичок

    С нами с:
    3 окт 2018
    Сообщения:
    3
    Симпатии:
    0
    проверял на стадии формирования этого запроса.

    хм... в общем понатыкал везде print в sqlQuery.php
    ну и все работает как бы. И запрос, вполне корректно принял переменные и данные из базы получил, и массив сформировался. Ну вроде все ок. Остается тогда только или возврат массива echo json_encode(array(.....)); что-то не то, или уже принимающий этот массив ajax что-то другое ожидает... Синтаксическая ошибка...
    Как понять "подходит ли это для внешних запросов"? Вот такой массив выводится через json_encode
    Array ( [c] => 6 [d_name] => Array ( [0] => Прямая Т.С [1] => Обратная Т.С [2] => Подпитка Т.С [3] => Пром.вода [4] => Пром. ввод газа [5] => Гор.ввод газа ) [p] => Array ( [0] => 8.0184870000000004 [1] => 1.7380519999999999 [2] => 1.8435520000000001 [3] => -0.18861900000000001 [4] => 4.2474769999999999 [5] => 4.451854 ) [t] => Array ( [0] => 81.0 [1] => 52.0 [2] => 85.0 [3] => 16.0 [4] => -1.0 [5] => -3.0 ) [q] => Array ( [0] => 1869.670044 [1] => 1887.8157960000001 [2] => 0.0 [3] => 0.0 [4] => 10809.722656 [5] => 0.0 ) [dattime] => Array ( [0] => 09:01:2017 11:15:00 [1] => 09:01:2017 11:16:00 [2] => 09:01:2017 11:16:00 [3] => 09:01:2017 11:16:00 [4] => 09:01:2017 11:15:00 [5] => 09:01:2017 11:16:00 ) )
     
  4. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    результат выборки вложенного запроса должен соответствовать тому, что ожидает получить внешний запрос.
     
  5. kickbeat

    kickbeat Новичок

    С нами с:
    3 окт 2018
    Сообщения:
    3
    Симпатии:
    0
    Нашел...
    проблема в выводе массива
    PHP:
    1. echo json_encode(array('c' => $device_count, 'd_name' => $res_d_name, 'p' => $res_p, 't' => $res_t, 'q' => $res_q, 'dattime' => $res_dattime));
    как только я убираю из массива d_name, ошибка сразу пропадает...
    Но за этим как раз я и переделывал запрос. Что такого особенного в этом d_name? Обычные названия...