Пожалуйста, помогите мне разобраться с этим вопросом.
Форма (насколько я понимаю, роль submit-а исполняет ajax запрос):
<form action="html_post.php" method="post">
<textarea id="textarea" name="posting"> </textarea>
<input onclick="add_post()" class="button" type="button" name="send" value="Send">
</form>
И запрос:
function add_post() {
$.ajax({
type: 'POST',
url: "add_post.php",
data: {
content: $('#textarea').val()
}
});
}
Вот этим скриптом посты должны были бы добавляться в бд:
session_start();
$name = $_SESSION['name'];
$id = $_SESSION['id'];
if ((isset($_POST['send']))) {
if (strlen($_POST['posting']) >= 5) {
$post = htmlspecialchars($_POST['posting']);
$date = date("Y-m-d H:i:s");
$update = "INSERT INTO post(content, user_id, checked, date) VALUES('$post', '$id', 'true', '$date')";
mysqli_query($connection, $update);
echo json_encode(array('ok' => 'AJAX OK!!!'));
}
}
Дамп таблицы:
INSERT INTO post (post_id, user_id, content, checked, date)
VALUES (173, 15, ' first_post', 'false', '2017-12-25 02:01:24'),
(171, 15, ' second', 'false', '2017-12-25 02:00:56'),
(172, 15, ' why_it_does_not_work :c', 'false', '2017-12-25 02:01:13')
В логах нет ответа, и в базу ничего не добавляется, но запрос идет.
У меня еще нет полного понимания Ajax-а, поэтому буду неимоверно благодарна тем, кто подскажет как правильно написать этот код и/или объяснит, где здесь ошибка.
Простое взаимодействие с БД через драйвер mysqli [источник]:
// подключение к БД
$mysqli = new mysqli("example.com", "user", "password", "database");
// проверка соединения
if ($mysqli->connect_errno) {
echo "Не удалось подключиться к MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}
// выполнение запроса с присвоением его результата переменной для дальнейшей обработки
if ($result = $mysqli->query("INSERT INTO post(content, user_id, checked, date) VALUES('$post', '$id', 'true', '$date')") === TRUE) {
echo "Запись добавлена.\n";
}
// закрытие соединения
$mysqli->close();
Такая форма записи позволяет контролировать выполнение подключения к БД, выполнение запроса и возвращаемые данные.
Простой jQuery.AJAX запрос:
data = $("форма").serialize();
// наиболее простой и рабочий способ передавать данные форм ajax-запросом
// serialize() превращает объект формы в строчку вида query_string
// вида query_string (параметры get-запроса &name=value).
// name - атрибут name элемента формы, value - значение
$.ajax({
type : "post" // "get"
url : url,
data : data,
success : function(data){
console.info(data); // выведем в консоль ответ обработчика
// если файл(функция/класс/метод)-обработчик возвращает что-либо
// (echo/return/print etc.), это вернётся объектом data здесь.
// В вашем случае это строка в формате json
},
error: function(xhr){
console.error("Всё плохо: " + xhr.status + " " + xhr.statusText);
// в случае неудачного ajax-запроса объект xhr вернётся сюда со
// статусом запроса (ошибкой)
}
});
Такая форма записи позволяет контролировать выполнение AJAX.
Ваш обработчик должен выглядеть минимально так:
session_start();
$name = $_SESSION['name'];
$id = $_SESSION['id'];
$mysqli = new mysqli("example.com", "user", "password", "database");
if ($mysqli->connect_errno) {
echo "Не удалось подключиться к MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}
if ($result = $mysqli->query("INSERT INTO post(content, user_id, checked, date) VALUES('$post', '$id', 'true', '$date')") === TRUE) {
echo "Запись добавлена.\n";
}
if (isset($_POST['send'])) {
if (strlen($_POST['posting']) >= 5) {
$post = htmlspecialchars($_POST['posting']);
// тут у вас была ошибка, т.к. вы присваивали $post значение $_POST['posting']
// но передавали в обработчик $_POST['content']
$date = date("Y-m-d H:i:s");
$update = "INSERT INTO post(content, user_id, checked, date) VALUES('$post', '$id', 'true', '$date')";
mysqli_query($connection, $update);
echo json_encode(array('ok' => 'AJAX OK!!!'));
} else {
echo "Ошибка: Длина строки меньше 5ти символов.";
}
}
$mysqli->close();
data: {
content: $('#textarea').val()
}
В этой части кода, вы по сути определяете ключ глобальной переменной $_POST
. Поэтому на стороне сервера, принимайте с этим учетом - $_POST['content']
, а не $_POST['posting']
. Однако, вас это не устроит, т.к. кроме значения textarea
, как я могу видеть из вашего кода, вам нужно передавать и другие данные формы. В таком случае, можно использовать метод .serialize():
$.ajax({
type: 'POST',
url: "add_post.php",
data: $('form_selector').serialize()
});
Где form_selector - селектор вашей формы. Кроме того, нужно предотвращать выполнение события submit
, а иначе данные формы будут передаваться обычным способом: event.preventDefault()
или return false
Не знаком с mysqli_
но если не важно какой драйвер тогда попробуйте такой код для add_post.php:
if($_POST['posting'] && strlen($_POST['posting']) >= 5) {
$pdo = new PDO('mysql:host=localhost;dbname=database;charset=utf8','username','password');
$user_id = 15;
$post = htmlspecialchars($_POST['posting']);
$checked = 'false';
$date = date("Y-m-d H:i:s");
$stmt = $pdo->prepare('INSERT INTO post (user_id, content, checked, date) VALUES (?, ?, ?, ?)');
$stmt->execute(array($user_id, $post, $checked, $date));
}
Не забудьте вписать в строке $pdo = new PDO(...)
название своей базы, а также логин и пароль к ней
Если запустить данный файл, то он успешно добавляет данные в таблицу, проверил. Поэтому если у вас не заработает, значит проблема в чем то другом
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Ввод пользователя передаётся на сервер методом POST, затем обрабатывается функцией htmlspecialchars и отображается на сайтеhtmlspecialchars требует чтобы...
Задача склеить все "/", которые идут подряд и сделать редирект на правильный адресПодскажите, что не так?
(131) "unable to set private key file: 'privatekey' type PEM" в чем может быть ошибка в самом CURL, в сертификатах или в API к которому идет запрос?