За последние 24 часа нас посетил 22821 программист и 1270 роботов. Сейчас ищут 774 программиста ...

Проблема с POST запросом AJAX на PHP

Тема в разделе "Прочие вопросы по PHP", создана пользователем Джон Титор, 13 авг 2021.

Метки:
  1. Джон Титор

    Джон Титор Новичок

    С нами с:
    13 авг 2021
    Сообщения:
    7
    Симпатии:
    0
    Здравствуйте, я новичок, около полугода изучаю PHP, знакомые попросили написать для них веб-приложение и в процессе разработки столкнулся с проблемой, я хочу внедрить AJAX для динамики но он не работает с моим кодом, я реализовал регистрацию пользователя на основе библиотеке redbean и все запросы на сервер делаю с её помощью, вот как у меня всё устроено:

    • connect.php подключение к базе к библиотеке redbean и запуск сессии
    • index.php собирает все элементы воедино, то есть подключает connect.php проверяет авторизирован ли пользователь если да подключает файл меню.

    Есть файлы с логикой приложения которые сами по себе отрабатывают нормально (то есть если перейти непосредственно на сам файл.php), к примеру вывод списка всех пассажиров из БД если зайти на сам файл выводи пользователей и рисует необходимый html, но когда я пытаюсь получить результат его работы с помощью AJAX то получаю 500 ошибку.

    Я хочу при нажатии на кнопку в меню, результат работы файла вывести в теге <section> на текущей странице, причем если я убираю свой код и пишу произвольный код который не связывается с БД то все работает.

    Предполагаю что проблема в том каким образом AJAX производит запрос, не уверен как это описать так как очень слаб в теории простите, думал что он выпадает из сессии на текущей странице и из-за этого не может получить данные в файле так как в нём тоже стоит проверка на авторизацию (банальный if с проверкой есть ли что-то в сессионной переменной logged) убрал проверку но ничего не вышло так же пробовал подключить connect.php в файле но тоже не получил результата, значит, наверное, проблема в файле connect.php или в том как я организовал структуру в документах но убей Бог не пойму что не так ...(тупой)

    Прошу помочь советом, если требуется выложу дополнительную информацию только скажите какую. Спасибо.
     
  2. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Смешались в кучу кони, люди... Можно сделать файл setup, init и т.п. с определенной в нем одноименной ф-цией. Потом отдельно подключать файл и вызывать ф-цию.

    Советую использовать единую точку входа. Что касается ошибки, в общем не должно быть разницы, если вы сами не подложили себе свинью, например используете бесплатный хостинг с подобными ограничениями или используете кроссдоменные запросы. Конечно, ответы лучше делать различными в зависимости от того, как происходит обращение к вашим «файлам». При обычных (не AJAX-) запросах лучше выдавать полный код страницы или накрайняк «подложку» с последующей AJAX-дозагрузкой содержимого (накрайняк потому что у многих ПС до сих пор имеются проблемы с распознаванием контента на таких страницах).

    Это странно, поэтому лучше сразу в виде кода. Может, вы не понимаете каких-то фундаментальных вещей. Например, вот это уже звучит странно:
    Не, сессионная кука должна передаваться и в AJAX-запросах, если сами не ограничили ее область действия и т.п.
     
  3. Джон Титор

    Джон Титор Новичок

    С нами с:
    13 авг 2021
    Сообщения:
    7
    Симпатии:
    0
    Здравствуйте,

    Вы наверное будете кричать но она скорее всего сессионная так как при авторизации я создаю переменную типа $_SESSION['logged'] и передаю в неё объект пользователя после чего просто проверяю есть ли совпадение в базе с $_SESSION['logged']->login (делал по видеоуроку не ругайте сильно каюсь...)

    вот так посылаю запрос к примеру:
    Код (Javascript):
    1. $(document).ready(function(){
    2.         $('a.klient').on('click',function(){
    3.             $.ajax({
    4.                 url: 'inc/elements/clients.php',
    5.                 success: function(data){
    6.                     document.querySelector('.tm-content').innerHTML = data;
    7.                 }
    8.             });
    9.         })
    10.     })
    Если в clients.php прописать что то такое:
    PHP:
    1. $sum = 25 + 11;
    2. echo '<h1>'.$sum.'h1'
    то все отрабатывает.

    Но с моим кодом не срабатывает:
    PHP:
    1. <section class="table-wrapper table-clients col">
    2.         <?php
    3.         echo '  <ul class="client-tile row row-cols-3">
    4.                    <li>Имя клиента</li>
    5.                    <li>Номер телефона</li>
    6.                    <li>Удалить клиента</li>
    7.                </ul>';
    8.         $clients = R::findAll('tm_clients');
    9.         foreach ($clients as $client) {
    10.             if ($client->note == 0) {
    11.                 echo '  <ul class="client-tile row row-cols-3">
    12.                            <li>' . $client->name . ' ' . $client->surname . '</li>
    13.                            <li>' . $client->phone . '</li>
    14.                            <li>
    15.                                <form action="inc/killer.php" method="POST">
    16.                                    <input name="cid" type="hidden" value="' . $client->id . '">
    17.                                    <input name="form_type" type="hidden" value="client_form">
    18.                                    <input class="btn btn-danger" type="submit" value="Удалить">
    19.                                </form>
    20.                            </li>
    21.                        </ul>';
    22.             } else {
    23.                 echo '  <ul class="client-tile blocked">
    24.                            <li>' . $client->name . ' ' . $client->surname . '</li>
    25.                            <li>' . $client->phone . '</li>
    26.                            <li>
    27.                                <form action="inc/killer.php" method="POST">
    28.                                    <input name="cid" type="hidden" value="' . $client->id . '">
    29.                                    <input name="form_type" type="hidden" value="client_form">
    30.                                    <input class="btn btn-danger" type="submit" value="Удалить">
    31.                                </form>
    32.                            </li>
    33.                            <span class="blocked-client">' . $client->note_description . '</span>
    34.                        </ul>';
    35.             }
    36.         }
    37.         ?>
    38.     </section>
    так выглядит connect.php
    PHP:
    1. <?php
    2. require "rb-mysql.php";
    3. R::setup('mysql:host=localhost;dbname=manager', "root", "");
    4. if (!R::testConnection()) die('No DB connection!');
    5. $loged = R::findOne("tmusers", "login = ?", array($_SESSION['loged_user']->login));
    6. R::ext('xdispense', function ($table_name) {
    7.     return R::getRedBean()->dispense($table_name);
    8. });
    9. require "functions.php";
    Касательно хоста:
    приложение находится на личном сервере ubuntu 18.04 LAMP

    Прошу прощения я только учусь((
     
  4. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Вот в этом, видимо, и проблема. В $_SESSION нет практически никакого смысла сохранять объекты. Если жить не можете без объектов, сохраняете в $_SESSION свойства пользователя, не являющиеся объектами, и на основе этих свойств восстанавливаете объект при каждом запросе. На время обработки одного запроса можете сохранить объект пользователя в $_SESSION (хотя это далеко не самый удачный вариант), но не между запросами. Чтобы сохранять между запросами, нужно сохранять/восстанавливать при помощи магических методов или описанным мной выше способом.
    --- Добавлено ---
    Это, видимо, аутентификация.

    Я так сразу и подумал. Это основы: при обработке каждого запроса нужно заново открывать соединение с БД (или возобновлять постоянное соединение).

    Не смешивайте разметку и взаимодействие с БД.

    Плохо выглядит. Как сделать лучше, написал в пред. посте. За нек. исключениями лучше не втыкать файлы, код которых будет сразу выполняться. Т.е. во включаемом файле лучше определить ф-цию и вызывать ее из «основного» файла.
     
    Джон Титор нравится это.
  5. Джон Титор

    Джон Титор Новичок

    С нами с:
    13 авг 2021
    Сообщения:
    7
    Симпатии:
    0
    Я просто пока не знаю как это грамотно(правильно) делать и что вообще следует делать, то-есть я могу просто сохранить в переменную сессии логин пользователя и потом на основании логина снова делать запрос? И вы упоминали куки, я так понимаю нормальные люди используют для таких целей куки?

    Подскажите пожалуйста что гуглить по этой теме, я понял что Вы написали но не понял как это работает, что читать?

    То есть сперва объявить все переменные а потом запускать конструктор?

    Благодарю за помощь и советы...
     
  6. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    В сессии вы сохраняете данные пользователя, чтобы лишний раз не делать запрос в БД (для получения данных пользователя). Нет никакого смысла держать и сессию, и каждый раз делать запрос в БД. Наличие данных пользователя в $_SESSION уже позволяет его авторизовать. Простой проверки if (isset($_SESSION['login'])) может быть достаточно.

    Я упомянул сессионную куку. В ней хранится авторизационный ключ для сессии. Есть люди, которые вообще не используют сессии PHP, но вам в эту сторону смотреть пока рано. Можно использовать сессии PHP и считаться нормальным :)

    Основы протокола HTTP. Каждый HTTP-запрос (AJAX/неAJAX) – это, считай, новый запуск вашей серверной программы. Всю инициализацию нужно выполнять заново. Поэтому и используют сессии и др. хранилища, чтобы сохранять данные между отдельными запросами. И вы явно взялись за AJAX рановато, не освоив более простые вещи.

    ??? Сначала с БД работаете, получая все необходимые данные (или инфу об ошибке), а потом уже вставляете эти данные в шаблон (или, может, вообще др. шаблон подключаете, если при получении данных возникла ошибка). Грубо говоря, выделенную мной строку нужно поднять в самый верх. На самом деле эта строка и шаблон в разных файлах должны располагаться, т.к. при ошибке совсем др. шаблон может быть задействован ;) Почитайте про MVC. И никогда не забывайте обрабатывать все возможные ошибки. Иначе профи никогда не станете. А в вебе нужно быть либо профи хотя бы в плане обработки ошибок, либо даже не рыпаться в эту сторону.

    Не обязательно использовать именно одноименные файл и ф-цию setup и т.п. Суть в том, чтобы не файл был тем «черным ящиком», к которому идет обращение, а ф-ция. Например, вы можете поместить ф-цию setup в файл functions.php и подключать этот файл напрямую из «основного» файла.
     
    #6 miketomlin, 15 авг 2021
    Последнее редактирование: 15 авг 2021
  7. Джон Титор

    Джон Титор Новичок

    С нами с:
    13 авг 2021
    Сообщения:
    7
    Симпатии:
    0
    Спасибо Вам большое, буду читать всего доброго:)