Здравствуйте, я новичок, около полугода изучаю PHP, знакомые попросили написать для них веб-приложение и в процессе разработки столкнулся с проблемой, я хочу внедрить AJAX для динамики но он не работает с моим кодом, я реализовал регистрацию пользователя на основе библиотеке redbean и все запросы на сервер делаю с её помощью, вот как у меня всё устроено: connect.php подключение к базе к библиотеке redbean и запуск сессии index.php собирает все элементы воедино, то есть подключает connect.php проверяет авторизирован ли пользователь если да подключает файл меню. Есть файлы с логикой приложения которые сами по себе отрабатывают нормально (то есть если перейти непосредственно на сам файл.php), к примеру вывод списка всех пассажиров из БД если зайти на сам файл выводи пользователей и рисует необходимый html, но когда я пытаюсь получить результат его работы с помощью AJAX то получаю 500 ошибку. Я хочу при нажатии на кнопку в меню, результат работы файла вывести в теге <section> на текущей странице, причем если я убираю свой код и пишу произвольный код который не связывается с БД то все работает. Предполагаю что проблема в том каким образом AJAX производит запрос, не уверен как это описать так как очень слаб в теории простите, думал что он выпадает из сессии на текущей странице и из-за этого не может получить данные в файле так как в нём тоже стоит проверка на авторизацию (банальный if с проверкой есть ли что-то в сессионной переменной logged) убрал проверку но ничего не вышло так же пробовал подключить connect.php в файле но тоже не получил результата, значит, наверное, проблема в файле connect.php или в том как я организовал структуру в документах но убей Бог не пойму что не так ...(тупой) Прошу помочь советом, если требуется выложу дополнительную информацию только скажите какую. Спасибо.
Смешались в кучу кони, люди... Можно сделать файл setup, init и т.п. с определенной в нем одноименной ф-цией. Потом отдельно подключать файл и вызывать ф-цию. Советую использовать единую точку входа. Что касается ошибки, в общем не должно быть разницы, если вы сами не подложили себе свинью, например используете бесплатный хостинг с подобными ограничениями или используете кроссдоменные запросы. Конечно, ответы лучше делать различными в зависимости от того, как происходит обращение к вашим «файлам». При обычных (не AJAX-) запросах лучше выдавать полный код страницы или накрайняк «подложку» с последующей AJAX-дозагрузкой содержимого (накрайняк потому что у многих ПС до сих пор имеются проблемы с распознаванием контента на таких страницах). Это странно, поэтому лучше сразу в виде кода. Может, вы не понимаете каких-то фундаментальных вещей. Например, вот это уже звучит странно: Не, сессионная кука должна передаваться и в AJAX-запросах, если сами не ограничили ее область действия и т.п.
Здравствуйте, Вы наверное будете кричать но она скорее всего сессионная так как при авторизации я создаю переменную типа $_SESSION['logged'] и передаю в неё объект пользователя после чего просто проверяю есть ли совпадение в базе с $_SESSION['logged']->login (делал по видеоуроку не ругайте сильно каюсь...) вот так посылаю запрос к примеру: Код (Javascript): $(document).ready(function(){ $('a.klient').on('click',function(){ $.ajax({ url: 'inc/elements/clients.php', success: function(data){ document.querySelector('.tm-content').innerHTML = data; } }); }) }) Если в clients.php прописать что то такое: PHP: $sum = 25 + 11; echo '<h1>'.$sum.'h1' то все отрабатывает. Но с моим кодом не срабатывает: PHP: <section class="table-wrapper table-clients col"> <?php echo ' <ul class="client-tile row row-cols-3"> <li>Имя клиента</li> <li>Номер телефона</li> <li>Удалить клиента</li> </ul>'; $clients = R::findAll('tm_clients'); foreach ($clients as $client) { if ($client->note == 0) { echo ' <ul class="client-tile row row-cols-3"> <li>' . $client->name . ' ' . $client->surname . '</li> <li>' . $client->phone . '</li> <li> <form action="inc/killer.php" method="POST"> <input name="cid" type="hidden" value="' . $client->id . '"> <input name="form_type" type="hidden" value="client_form"> <input class="btn btn-danger" type="submit" value="Удалить"> </form> </li> </ul>'; } else { echo ' <ul class="client-tile blocked"> <li>' . $client->name . ' ' . $client->surname . '</li> <li>' . $client->phone . '</li> <li> <form action="inc/killer.php" method="POST"> <input name="cid" type="hidden" value="' . $client->id . '"> <input name="form_type" type="hidden" value="client_form"> <input class="btn btn-danger" type="submit" value="Удалить"> </form> </li> <span class="blocked-client">' . $client->note_description . '</span> </ul>'; } } ?> </section> так выглядит connect.php PHP: <?php require "rb-mysql.php"; session_start(); R::setup('mysql:host=localhost;dbname=manager', "root", ""); if (!R::testConnection()) die('No DB connection!'); $loged = R::findOne("tmusers", "login = ?", array($_SESSION['loged_user']->login)); R::ext('xdispense', function ($table_name) { return R::getRedBean()->dispense($table_name); }); require "functions.php"; Касательно хоста: приложение находится на личном сервере ubuntu 18.04 LAMP Прошу прощения я только учусь((
Вот в этом, видимо, и проблема. В $_SESSION нет практически никакого смысла сохранять объекты. Если жить не можете без объектов, сохраняете в $_SESSION свойства пользователя, не являющиеся объектами, и на основе этих свойств восстанавливаете объект при каждом запросе. На время обработки одного запроса можете сохранить объект пользователя в $_SESSION (хотя это далеко не самый удачный вариант), но не между запросами. Чтобы сохранять между запросами, нужно сохранять/восстанавливать при помощи магических методов или описанным мной выше способом. --- Добавлено --- Это, видимо, аутентификация. Я так сразу и подумал. Это основы: при обработке каждого запроса нужно заново открывать соединение с БД (или возобновлять постоянное соединение). Не смешивайте разметку и взаимодействие с БД. Плохо выглядит. Как сделать лучше, написал в пред. посте. За нек. исключениями лучше не втыкать файлы, код которых будет сразу выполняться. Т.е. во включаемом файле лучше определить ф-цию и вызывать ее из «основного» файла.
Я просто пока не знаю как это грамотно(правильно) делать и что вообще следует делать, то-есть я могу просто сохранить в переменную сессии логин пользователя и потом на основании логина снова делать запрос? И вы упоминали куки, я так понимаю нормальные люди используют для таких целей куки? Подскажите пожалуйста что гуглить по этой теме, я понял что Вы написали но не понял как это работает, что читать? То есть сперва объявить все переменные а потом запускать конструктор? Благодарю за помощь и советы...
В сессии вы сохраняете данные пользователя, чтобы лишний раз не делать запрос в БД (для получения данных пользователя). Нет никакого смысла держать и сессию, и каждый раз делать запрос в БД. Наличие данных пользователя в $_SESSION уже позволяет его авторизовать. Простой проверки if (isset($_SESSION['login'])) может быть достаточно. Я упомянул сессионную куку. В ней хранится авторизационный ключ для сессии. Есть люди, которые вообще не используют сессии PHP, но вам в эту сторону смотреть пока рано. Можно использовать сессии PHP и считаться нормальным Основы протокола HTTP. Каждый HTTP-запрос (AJAX/неAJAX) – это, считай, новый запуск вашей серверной программы. Всю инициализацию нужно выполнять заново. Поэтому и используют сессии и др. хранилища, чтобы сохранять данные между отдельными запросами. И вы явно взялись за AJAX рановато, не освоив более простые вещи. ??? Сначала с БД работаете, получая все необходимые данные (или инфу об ошибке), а потом уже вставляете эти данные в шаблон (или, может, вообще др. шаблон подключаете, если при получении данных возникла ошибка). Грубо говоря, выделенную мной строку нужно поднять в самый верх. На самом деле эта строка и шаблон в разных файлах должны располагаться, т.к. при ошибке совсем др. шаблон может быть задействован Почитайте про MVC. И никогда не забывайте обрабатывать все возможные ошибки. Иначе профи никогда не станете. А в вебе нужно быть либо профи хотя бы в плане обработки ошибок, либо даже не рыпаться в эту сторону. Не обязательно использовать именно одноименные файл и ф-цию setup и т.п. Суть в том, чтобы не файл был тем «черным ящиком», к которому идет обращение, а ф-ция. Например, вы можете поместить ф-цию setup в файл functions.php и подключать этот файл напрямую из «основного» файла.