Так что это связано с проблемой вчера, которая быстро вышла из-под контроля, поскольку ошибки были необычными. Эта проблема все еще существует, но вопрос здесь был приостановлен, и меня попросили реформировать новый вопрос, который теперь относится к текущей проблеме. Итак, идем.
Проблема носит базовый характер. Если вы вчера помогали, я переключился с $ .post на пост $ .ajax, чтобы доставить переменную в мой PHP
файл. Однако мой PHP
файл, похоже, никогда не получает эту переменную, заявляя, что индекс «неопределен».
Теперь это обычно означает, что переменная не имеет значения, названа неправильно или отправлена неправильно. Ну, после целого дня беспорядка с этим (убей меня), я до сих пор не вижу причин, по которым мой PHP
файл не должен получать эти данные. Поскольку я довольно новичок в этом, я действительно надеюсь, что кто-то может заметить очевидную ошибку или рекомендовать другое возможное решение.
Вот код
JQuery
$('#projects').click(function (e) { alert(aid); $.ajax({ url:'core/functions/projects.php', type: 'post', data: {'aid' : aid}, done: function(data) { // this is for testing } }).fail (function() { alert('error'); }).always(function(data) { alert(data); $('#home_div').hide(); $('#pcd').fadeIn(1000); $('#project_table').html(data); }); });
PHP
<?php include "$_SERVER[DOCUMENT_ROOT]/TrakFlex/core/init.php"; if(isset($_POST['aid'])) { $aid = $_POST['aid']; try { $query_projectInfo = $db->prepare(" SELECT projects.account_id, projects.project_name, projects.pm, //..irrelevant code FROM projects WHERE account_id = ? "); $query_projectInfo->bindValue(1, $aid, PDO::PARAM_STR); $query_projectInfo->execute(); $count = $query_projectInfo->rowCount(); if ($count > 0) { echo "<table class='contentTable'>"; echo "<th class='content_th'>" . "Job #" . "</th>"; echo "<th class='content_th'>" . "Project Name" . "</th>"; //..irrelevant code while ($row = $query_projectInfo->fetch(PDO::FETCH_ASSOC)) { echo "<tr>"; echo "<td class='content_td'>" . "<a href='#'>" . $row['account_id'] . "</a>" . "</td>"; echo "<td class='content_td'>" . $row['project_name'] . "</td>"; //..irrelevant code echo "</tr>"; } echo "</table>"; } } catch(PDOException $e) { die($e->getMessage()); } } else { echo 'could not load projects table'; } ?>
Когда я запускаю этот код, нажимая '#projects', я получаю 2 предупреждения. Это первое предупреждение говорит «6», которое является значением переменной «помощь» и ожидается. Второе предупреждение пустое.
Теперь вот где я запутался. Если сообщение отправляется со значением 6. Не установлено ли значение $ _POST ['aid']? Также, если это правда, мой код не должен выполнять часть моего условного оператора if
а не my else
. В любом случае это кажется мне странным. Должен ли я получить что-то обратно из моего PHP
файла?
Так что в Firebug мы доверяем, не так ли? Если я открою Firebug и пройду через это
Firebug -> POST projects.php -> XHR -> POST(tab) ->
Я вижу 6 в окне «Параметр» и «6» в окне «Источник». Затем, если я нажимаю вкладки «Ответ» и «HTML», они оба не имеют значения.
Так или иначе, эта стена текста – моя проблема. Опять же, я действительно надеюсь, что кто-то может помочь мне здесь. Мне бы больше не хотелось тратить время на то, что должно быть простым решением.
РЕДАКТИРОВАТЬ
Если я изменю свой php-файл, чтобы выглядеть так
<?php if(isset($_POST['aid'])) { $aid = $_POST['aid']; echo $aid; } else { echo 'fail'; }
Ответ теперь «6»! Ура! Мы сделали прорыв! Теперь почему он не будет загружать мою таблицу, которая будет получена из моего запроса?
сторона должна быть отмечена первоначально, если я заберу
if(isset($_POST['aid'])){ //all my code } else { //response }
и просто скопируйте переменную $ help, подобную этой
$aid = '6';
Затем запустите файл PHP
напрямую, запрос будет успешным, и страница загрузит таблицу динамически.
Также в ответ на один из ответов, в которых мне предлагается использовать
$('#projects').click(function (e) { alert(aid); $.ajax({ url:'core/functions/projects.php', type: 'post', data: aid, success: function(data) { // this is for testing } }).error (function() { alert('error'); }).complete (function(data) { alert(data); $('#home_div').hide(); $('#pcd').fadeIn(1000); $('#project_table').html(data); }); });
Я использовал это, но я использую jQuery v1.10.2, и в соответствии с этим эти методы устарели или будут устаревшими. В любом случае это привело к разнице в результатах.
В любом случае вопрос сейчас. Почему это, если я использовал простую версию, я возвращаю обратно свою переменную $ help '6'. Однако, когда я пытаюсь выполнить свой запрос, я ничего не получаю. Также, пожалуйста, попробуйте вспомнить, если я жестко код 6, таблица создает.
Я думаю, что это может быть ошибка:
data: aid,
должен быть
data: {'aid':aid},
Это даст метку $ _POST ['aid'] и значение, которое вы ищете на своей php-странице.
РЕДАКТИРОВАТЬ:
Если у вас возникли проблемы с этим, я бы упростил его для тестирования, основные причины таких вещей, которые не работают в моем опыте:
он не доходит до файла
он достигает файла, но файл ожидает чего-то другого, чем он получает, и из-за структур управления он ничего не возвращает
он достигает файла с правильными данными, но есть и другие ошибки в файле php, которые мешают ему когда-либо возвращать его.
Вы можете легко исключить каждый из них в своем случае.
Параметр данных jQuery для метода ajax должен быть объектом, например {'aid': aid}
. Я думаю, это твоя проблема. Я также заметил, что у вашего всегда метода отсутствует параметр для данных.
Если вы сейчас правильно публикуете данные, проблема может быть на вашей странице PHP? Включить init.php не удалось изменить значение $ _POST ['aid'] не так ли?
Я не уверен, что это должно вести себя так, как правило, вы делаете так:
$.ajax({ //... }) .done(function(data){ //... });
Просто сделайте это так:
var fetch = true; var url = 'someurl.php'; $.ajax( { // Post the variable fetch to url. type : 'post', url : url, dataType : 'json', // expected returned data format. data : { 'aid' : aid }, success : function(data) { // This happens AFTER the backend has returned an JSON array (or other object type) var res1, res2; for(var i = 0; i < data.length; i++) { // Parse through the JSON array which was returned. // A proper error handling should be added here (check if // everything went successful or not) res1 = data[i].res1; res2 = data[i].res2; // Do something with the returned data } }, complete : function(data) { // do something, not critical. } });
Вы можете добавить часть сбоя, если хотите. Это, во всяком случае, гарантировано. Я просто недостаточно знаком с сделанным, чтобы сделать больше комментариев об этом.
Пытаться
include "{$_SERVER['DOCUMENT_ROOT']}/TrakFlex/core/init.php";
вместо этого команда $ _SERVER [DOCUMENT_ROOT] witout не будет работать. Когда вы используете массив в строке, вам нужны эти скобки.