Задать вопрос
@holllop

Как сформировать AJAX запрос для базы данных?

У меня есть страница с таблицей и кнопкой, которая вызывает форму.
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Mine_contract</title>
    <link href="new.css" rel="stylesheet"/>
    <script src="script.js" defer></script>
</head>
<body>
    <?php
    print("v 0.0.22\n");
    include 'perem.php'; <!--подключаю БД? -->
    ?>
    <table id="m_info">
        <tr>
            <th>№ п/п</th>
            <th>Номер</th>
            <th>Название</th>
            <th>Адрес</th>
            <th>ФИО директора</th>
            <th>Номер телефона директора</th>
        </tr>
        <tr>
            <td><p>1</p></td>
            <td><p>1</p></td>
            <td><p>Пример названия</p></td>
            <td><p>Пример адреса</p></td>
            <td><p>ФИО директора</p></td>
            <td><p>+79490000000</p></td>
        </tr>
    </table>
    <div class="popup">
        <div class="popup__container">
            <div class="popup__wrapper">
                <div id="wrapper">
                    <form action="perem.php" method="POST" class="form">
                    <button class="exit" class="exit" id="closeButton" onclick="delRow()">х</button>
                    <div class="string">
                        <label for="id">№ П/П:</label>
                        <input type="number" id="id" name="id" required>
                    </div>
                    <div class="string">
                        <label for="N_m">Номер :</label>
                        <input type="text" id="N_m" name="n_m" placeholder="Например" required>
                    </div>
                    <div class="string">
                        <label for="name">Название:</label>
                        <input type="text" id="name" name="name_m" placeholder="Например " required>
                    </div>
                    <div class="string">
                        <label for="Adr">Адрес:</label>
                        <input type="text" id="Adr" name="Adr_m" placeholder="Например г.Название города, р.Район, ул.Улица">
                    </div>
                    <div class="string">
                        <label for="Full_name">ФИО директора :</label>
                        <input type="text" id="Full_name" name="director" placeholder="Например Иванов Иван Иванович" required>
                    </div>
                    <div class="string">
                        <label for="Phone">Номер телефона :</label>
                        <input type="tel" id="Phone" name="Phone_number" placeholder="Например +00000000000" required>
                    </div>
                        <button type="submit" id="contact" value="Отправить в БД">
                    </form>
                </div>
            </div> 
        </div>
    </div>       
    <button id="button" class="button" onclick="addRow()">Открыть форму</button>
</body>
</html>

Форма вызывается при помощи JS.
const button = document.querySelector('#button');
const closeButton = document.querySelector('#closeButton');
const form = document.querySelector('.form');
const popup = document.querySelector('.popup');

button.addEventListener('click', () => {
  form.classList.add('open');
  popup.classList.add('popup_open');
});

closeButton.addEventListener('click', () => {
  form.classList.remove('open');
  popup.classList.remove('popup_open');
});

Так же у меня есть база данных на PostgreSQL (как раз таки она и находиться в perem.php)
<?php
$host='мои данные';
$db = 'мои данные';
$username = 'мои данные';
$password = 'мои данные';
 
# Создаем соединение с базой PostgreSQL с указанными выше параметрами
$dsn = "pgsql:host=$host; port=5432; dbname=$db; user=$username; password=$password";
try{
$conn = new PDO($dsn);
if($conn){

# Выполняем запрос на создание таблиц
$psql = "CREATE TABLE IF NOT EXISTS mine_info ();
ALTER TABLE mine_info ADD IF NOT EXISTS id_k1 integer PRIMARY KEY;
ALTER TABLE mine_info ADD IF NOT EXISTS N_mi varchar(20) NOT NULL;
ALTER TABLE mine_info ADD IF NOT EXISTS name_m text NOT NULL;
ALTER TABLE mine_info ADD IF NOT EXISTS address varchar(70) NOT NULL;
ALTER TABLE mine_info ADD IF NOT EXISTS full_name_of_director text NOT NULL;
ALTER TABLE mine_info ADD IF NOT EXISTS phone_number varchar(30) NOT NULL;";

$conn->exec($psql);
# Сделаем запрос на получение списка созданных таблиц
 
$res = $conn->query("select table_name, column_name from information_schema.columns where table_schema='public'");
}
}catch (PDOException $e){
echo $e->getMessage();
}
?>

Данные в таблице SQL есть.
Я не понимаю как сделать, чтобы при нажатии кнопки "Отправить в БД" данные записывались в БД и выводились в виде новой строки уже существующей таблицы. Я прочитал, что для этого нужно сделать AJAX запрос, но я не понимаю как его сделать (и нужно ли вообще, может не то читал).
  • Вопрос задан
  • 1236 просмотров
