Как запустить JS из PHP без загрузки страницы

192
14 ноября 2019, 23:50

Имеется следующая архитектура проекта:

  1. form.php - формирует страницу с формой, форма работает без submit, данные передаются через ajax.
  2. db.php - работает с БД, обрабатывает всякую мудреную логику

В файле db.php в процессе выполнения логики должны инициализироваться сообщения для пользователя, но без перезагрузки формы form.php.

Как это сделать?

Как инициализировать запуск JS c alert? А еще лучше bootstrap alert? Как передать в этот JS значение переменой с текстом сообщения?

Ниже часть кода:

<?php
    session_start();
    header('Content-Type: application/json;charset=utf-8');
    require_once("db_connection.php");
    require_once("query_lib.php");
    echo 'TECT ХХХХХХХХХХХХХХХХХХХ';
    $docvalues = json_decode(stripslashes($_POST['formresult']), true);
    if(isset($docvalues['docclass'])){   // проверяем устанволен ли тип документа (для корректировки)
        $corr_doc_id = $docvalues['fixedItem']['property_fix2'];
        $current_doc_fixed_items = serch_corrected_docs ($corr_doc_id, $connection); // получаем последнюю действующую запись документа
        if ($current_doc_fixed_items == false) {      //если запрос по id документа не нашел документа (или использовался id нового документа, или не найден)
            $message = array('message' => 'ID документа не найден, попробуйте его изменить') ;
            echo json_encode($message);
            return $current_doc_fixed_items;
        }
Answer 1
  1. Про AJAX. Исходя из вашего вопроса и прочитанных комментариев у меня сложилось впечатление, что вы не совсем понимаете, что такое ajax. Ajax это просто запрос к серверу. Простыми словами вы просто обращаетесь к файлу, например db.php тем самым заставляя его выполниться на сервере точно так же, как если бы вы обратились, например через адресную строку. Просто обращаетесь. В зависимости от логики и переданных данных, например через POST, ваш скрипт db.php может выдавать разные результаты. Соответственно, если в ходе выполнения скрипта есть команда вывода, например echo, то и в ответе вы увидите, то что выведет эта команда.
  2. Про вашу страницу (html). Так как я не смог увидеть ваш супер секретный код html формы (вход,регистрация), то прикладываю небольшой пример (bootstrap):

<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"> 
<form class="m-3"> 
  <div class="form-group"> 
    <label for="exampleInputEmail1">Email address</label> 
    <input name="email" type="email" class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp" placeholder="Enter email"> 
    <small id="emailHelp" class="form-text text-muted">We'll never share your email with anyone else.</small> 
  </div> 
  <div class="form-group"> 
    <label for="exampleInputPassword1">Password</label> 
    <input name="password" type="password" class="form-control" id="exampleInputPassword1" placeholder="Password"> 
  </div> 
  <div class="btn btn-primary check-login">Submit</div> 
</form>

  1. Далее, чтобы передать на сервер данные введённые в поля формы вешаем событие на div с классом check-login (наша кнопка). При клике по кнопке собираем данные с полей и отправляем на сервер. Алгоритм, сбор и последующие действия по манипуляции с элементом form кладу на ваши плечи. Запрос отправляете на файл db.php. Можно всё сложить в переменную и отправить в формате json или отправить значение каждого поля отдельно, например по имени поля.
  2. Про файл db.php. Наверно, ваш ajax запрос будет реализован (передавать данные) по методу POST и в формате json. И если это так, то ваши данные можно вытащить так: $_POST['auth-data'] (произвольное название, вы использовать своё). Если вы отправили ваши данные по именам полей ввода, то принять их можно так: $_POST['email'], $_POST['password']. Обработку данных опущу. Далее вы формируете ответ. Тут вам надо определиться, какой тип данных вам отправлять? Лучше всего отправлять так же json. Формируете массив, например $request = [], в котором первый элемент хранит строку с информацией успех/провал, второй элемент, так же массив с сообщениями об успехах, и третий с сообщениями о неудачах (провалах). И там где вы выводили данные через echo, теперь добавляйте в массив. В конце скрипта конвертируете получившийся массив в json php функцией и выводите командой echo. ВЫВОД ДОЛЖЕН БЫТЬ ВСЕГО ОДИН РАЗ! Как сказал, @Mike, установите заголовок header('Content-Type: application/json;charset=utf-8');.
  3. В ответе вы получите строку форма json. Декодируйте её в массив. Потом, анализируя (перебирая элементы) можно понять как показать ответ пользователю, и нужно ли показывать его. На странице компонентов есть подробная инструкция.

Удачи!

Answer 2

Итак резюмирую, поскольку я ранее не смог найти в сети понятное объяснение ответа на мой вопрос. Из JS вызывается ajax выполнение php файла:

$.ajax({
    type: "POST",
    url: "../php/db.php", // запускаем выполнение php-файла
    data: data_sent_to_php, // передаем в php-файл данные для обработки
    success: function(data){alert(data['message'])}; // выводим ответ php-файла которые он передает в п.2 
});         

Чтобы php файл отправил нам обратно нужные данные необходимо вставить в нем следующий код:

$message = array('message' => 'Ваше сообщение') ;    
echo json_encode($message);
READ ALSO
A non-numeric value encountered

A non-numeric value encountered

Нужно проверить каждый бит символа для вывода его битового представленияНо появляется куча ошибок A non-numeric value encountered, хотя я проверяю всего...

153
Как оформить страницу ошибки 404

Как оформить страницу ошибки 404

У меня есть сайт, зеркало другого сайта

183
Два связанных &lt;select&gt; без js. Возможно ли?

Два связанных <select> без js. Возможно ли?

У меня есть сейчас список <select>, который функционирует для вывода таблиц с информациейНужен ещё , который будет списком ников

167