Доброго времени суток! Делаю запрос к БД MS SQL через ajax. Спойлер Код (Javascript): function getActiveDevice(tec_id, device_id) { $.ajax({ url: "php/sqlQuery.php", type: "GET", dataType: "json", data: { tec_id:tec_id, device_id:device_id }, success:function(result){ console.log("Success: ", result); }, error:function(jqXHR, textStatus, errorThrown) { console.log('textStatus: '+ textStatus); console.log('error: ' + errorThrown); } }); } в sqlQuery.php делается выборка и формируется массив PHP: <?php $id_tec = $_GET['tec_id']; $id_device = $_GET['device_id']; // подключение к БД include_once '../php/DBconnect.php'; if ($id_tec == 0) { echo json_encode(array("c" => "all")); exit(); } else { // выборка из объединенных таблиц gftec и Device по полю gftec.tabl=device.id // !!вопрос в этом запросе!! $db_query = "SELECT gftec.[Id] ,gftec.[ID_TEC] ,gftec.[dattime] ,gftec.[p] ,gftec.[t] ,gftec.[q] ,gftec.[tabl] ,Device.[ID] as 'id_dev' ,Device.[Name] ,Device.[OrderNum] ,Device.[IdDataType] FROM ( SELECT * FROM gftec WHERE [ID_TEC]=".$id_tec.") AS gftec JOIN ( SELECT * FROM Device WHERE [Id_tec]=".$id_tec.") AS device ON gftec.[tabl]=device.[ID] WHERE gftec.[Id] IN (select max(Id) FROM gftec WHERE gftec.[ID_TEC]=".$id_tec." GROUP BY gftec.[tabl]) ORDER BY device.[OrderNum]"; } // формирование массива значений $odbc_result = odbc_exec($db_connect,$db_query); $device_cont = odbc_num_rows($odbc_result); if ($odbc_result) { for ($i=0; $i <$device_cont ; $i++) { $res_d_name[$i] = odbc_result($odbc_result,"Name"); $res_p[$i] = odbc_result($odbc_result,"p"); $res_t[$i] = odbc_result($odbc_result,"t"); $res_q[$i] = odbc_result($odbc_result,"q"); $res_dattime[$i] = date("d:m:Y h:i:s", strtoTime(odbc_result($odbc_result,"dattime"))); odbc_fetch_row($odbc_result); } echo json_encode(array('c' => $device_cont, 'd_name' => $res_d_name, 'p' => $res_p, 't' => $res_t, 'q' => $res_q, 'dattime' => $res_dattime)); } else { echo "\n - table isn't readed"; } ?> в средствах разработчика браузера результат всего этого: - в логах - в network есть запись о запросе, но получено 0 B Проблема в том, что данный SELECT был отлажен в MS SQL Server Manadement Studio. И там он отлично работает. Но при копировании запроса в php, результатом становится "синтаксическая ошибка" (результат не меняется, если вместо переменных вставляю явные значения). Как я понимаю, для php чего-то в этом запросе не хватает. Синтаксис php проверялся неоднократно - вместо переменных вставлял обычные значения, все двойные/одинарные кавычки, скобки, точки с запятой - все, вроде бы, на месте, но... p.s. Не знаю поможет ли эта история, но вот работающий запрос (собственно его и переделываю): Спойлер PHP: $db_query = "SELECT [Id] ,[ID_TEC] ,[dattime] ,[p] ,[t] ,[q] ,[tabl] FROM [GF].[dbo].[gftec] where [ID_tec]=".$id_tec." and [Id] in (select max(id) from [GF].[dbo].[gftec] where [ID_TEC]=".$id_tec." group by [tabl])"; так вот изначально он был без where в 10-й строке и все в той же менеджмент студии работал отлично, но при вставке в php работать отказывался. Я уже не помню, как додумался до добавления этой 10-й строки, однако смысла ее добавления ни тогда, ни сейчас так и не понял и воспринимал, как бубен. Но вот второй запрос со схожими симптомами уже вызывает подозрения... 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 ) )
результат выборки вложенного запроса должен соответствовать тому, что ожидает получить внешний запрос.
Нашел... проблема в выводе массива PHP: 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? Обычные названия...