& quot; Обнаружено нечисловое значение & quot; в запросе AJAX. Почему не фиксируются значения?

Использование AJAX для отправки информации о форме на страницу обработки php. Выполнение var_dump показывает, что значения поступают как «0», даже если введенные числа не являются. Даже если значения указаны как «(int)», PHP7 возвращает «Нечисловое значение, встречающееся в /process_measurements.php в строке 20».

Если я явно приведу их к типу следующим образом, ошибки PHP исчезнут, однако var_dump показывает, что они приходят как 0s … не значения, введенные в форму, поэтому результат вычисления равен 0, независимо от значений, введенных в форму.

$length = (int)$length;
$width = (int)$width;
$height = (int)$height;

Код в том виде, в котором он показывает ошибку «встречается не числовое значение»:

<?php
function is_ajax_request() {
return isset($_SERVER['HTTP_X_REQUESTED_WITH']) &&
$_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest';
}

(int)$length = isset($_POST['length']) ? (int) $_POST['length'] : '';
(int)$width = isset($_POST['width']) ? (int) $_POST['width'] : '';
(int)$height = isset($_POST['height']) ? (int) $_POST['height'] : '';

var_dump($length, $width, $height);

$volume = $length * $width * $height;

if(is_ajax_request()) {
echo $volume;
} else {
exit;
}
?>

HTML and JS for further clarification:

<div id="measurements">
<p>Enter measurements below to determine the total volume.</p>
<form id="measurement-form" action="process_measurements.php" method="POST">
Length: <input type="text" name="length" /><br />
<br />
Width: <input type="text" name="width" /><br />
<br />
Height: <input type="text" name="height" /><br />
<br />
<input id="html-submit" type="submit" value="Submit" />
<input id="ajax-submit" type="button" value="Ajax Submit" />
</form>
</div>

<script>
var result_div = document.getElementById("result");
var volume = document.getElementById("volume");

function postResult(value) {
volume.innerHTML = value;
result_div.style.display = 'block';
}

function clearResult() {
volume.innerHTML = '';
result_div.style.display = 'none';
}

// omits textareas, select-options, checkboxes, radio buttons
function gatherFormData(form) {
var inputs = form.getElementsByTagName('input');
var array = [];
for (i = 0; i < inputs.length; i++) {
var inputNameValue = inputs[i].name + '=' + inputs[i].value;
array.push(inputNameValue);
}
return array.join('&');
}

function calculateMeasurements() {
clearResult();

var form = document.getElementById("measurement-form");
var action = form.getAttribute("action");

// gather form data
var form_data = gatherFormData(form);

var xhr = new XMLHttpRequest();
xhr.open('POST', action, true);
// do not set content-type with FormData
//xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
xhr.onreadystatechange = function () {
if(xhr.readyState == 4 && xhr.status == 200) {
var result = xhr.responseText;
console.log('Result: ' + result);
postResult(result);
}
};
xhr.send(form_data);
}

var button = document.getElementById("ajax-submit");
button.addEventListener("click", calculateMeasurements);

</script>

0

Решение

Кажется, что вы должны раскомментировать следующее в вашем коде:

xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');

В противном случае кажется, что данные, отправленные с помощью POST, не анализируются правильно, как вы ожидаете.
По крайней мере, с этим заголовком $ _POST содержит необходимые данные.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]