Я пытаюсь создать зависимость для проекта, запрос SQL работает и возвращает нужные мне данные в администраторе PHP, однако, когда я пытаюсь создать для этого запрос AJAX, все, что он делает, это возвращает пустой массив, это вызывается кнопкой нажмите, и когда я меняю вызов AJAX на другой файл PHP, он возвращает данные из этого вызова, но ничего не возвращает, когда я снова меняю его обратно
JS-функция
«Идентификатор» здесь заполняется динамически из функции onClick, это работает и возвращает правильный идентификатор для данного местоположения, проверяется в сети Chrome Dev Tools и видит, что номер работает.
function checkLocationDependancies(id) {
$.ajax({
url: "./libs/php/checkDepartmentByLocation.php",
type: "GET",
dataType: 'json',
data: {
id,
},
success: function(result) {
console.info(id)
console.info(result)
},
error: function(result) {
alert('error');
}
})
};
PHP-маршрут
SQL-запрос ниже работает, если я скопирую и вставлю его в администрацию PHP, он вернет необходимую мне информацию.
<?php
ini_set('display_errors', 'On');
error_reporting(E_ALL);
$executionStartTime = microtime(true);
include("config.php");
header('Content-Type: application/json; charset=UTF-8');
$conn = new mysqli($cd_host, $cd_user, $cd_password, $cd_dbname, $cd_port, $cd_socket);
if (mysqli_connect_errno()) {
$output['status']['code'] = "300";
$output['status']['name'] = "failure";
$output['status']['description'] = "database unavailable";
$output['status']['returnedIn'] = (microtime(true) - $executionStartTime) / 1000 . " ms";
$output['data'] = [];
mysqli_close($conn);
echo json_encode($output);
exit;
}
$query = $conn->prepare('SELECT `department`.`locationID`, `location`.`name` FROM `department` LEFT JOIN `location` ON (`location`.`id` = `department`.`locationID`) WHERE `department`.`id` = ?');
$query->bind_param("i", $_REQUEST['id']);
$query->execute();
if (false === $query) {
$output['status']['code'] = "400";
$output['status']['name'] = "executed";
$output['status']['description'] = "query failed";
$output['data'] = [];
mysqli_close($conn);
echo json_encode($output);
exit;
}
$output['status']['code'] = "200";
$output['status']['name'] = "ok";
$output['status']['description'] = "success";
$output['status']['returnedIn'] = (microtime(true) - $executionStartTime) / 1000 . " ms";
$output['data'] = [];
mysqli_close($conn);
echo json_encode($output);
?>
Я изменил маршрут на другой маршрут, и данные возвращаются при нажатии кнопки. Он должен вернуть ответ json, содержащий идентификатор местоположения и название местоположения, чтобы я мог затем использовать его для создания условия для проверки, а затем принять или отклонить. удаление
РЕДАКТИРОВАНИЕ Подтверждение ответа сети
Ответ Console.log Цифры разные, так как я нажал другой номер.
Проверьте журнал ошибок PHP на сервере, чтобы убедиться, что сценарий не работает.
Я добавил изображение к вопросу, оно возвращает 200 обратно, а также возвращает правильный идентификатор для кнопки, которую я нажимаю.
Где я могу проверить журнал ошибок PHP? - Извините, я все еще учусь этому...
Что вы видите на вкладке «Ответ»?
{"status":{"code":"200","name":"ok","description":"success","returnedIn":"1.6360282897949E-6 мс"},"data" :[]}
Все выглядит так, как будто все работает, но в ответ не приходит ничего, кроме пустого ответа.
Убедитесь, что на вкладке «Ответ» нет ничего лишнего до или после JSON.
Когда вы говорите «ничего не возвращает», вы имеете в виду, что весь console.info(result)
пуст или просто массив data:
пуст?
Этот JSON выглядит нормально. Мне кажется, что нет department.id = 1
Я добавил изображение вкладки ответа, там есть только это, если я console.info(result), он просто дает мне пустой массив/объект без какой-либо информации внутри него.
Одна вещь, которую я бы проверил, если вы говорите, что он возвращает правильные данные через прямой запрос, - это проверить тип данных id, ajax может передавать строку, а запрос может ожидать числа. вы можете отладить саму конечную точку php через postman/cURL и проверить конечную точку php, чтобы определить, является ли это php или клиентом
Он не пустой, в нем есть status:
, и он содержит все данные, которые вы указали выше.
@danielRICADO Символ i
в bind_param()
сообщает mysqli преобразовать его в целое число.
Я не вижу никаких проблем с кодом. Запрос просто возвращает пустой результат, что произойдет, если идентификатор отдела не существует в таблице.
@Barmar, ах, да, я это пропустил, но все же рекомендовал бы OP проверить конечную точку напрямую или также опубликовать детали запроса в вопросе.
только что проверил это, поскольку я знаю, что раньше мне приходилось скрывать, но только что проверил оба id: parseInt(id) и id: toString(id) и ни один из них не работает, просто не могу понять, почему, если я изменю маршрут PHP на другой я знаю, что работает, ответ возвращается нормально
Вы уверены, что включаете("config.php"); для другого маршрута то же самое (или это другая конфигурация?). Кроме того, что произойдет, если вы жестко запрограммируете правильный идентификатор в файле php, возвращающем пустые данные? Похоже, что база данных может быть другой.
не должны ли данные быть пустым массивом? $output['данные'] = []; разве вам не следует передавать результат запроса в данные?
Ах, хорошая мысль @danielRICADO
У меня есть несколько других маршрутов PHP, которые получают разную информацию, все они содержат один и тот же файл конфигурации и содержимое. Я скопировал содержимое другого файла, чтобы сделать этот, поэтому все одинаково, просто по какой-то причине возвращаемый массив содержит нет информации
@Alex, причина в том, что данным присваивается пустой массив, а затем они возвращаются. Вам необходимо присвоить результаты запроса свойству данных.
$output['data'] = $query->fetch_all()
Я пытался переключить это в файле на приведенный выше файл, но он выдает ошибку, один и тот же файл PHP используется в моем проекте несколько раз, и, похоже, возникла проблема с получением данных, это всего лишь один маршрут, который возвращает пустой массив.
Вы пробовали этот код $output["data"] = $query->get_result()->fetch_all();
...?
@danielRICADO и Бармер... Да, вы оба правы, я изменил это на предложенное, и это сработало, я не уверен, что я сделал, но мне каким-то образом удалось получить результат, показывающий пустой массив, и, как было предложено, как только я изменили его, чтобы вывести реальный результат, теперь он работает... Спасибо, ребята
@Barmar, вместо того, чтобы предлагать советы по решению проблем в комментариях, используйте свой молоток для обмана, чтобы ответы не публиковались, а ненужные страницы могли автоматически удаляться Roomba.
Вы объявляете элемент data
вашего выходного массива как пустой массив, но на самом деле вы никогда не помещаете в него данные, возвращаемые вашим запросом, поэтому вы получаете пустой результат.
Измените следующую строку:
$output['data'] = [];
К этому:
$output['data'] = $query->get_result()->fetch_all();
И вы должны получить нужные данные.
Когда вы проверяете вкладку «Сеть», что отображается для этого запроса ajax? Возвращает ли он код ответа 200 или что-то еще? Вы видите что-нибудь в необработанном ответе?