Не удается получить значение из post-запроса с помощью ajax

#javascript #php #ajax

#javascript #php #ajax

Вопрос:

Я только что написал свой первый Ajax-запрос, но он не работает. Его необходимо обновить, когда выбрано новое значение в раскрывающемся списке.

Это мой код javascript:

 $(document).ready(function() {
function ajaxLoaded(response) {
    $('#performanceResults').html(response);
}
function doRequest() {
    $.ajax({
        url: "results.php",
        type: 'POST',
        success: ajaxLoaded
    });
}
$('#performance').change(doRequest);
});
 

и вот как я извлекаю часть q (которая не работает):

 public function getResults() {
    $intCase = intval ( $_POST ['q'] );

    var_dump ( $intCase );

    if ($intCase == 1 or $intCase == 2 ) {
        if ($intCase == 1) {
            $strSql = 'select bidder_id, won, lost, fillrate, costs, cost_auction from result_bidder where tagload = ( select max(tagload) from result_bidder) order by cost_auction asc limit 1';
        }
        if ($intCase == 2) {
            $strSql = 'select bidder_id, won, lost, fillrate, costs, cost_auction from result_bidder where tagload = ( select max( tagload ) from result_bidder ) order by fillrate asc limit 1';
        }

        $arrBestPerformer = $objDatabase->queryresult ( $strSql );
        echo "<table border='1'>
        <tr>
        <th>bidder_id</th>
        <th>won</th>
        <th>lost</th>
        <th>fillrate</th>
        <th>costs</th>
        <th>cost_auction</th>
        </tr>";

        while ( $row = mysqli_fetch_array ( $arrBestPerformer ) ) {
            echo "<tr>";
            echo "<td>" . $row ['bidder_id'] . "</td>";
            echo "<td>" . $row ['won'] . "</td>";
            echo "<td>" . $row ['lost'] . "</td>";
            echo "<td>" . $row ['fillrate'] . "</td>";
            echo "<td>" . $row ['costs'] . "</td>";
            echo "<td>" . $row ['cost_auction'] . "</td>";
            echo "</tr>";
        }
        echo "</table>";
    }
}
 

Моя Форма:
общедоступная функция SelectPerformanceIndicator() {

   $this->getResults ();

  $str = '<form >';
  $str .= 'Select your performance indicator<br>';
  $str .= '<select id = "performance">';
  $str .= '<option value = "">Select Performance Indicator</option>';
  $str .= '<option value = "1">Cost per auction  </option>';
  $str .= '<option value = "2">Fillrate </option>';
  $str .= '</select>';
  $str .= '</form>';
  $str .= '<br>';
  $str .= '<div id="performanceResults">';

  return $str;
}
 

Комментарии:

1. просто echo $_POST[‘q’]; Вы ничего не возвращаете прямо сейчас

2. Является ли этот 1 вкладыш вашим полным PHP-скриптом?

3. @GaijinJim я знаю. Как мне вернуть значения с помощью Ajax?

4. @TiMESPLiNTER Нет, это не так. После этого появляется только форма и оператор mysql. Ничего особенного.

5. Или попробуйте JS-фреймворк, например, jQuery он поможет вам писать совместимые с кроссбраузерными JS и абстрактные AJAX-запросы на очень высоком уровне. Таким образом, вы можете убедиться, что ваш AJAX-запрос работает. Вероятно, ваш var in JS просто пуст, когда вы его отправляете?

Ответ №1:

Ваша проблема в том, что ваша строка данных POST недопустима.

 xmlhttp.send("q ="   str);
 

Должно быть

 xmlhttp.send("q="   str);
 

Без пробела между q и = .

И вы пропустили отправку заголовка, чтобы сообщить PHP, что он должен сопоставить данные, отправленные с запросом, с $_POST переменной.

 xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
 

Итак, ваша правильная функция будет:

 function showUser(str) {
    if (str=="") {
        document.getElementById("performance").innerHTML="";
        return;
    } 
    if (window.XMLHttpRequest) {
        xmlhttp=new XMLHttpRequest();
    } else { 
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.onreadystatechange=function() {
        if (xmlhttp.readyState==4 amp;amp; xmlhttp.status==200) {
            document.getElementById("performance").innerHTML=xmlhttp.responseText;
        }
    }
    xmlhttp.open("POST","results.php",true);
    xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    xmlhttp.send("q="   str);
}
 

Но опять же: используйте jQuery для выполнения ваших AJAX-запросов. Если вы используете jQuery, вам больше не нужно бороться с подобными ошибками.

Комментарии:

1. Исправлено, но оно по-прежнему не работает. Спасибо, что заметили эту ошибку!

2. Опять же: используйте jQuery для обработки ваших AJAX-запросов. Это намного проще и совместимо с кроссбраузерными. Смотрите здесь, как AJAX работает с jQuery

3. Спасибо за ваш обновленный ответ. Я исправил это в части заголовка, но он по-прежнему не работает. Поможет ли это, если я опубликую функции php?

4. Было бы полезно, если бы вы использовали jQuery для выполнения AJAX-задач!

5. Используется jQuery. Но теперь он вызывает мой интерфейс два раза вместо того, чтобы просто показывать таблицу.

Ответ №2:

Вы добавили пробел в строку запроса, "q =" это не ведет себя как q ключ в $_POST переменной, удалите пробел между key и =

 xmlhttp.send("q ="   str);
 

Для

 xmlhttp.send("q="   str);
 

Обновить ответ: AJax POST будет работать, когда запрос будет иметь Content-type: application/x-www-form-urlencoded заголовок.
пожалуйста, добавьте заголовок перед send методом

 xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
 

OR
вы можете отправить запрос GET методом без заголовка

Комментарии:

1. Исправлено, но оно по-прежнему не работает. Спасибо, что заметили эту ошибку!