Мои данные не вставляются в базу данных, я получаю пустой ответ из журнала консоли и сети. Я как бы потерял свой исходный код javascript, смешанный с другими ответами на переполнение стека, а также с моим кодом PHP.
<form id = "requestForm">
<input type = "text" name = "fName" id = "name">
<input type = "text" name = "fAddress" id = "address">
<input type = "text" name = "fComment" id = "comment">
<input type = "submit" value = "Submit" name = "nameSubmit">
</form>
<script>
document.querySelector('#requestForm').addEventListener('submit', postRequest);
function postRequest(e){
e.preventDefault();
const params = {
fName: document.querySelector('#name').value,
fAddress: document.querySelector('#address').value,
fComment: document.querySelector('#comment').value,
};
var xhr = new XMLHttpRequest();
xhr.open('POST', 'addRequest.php', true);
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xhr.onload = function(){
console.info(this.responseText);
}
xhr.send(params);
}
</script>
</body>
Вот код PHP:
require_once 'Database.php';
var_dump($_POST); // returns `array(0) {}`
if (isset($_POST['nameSubmit'])) {
var_dump($_POST); // shows no response
$r = $_POST['fName'];
$o = $_POST['fAddress'];
$p = $_POST['fComment'];
$query = "INSERT INTO user_request(name, address, comment) VALUES(?,?,?)";
$stmt = $db->prepare($query);
$insert = $stmt->execute([$r, $o, $p]);
if ($insert){
echo 'Success';
}else{
echo 'Error';
}
}
Я думаю, что $_POST['nameSubmit'] не определен, потому что вы не отправляете его на сервер, и поэтому код внутри оператора if никогда не выполняется. Что возвращает var_dump($_POST)?
Может ли это быть проблемой с параметрами как const?
Вы должны открыть отладчик браузера, сетевую панель и проверить, что происходит: проверьте, переданы ли параметры на страницу php, и проверьте результат на странице php
Нет определения параметров, поскольку const не является проблемой. Проблема в том, что TK говорит, что на сервер не передается переменная nameSubmit. Скорее всего, код php был взят из примера отправки формы, где кнопка отправки имела имя «nameSubmit».
var_dump($_POST) возвращает array(0) {}Где вы поставили эту строчку? Отредактируйте свой вопрос, используя то, что вы пробовали, и результат var_dump(), который вы можете написать в качестве комментария в своем коде.
Ставлю перед строкой if (isset) .. и когда ставлю после if (isset), ответа не показывает. Обновлено: отредактировать мой ответ в части PHP



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я считаю, что пост-параметр nameSubmit не существует.
Используйте функцию var_dump() для дампа всех $_POST
С моей точки зрения, единственным указанным параметром было
Почему бы вместо этого не проверить метод запроса?
Это лучше, чем проверять, существует ли переменная или нет.
Вы можете выполнить проверку необходимого параметра позже, когда убедитесь, что это запрос POST.
if ($_SERVER['REQUEST_METHOD'] === 'POST'){
// Do whatever you want when POST request came in
}
ОБНОВЛЕНИЕ:
Вот ответ, который вы хотели!
<form id = "requestForm">
<input type = "text" name = "fName" id = "name">
<input type = "text" name = "fAddress" id = "address">
<input type = "text" name = "fComment" id = "comment">
<button onclick = "sendData();" type = "button">Submit</button>
</form>
<div id = "testdiv"></div>
<script>
function sendData(){
var data = new FormData();
data.append('fName', document.getElementById("name").value);
data.append('fAddress', document.getElementById("address").value);
data.append('fComment', document.getElementById("comment").value);
var xhr = new XMLHttpRequest();
xhr.open('POST', 'test.php', true);
xhr.onload = function () {
if (xhr.status !== 200){
// Server does not return HTTP 200 (OK) response.
// Whatever you wanted to do when server responded with another code than 200 (OK)
return; // return is important because the code below is NOT executed if the response is other than HTTP 200 (OK)
}
// Whatever you wanted to do when server responded with HTTP 200 (OK)
// I've added a DIV with id of testdiv to show the result there
document.getElementById("testdiv").innerHTML = this.responseText;
};
xhr.send(data);
}
</script>
</body>
Код PHP:
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST'){
var_dump($_POST);
}else{
header('HTTP/1.0 403 Forbidden');
}
?>
Чтобы добавить еще одно поле, добавьте еще одну функцию data.append под data var.
На кнопку отправки ДОЛЖНЫ БЫТЬ НАЖАТЫ. Чтобы разрешить использование ввода, добавьте для него прослушиватель событий! .
Как это выглядит на моей стороне: https://image.ibb.co/gfSHZK/image.png
Надеюсь, это именно тот ответ, который вам нужен.
Просим разъяснений: почему это отклонено? ?
Я получаю сообщение об ошибке в PHP: Undefined index: fName, Uncaught PDOException: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'name' cannot be null in C:\xampp\htdocs и еще один C:\xampp\htdocs\: PDOStatement->execute(Array).
Привет, Вы пробовали сделать var_dump() на $_POST, как я упоминал выше?
@thisisnotwakanda, извините за мой предыдущий ответ. Я протестировал ваш код с помощью var_dump, и он возвращает пустой массив ... Пожалуйста, проверьте мой обновленный ответ, так как это определенно то, что вы ищете. (Проверено на localhost с PHP 7.1).
@thisisnotwakanda Просить разъяснений: Решена ли эта проблема?
@thisisnotwakanda Рад это слышать :), пожалуйста, проголосуйте за ответы, спасибо.
Две проблемы:
1.) Params не отправляются должным образом / вообще из-за отсутствия сериализация. Когда вы используете тип содержимого формы, ваш объект params должен быть в определенном формате name=value&name2=value2. Итак, чтобы облегчить это, вам нужно преобразовать свой объект, используя что-то вроде:
function getReadyToSend(object) {
var objList = [];
for (var prop in object) {
if (object.hasOwnProperty(prop)) {
objList.push(encodeURI(prop + '=' + object[prop]));
}
}
return objList.join("&");
}
Итак, ваша отправка становится: xhr.send(getReadyToSend(params));
2) Ваш php ожидает отправки кнопки отправки. if (isset($_POST['nameSubmit'])) {
У вас нет отправляемой переменной с именем nameSubmit, вы можете исправить это, включив ее или проверив, что каждая переменная установлена вместо нее. Я бы посоветовал последний способ обработать ошибку, если 1 или более не переданы.
Предложение: обновите загрузку, чтобы проверить статус:
if (xhr.status === 200)
{
console.info(xhr.responseText);
}
else if (xhr.status !== 200)
{
console.info('Request failed. Returned status of ', xhr.status);
}
Пример скрипки: http://jsfiddle.net/qofrhemp/1/, откройте вкладку сети и проверьте вызов, теперь вы увидите параметры в данных формы для вызова, который запускается при нажатии кнопки submit.
Разве я не включил nameSubmit, когда ставил вот так? <input type = "submit" value = "Submit" name = "nameSubmit">. Спасибо за ваш вклад, сэр, ваше решение кажется мне продвинутым, но пока я приму ответ @ PlanetCloud и обязательно попробую ваше решение позже.
Вы выполняете вызов ajax, а не отправку формы. Это не в вашем списке параметров, который вы явно отправляете на сервер.
Сначала вам нужно вызвать в
prepare()