«phpClub» — архив тем ("тредов"), посвящённых изучению PHP и веб-технологий.
Аноним 2021/08/18 17:48:20  №2132160 1
Как адекватно работать с MySQL через JS? Я имею в виду, как получать данные из базы в JS и обратно (без Node.js)? Совсем запутался нахуй, помогите устаканить в голове.

Есть данные в БД, как до них достучаться и, скажем, засунуть их в квиз? Квиз написан на JS, и я хочу при вводе данных в поля в WordPress передавать вопросы в вопросник JS. Я сделал так - непосредственно на странице сайта, которую я натягиваю на WP, объявил переменную в JS и засунул в нее переменную php, которая содержит массив данных полей. Получилась строка. Строку я превратил в массив и далее вычленил элементы уже в вопросник. Но сука, я чувствую, что так не должно быть. То, как я это сделал, это блять неправильно и вообще неадекватно.

Думаю что есть вариант через fetch, но как через него достучаться до БД?

Подскажите плз нормальный человеческий способ, как в реальной практике происходит взаимодействие JS с базой данных (скажем, на WP).

Ответы: >>2132239 >>2133308
Аноним 2021/08/18 19:14:07  №2132239 2
>>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 тут вообще не при чем. Я не думаю, что в нем есть что-то для таких сценариев работы. Это просто движок для блогов, а не универсальный фреймворк.

Ответы: >>2132388 >>2132968
Аноним 2021/08/19 12:43:31  №2132968 3
>>2132239

Спасибо. Да, фетчи когда я изучал, то создавал php файл, который как бы выступает мостом между JS и базой данных.

По поводу варианта получать данные сначала в PHP и потом их преобразовывать я тоже понял, но не понял только вот чего: что значит "php скрипт на стороне сервера"? Вот у меня есть на локалхосте условный php-файл. А на реальном сервере при переносе он точно так же и хранится? То есть мне нужен тупо php-файл обработчик?
Ответы: >>2133643
Аноним 2021/08/19 23:26:32  №2133643 4
>>2132968

Тебе в любом случае нужен код на стороне сервера. Ты не можешь из JS кода из браузера напрямую залезть в базу данных MySQL - и это хорошо, так как иначе любой желающий мог бы в нее залезть.

Сервер - это то, откуда браузер скачивает страницу сайта. Если ты поднял вордпресс на локалхосте, то сервер это твой компьютер.

"Код на стороне сервера" значит php-скрипт или, например, приложение на Node.JS.

Я написал, что в MySQL нельзя залезть JS-скриптом из браузера. Но есть базы данных, в которые залезть можно из браузера без использования PHP-кода. Это severless базы данных вроде FireBase. Но она может быть платной, и документация к ней на английском и разобраться в ней может быть непросто.
Ответы: >>2133917 >>2133997 >>2134314
Аноним 2021/08/20 09:57:06  №2133917 5
>>2133643
Как обеспечивается безопасность при работе с субд из браузера пользователя? Что мешает считать всю базу, или стереть её?
Ответы: >>2133998 >>2134831
Аноним 2021/08/20 10:47:18  №2133997 6
>>2133643

Немного другой вопрос был. Код на стороне сервера - в смысле, это просто php_файл? То есть вот на сервере у меня файлы сайта, и среди них есть файл обработчик.php, который занимается обработкой запросов из JS. Правильно понял?
Ответы: >>2134103 >>2134831
Аноним 2021/08/20 10:47:24  №2133998 7
>>2133917
Работа с данными осуществляется не на уровне браузера, а через серверный слой приложения (в нашем случае это РНР), в котором реализована логика всех запросов, доступных пользователю.
Ответы: >>2134314
Аноним 2021/08/20 12:00:22  №2134103 8
>>2133997
>Код на стороне сервера - в смысле, это просто php_файл?
В простейшем случае это может быть 1 пхп файл + сервер, который обрабатывает поступающие запросы и перенаправляет к пхп файлу
Аноним 2021/08/20 14:56:41  №2134314 9
>>2133998
>>2133643
> Но есть базы данных, в которые залезть можно из браузера без использования PHP-кода.
Аноним 2021/08/20 23:33:53  №2134831 10
>>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