Подписаться 1 Средний 7 комментариев
Решения вопроса 1
@holllop Автор вопроса
Вот так:
const button = document.querySelector('#button');
const closeButton = document.querySelector('#closeButton');
const form = document.querySelector('.form');
const popup = document.querySelector('.popup');
const table = document.getElementById('mine_info');

button.addEventListener('click', () => {
  openForm();
});//вызов функции открытия формы

closeButton.addEventListener('click', () => {
  closeForm();
});//вызов функции закрытия формы

const httpRequest = (url, options) => {
  return fetch(url, options)
    .then(response => response.json())
    .then(console.log)
    .catch(console.error);
};

const postOptions = {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  }
};//тело Post-запрос

const getOptions = {
  method: 'GET',
  headers: {
    'Content-Type': 'application/json',
  }
};//тело Get-запрос

const postRequest = data => {
  return httpRequest('http://данные:3000/mine_info', {
    ...postOptions,
    body: JSON.stringify(data)
  });
};//указания при POST-запросе

const getRequest = () => {
  return fetch('http://данные:3000/mine_info', getOptions)
    .then(response => response.json())
    .then(data => {
      updateTable(data);
    })
    .catch(console.error);
};//указания при GET-запросе

const updateTable = data => {
  data.forEach(item => {
    const newRow = document.createElement("tr");
    for (let key in item) {
      const newCell = document.createElement("td");
      newCell.textContent = item[key];
      newRow.appendChild(newCell);
    }
    table.appendChild(newRow);
  });
};//создание константы, где будет происходить действия с таблицей

window.onload = function() {
  getRequest();
};//для того чтобы при загрузке страницы происходил GET-запрос

const openForm = () => {
  form.classList.add('open');
  popup.classList.add('popup_open');
};//функция открытия формы

const closeForm = () => {
  form.classList.remove('open');
  popup.classList.remove('popup_open');
};//функция закрытия формы

const formHandler = (e) => {
  e.preventDefault();
  const data = Object.fromEntries(new FormData(e.target).entries());
  postRequest(data)
    .then(() => {
      closeForm();
      location.reload();
    })
    .catch(console.error);
};//отправка данных из формы

form.addEventListener('submit', formHandler);

А JSON формируется благодаря Node.js
const Pool = require('pg').Pool
const pool = new Pool({
  user: '',
  host: '',
  database: '',
  password: '',
  port: 5432,
})//Данные для подключения к БД

const getMineinfo = (request, response) => {
    pool.query('SELECT * FROM mine_info', (error, results) => {
       if (error) {
         throw error
    }
    response.status(200).json(results.rows)
     })
}//Создание константы getMineinfo, где вызывается SQL-команду "SELECT", для того чтобы взять данные из БД 

const createRow = (request, response) => {
    const { id_k1, n_mine, name_mine, adress, full_name_of_direcor, phone_number } = request.body
  
    pool.query('INSERT INTO mine_info (id_k1, n_mine, name_mine, adress, full_name_of_direcor, phone_number) VALUES ($1, $2, $3, $4, $5, $6) RETURNING *', [id_k1, n_mine, name_mine, adress, full_name_of_direcor, phone_number], (error, results) => {
      if (error) {
        throw error
      }
      response.status(201).send(`User added with ID: ${results.rows[0].id}`)
    })
  }//Создание константы createRow, где вызываеться SQL-команда "INSERT INTO", для взятия информации из формы и записи её в БД 

module.exports = {
    getMineinfo,
    createRow,
}//Берём из файла.js файла

//файл.js
const express = require('express')
const bodyParser = require('body-parser')
const cors = require('cors')
const db = require('./queries')
const app = express()
const port = 3000

app.use(bodyParser.json())
app.use(
 bodyParser.urlencoded({
    extended: true,
  })
)

app.get('/', (request, response) => {
    response.json({ info: 'Node.js, Express, and Postgres API' })
})

app.use(cors())

app.get('/mine_info', db.getMineinfo)
app.post('/mine_info', db.createRow)

app.listen(port, () => {
    console.log(`App running on port ${port}.`
)})
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
Для начала надо научиться делать без всякого аякса и яваскрипта. А освоить базовые приемы работы с РНР.
Сейчас же у вас дурацкий вопрос вида "как мне затонировать стекла в машине?" при том что сама машина - это помесь телеги с влосипедом, причем педали крутятся в обратную сторону.

Сначала надо добавить одну запись в БД руками.
Потом так же в БД учиться писать запрос SELECT
потом учиться выполнять SQL запросы в РНР.
потом учиться получать результат SQL запроса в массив.
потом учиться выводить многомерный массив
потом учиться выводить многомерный массив в виде требуемого HTML, чтобы получить свою таблицу
после этого можно сесть и отдохнуть.

И после хорошего отдыха начать учиться работать с формами в HTML
и как их обрабатывать в РНР
написав в итоге код для добавления данных формы в БД

и только после этого, если силы останутся, навешивать рюшечки в виде запроса и обновления аяксом
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы