Как адекватно работать с MySQL через JS? Я имею в виду, как получать данные из базы в JS и обратно (без Node.js)? Совсем запутался нахуй, помогите устаканить в голове.Есть данные в БД, как до них достучаться и, скажем, засунуть их в квиз? Квиз написан на JS, и я хочу при вводе данных в поля в WordPress передавать вопросы в вопросник JS. Я сделал так - непосредственно на странице сайта, которую я натягиваю на WP, объявил переменную в JS и засунул в нее переменную php, которая содержит массив данных полей. Получилась строка. Строку я превратил в массив и далее вычленил элементы уже в вопросник. Но сука, я чувствую, что так не должно быть. То, как я это сделал, это блять неправильно и вообще неадекватно. Думаю что есть вариант через fetch, но как через него достучаться до БД?Подскажите плз нормальный человеческий способ, как в реальной практике происходит взаимодействие JS с базой данных (скажем, на WP).
>>2132160Давай разобьем вопрос на несколько частей: 1) как передать в JS начальные данные при загрузке страницы. Тут правильным способом будет получить эти данные в PHP при загрузке страницы, преобразовать их в JSON и явно передать в нужную функцию: <script>initQuiz(<?= json_encode($data); ?>);</script>Плюс такого подхода в том, что нам не надо делать лишние аякс-запросы и мучать пользователя ожиданием - данные уже встроены в страницу и мгновенно могут быть использованы скриптом. Также этот подход очень явный - если ты наткнулся на этот код, ты можешь в IDE в один клик перейти к функции initQuiz() и увидеть, что дальше делается с данными.Минус тут может быть только в том случае, если данных очень много, и они почти никогда не используются. В этой ситуации ты заставляешь пользователя грузить не нужные ему данные.Иногда этот подход не подходит, так как у нас скрипт загружается асинхронно и функцию initQuiz мы вызвать не можем (так как скрипт еще не загрузился). В таком случае мы можем создать внутри страницы "остров" с JSON-данными. Скрипт при загрузке находит в теле страницы этот остров и берет данные из него:<script id="quizData" type="application/json"><?= json_encode($data); ?></script>Обрати внимание на атрибут type: он говорит, что это не яваскрипт, а JSON и браузер не будет пытаться его выполнить.Этот подход, на мой взгляд, менее явный, так как при просмотре кода неочевидно, для кого предназначен этот остров и как найти скрипт, который его использует, если у тебя тысячи скриптов. IDE тут не поможет.2) Как в процессе работы скрипта получать или отправлять данные без перезагрузки страницы? Тут нужны аякс-запросы. Ты отправляешь запрос на сервер, а там PHP-скрипт его обрабатывает как нужно. Логично отправлять данные на сервер как данные формы, а принимать с сервера ответ в формате JSON.То есть, тебе нужно иметь скрипт на сервере, который положит или достанет данные из БД. Помни про безопасность: хакер может прислать твоему скрипту что угодно. Не доверяй приходящим данным, а тщательно проверяй каждый элемент на соответствие разрешенным значениям.WordPress тут вообще не при чем. Я не думаю, что в нем есть что-то для таких сценариев работы. Это просто движок для блогов, а не универсальный фреймворк.
>>2132239Спасибо. Да, фетчи когда я изучал, то создавал php файл, который как бы выступает мостом между JS и базой данных. По поводу варианта получать данные сначала в PHP и потом их преобразовывать я тоже понял, но не понял только вот чего: что значит "php скрипт на стороне сервера"? Вот у меня есть на локалхосте условный php-файл. А на реальном сервере при переносе он точно так же и хранится? То есть мне нужен тупо php-файл обработчик?
>>2132968Тебе в любом случае нужен код на стороне сервера. Ты не можешь из JS кода из браузера напрямую залезть в базу данных MySQL - и это хорошо, так как иначе любой желающий мог бы в нее залезть.Сервер - это то, откуда браузер скачивает страницу сайта. Если ты поднял вордпресс на локалхосте, то сервер это твой компьютер."Код на стороне сервера" значит php-скрипт или, например, приложение на Node.JS.Я написал, что в MySQL нельзя залезть JS-скриптом из браузера. Но есть базы данных, в которые залезть можно из браузера без использования PHP-кода. Это severless базы данных вроде FireBase. Но она может быть платной, и документация к ней на английском и разобраться в ней может быть непросто.
>>2133643Как обеспечивается безопасность при работе с субд из браузера пользователя? Что мешает считать всю базу, или стереть её?
>>2133643Немного другой вопрос был. Код на стороне сервера - в смысле, это просто php_файл? То есть вот на сервере у меня файлы сайта, и среди них есть файл обработчик.php, который занимается обработкой запросов из JS. Правильно понял?
>>2133997Да, это файл-обработчик. >>2133917Там можно настроить права доступа к каждой таблице. Например: юзер может только добавлять или просматривать комменты и не может удалять их. >>2134484Это сочетание особенности float с особенностью представления отрицательных чисел в int.float - это приблизительный тип. В 64-битном PHP float сохраняет только 15-16 значащих цифр числа и порядок. То есть, он хранит число в виде M * 2 N (где M и N целые). Ты можешь убедиться, попробовав сделать var_dump(1000000000000000000000123.0) - "123" на конце потеряется, так как PHP сохраняет только первые 15-16 цифр. И PHP выведет 1e24 - то есть, 1 * 1024. Последние цифры потерялись.Если хочешь узнать подробнее, погугли IEEE754. Этот стандарт описывает, как числа с плавающей запятой преобразуются в двоичный вид.Когда ты преобразуешь PHP_INT_MAX в float, точности не хватает, чтобы сохранить все цифры числа и последние цифры округляются в большую сторону. Попробуй сдампить var_dump(PHP_INT_MAX) и var_dump((float)PHP_INT_MAX); и сравнить числа. Ты увидишь различие из-за округления.Округление происходит в большую сторону и число становится больше PHP_INT_MAX.Когда ты пытаешься преобразовать это число обратно в int, возникает проблема: число больше, чем максимальное положительное значение int и преобразовать в int его невозможно. Правильно, конечно, было бы выдавать ошибку в таком случае, но PHP все равно его преобразует, при этом получается отрицательное число. Ты можешь сдампить var_dump((int)1e19); и увидеть отрицательное число.Но почему при переполнении int получается отрицательное число? Это особенность хранения int в компьютере. Рассмотрим ячейку памяти размером в 1 байт. В ней можно сохранить число от 0 до 255. Если мы хотим хранить в ней еще и отрицательные числа, то мы должны придумать какой-то способ, как их закодировать. Можно, например, договориться так: числа от 0 до 127 обозначают сами себя, а числа от 128 до 255 обозначают -128 ... -1 соответственно. Это называется "дополнительный код" (дополнение до 2). Почему придумали именно такую систему? Потому что с ней компьютеру просто и удобно складывать и вычитать положительные и отрицательные числа. Человеку такое представление не очень удобно, но он потерпит.Теперь если мы в такую ячейку попытаемся записать слишком большое число, например число 129, то при чтении оно будет воспринято как -127, так как мы ранее договорились, что числа > 128 обозначают отрицательные числа. Вот примерно то же самое происходит при преобразовании в int. Число слишком большое и оно попадает в область, которая представляет отрицательные значения. Почитать подробнее про дополнительный код: https://ru.wikipedia.org/wiki/%D0%94%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%B4