AJAX, добавление данных в бд и их вывод

503
26 декабря 2017, 18:15

Пожалуйста, помогите мне разобраться с этим вопросом.

Форма (насколько я понимаю, роль 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-а, поэтому буду неимоверно благодарна тем, кто подскажет как правильно написать этот код и/или объяснит, где здесь ошибка.

Answer 1

Простое взаимодействие с БД через драйвер 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();
Answer 2
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

Answer 3

Не знаком с 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(...) название своей базы, а также логин и пароль к ней

Если запустить данный файл, то он успешно добавляет данные в таблицу, проверил. Поэтому если у вас не заработает, значит проблема в чем то другом

READ ALSO
удаление пробела в php

удаление пробела в php

я загружаю данные из xml в базу SQL

185
В какой момент задаётся кодировка ввода пользователя?

В какой момент задаётся кодировка ввода пользователя?

Ввод пользователя передаётся на сервер методом POST, затем обрабатывается функцией htmlspecialchars и отображается на сайтеhtmlspecialchars требует чтобы...

219
php склеить два &ldquo;/&rdquo; в url странице

php склеить два “/” в url странице

Задача склеить все "/", которые идут подряд и сделать редирект на правильный адресПодскажите, что не так?

194
CURL ошибка (131) &ldquo;unable to set private key file: &#39;private.key&#39; type PEM&rdquo;

CURL ошибка (131) “unable to set private key file: 'private.key' type PEM”

(131) "unable to set private key file: 'privatekey' type PEM" в чем может быть ошибка в самом CURL, в сертификатах или в API к которому идет запрос?

217