Пожалуйста, помогите мне разобраться с этим вопросом.
Форма (насколько я понимаю, роль 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(...) название своей базы, а также логин и пароль к ней
Если запустить данный файл, то он успешно добавляет данные в таблицу, проверил. Поэтому если у вас не заработает, значит проблема в чем то другом
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости