Kwert-soft.ru

IT Софт для ПК
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Javascript работа с базой данных

Javascript работа с базой данных

БлогNot. JQuery: как обратиться из Javascript к базе данных

JQuery: как обратиться из Javascript к базе данных

Нечто подобное уже есть вот тут, но сейчас я хочу сделать AJAX-запрос покороче, с использованием именно базы MySQL, да ещё и дописать уже существующую сборку «шахматной решалки», «закрыв» в ней упомянутые по ссылке «строки 41 и 56».

Сначала совсем простой пример, проще которого я придумать не смогу. На локальном сервере есть папка, допустим, с именем ptest , в ней — обычный файл HTML с именем index.html :

Но файл этот не совсем простой:

  • во-первых, он подключает библиотеку JQuery с сайта Гугля;
  • во-вторых, с помощью JQuery он делает из клиентского кода на Javascript запрос к серверному скрипту на PHP.

В этой же папке лежит и файл script.php , приём данных в нём ничем не отличается от случая, когда данные были переданы из формы HTML или от другого PHP-скрипта:

Наш скрипт просто записал полученные данные в текстовый файл, отделив число от строки символом табуляции t . А на самом деле script.php мог делать с данными, полученными от клиента, что угодно, например, писать их в базу MySQL, как-то обрабатывать и т.д.

Мы можем проверить этот код в работе, но только правильно, не щёлкая по html-файлу, а по протоколу http через браузер, скажем, разместив папку ptest с двумя файлами в корневой папке Denwer или другого локального сервера, а затем набрав в браузере адрес http://localhost/ptest/

Сделаем пример пожизненней, например, ответим на вопрос, как решалка шахматных задач, написанная на яваскрипте и выполняющаяся на стороне клиента, может сохранять информацию о рейтингах пользователей в базе данных сервера.

Пусть к «корневому» документу HTML или скрипту PHP подключён скрипт:

Неважно, что скрипт лежит во вложенной папке js , всё равно вызывать серверные php-скрипты он будет из той же папки, где находится «корневой» документ, да иной подход и чреват проблемами. Например, ajax-запросы на ресурсы с доменами, поддоменами и протоколами, отличными от текущего, как правило, запрещены. То есть, из клиентского файла domain.com/script.js нельзя обратиться к серверному anotherdomain.com/script.php . А если бы было можно, любой дятел смог бы бомбить со своего компьютера любую форму в интернете. Разумеется, можно написать браузер или обёртку, где кроссдоменные ajax-запросы разрешены, но ведь порвут 🙂

Наш клиентский puzzle.js , пользуясь тем, что в нём подключён JQuery, хочет иногда вызывать серверные скрипты plus.php и minus.php — для увеличения и уменьшения рейтинга юзверька в зависимости от того, правильно ли тот решает задачи:

Это опять образец короткого вызова метода $.ajax для отправки данных на сервер методом POST . Здесь первым параметром, с именем balM и balP , передаётся число (на сколько уменьшить или увеличить рейтинг), а вторым параметром, с именем move , передаётся строка (запись хода).

Скрипты minus.php и plus.php будут очень похожи, только первый из них не будет повторно «минусовать» неверные ходы пользователя, во втором такая проверка не нужна, так как он вызывается только после решения задачи:

Скрипты пользуются файлом functions.php , содержащим несложную «обёртку» для операций с базой, а также более-менее адекватную функцию определения IP-адреса пользователя:

Примечание. Адекватна функция get_ip будет только в случае «классического» ipv4 и PHP5. Для ipv6 и PHP7 лучше поискать другое решение (см. комментарии здесь).

В свою очередь, functions.php подключает config.php , содержащий обычные настройки для коннекта, у меня на локалхосте требуется вот такой config.php , на реальном хосте настройки придётся изменить:

Перед тем, как запустить скрипты, я создал на локальном сервере таблицу chesspuzzles для хранения данных. Для этого достаточно выбрать в phpMyAdmin (в Denwer он вызывается из браузера адресом http://localhost/tools/phpmyadmin/ ) нужную базу данных (у меня с именем my ) и выполнить к ней такой SQL-запрос:

В той же папке, где остальной PHP-код и главный файл, можно поместить скрипт list.php , который покажет текущую статистику по IP-адресам пользователей скрипта и их баллам:

Что вышло — можно посмотреть вот тут, заодно и шахматные задачки порешать, ничего не скачивая.

P.S. Для PHP версий 5.5 и выше нужно перевести код работы с базой с MySQL на MySQLi, как сделано здесь.

18.11.2015, 01:01; рейтинг: 18385

РАБОТА С БАЗАМИ ДАННЫХ (Node.js database tutorial)

Last updated: Oct 19, 2017

В следующей главе я покажу вам, как вы можете настроить приложение Node.js для работы с базой данных и научу вас основам её использования.

RisingStack’s services:

Sign up to our newsletter!

Join 150K+ monthly readers.

In-depth articles on Node.js, Microservices, Kubernetes and DevOps.

In this article:

Senior Engineer at RisingStack

В следующей главе я покажу вам, как вы можете настроить приложение Node.js для работы с базой данных и научу вас основам её использования.

This article was translated to Russian by Andrey Melikhov, a front-end developer from Yandex.Money and editor of the collective blog about front-end, devSchacht. Find Andrey on: Twitter, GitHub, Medium & SoundCloud

Read the original article in English: Node.js database tutorial.

Перевод этой статьи сделан Андреем Мелиховым, фронтенд-разработчиком из компании Яндекс.Деньги, редактором коллективного блога о фронтенде, devSchacht. Twitter | GitHub | Medium | SoundCloud

Хранение данных в глобальной переменной

Раздача статических страниц пользователям (как это делать вы узнали в предыдущей главе) может быть подходящим вариантом для лэндингов или для личных блогов. Однако, если вы хотите отдавать персонализированный контент, вам придётся где-то хранить данные.

Читать еще:  Thread sleep java

Возьмём простой пример: регистрация пользователя. Вы можете отдавать пользовательский контент для отдельных пользователей или сделать его доступным для них только после идентификации.

Если пользователь хочет зарегистрироваться в вашем приложении, вы можете создать обработчик соответствующего роута, чтобы сделать регистрацию возможной:

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

Использование этого метода может быть проблематичным по нескольким причинам:
• оперативная память дорогая,
• память очищается каждый раз, когда вы перезапускаете ваше приложение,
• если вы не будете чистить память, иногда вы можете получить переполнение памяти.

Хранение данных в файле

Следующее решение, которое может прийти к вам в голову — это хранить данные в файлах.

Если мы постоянно сохраняем наши пользовательские данные в файловой системе, мы можем избежать ранее перечисленных проблем.

На практике этот метод выглядит следующим образом:

Таким образом, мы не потеряем пользовательские данные даже после перезагрузки сервера. Это решение также экономически выгодно, так как увеличение дискового пространства дешевле, чем покупка ОЗУ.

К сожалению, хранение пользовательских данных таким образом все ещё имеет несколько недостатков:

  • Добавление данных работает неплохо, но подумайте об обновлении или удалении.
  • Если мы работаем с файлами, нет простого решения для параллельные доступа к ним (системные блокировки не позволят вам писать в один файл параллельно).
  • Когда мы пытаемся масштабировать наше приложение, мы не можем разделить файлы между серверами (на самом деле можем, но это далеко за пределами уровня этого руководства).

Здесь выходят на сцену настоящие базы данных.

Возможно, вы уже слышали, что существуют два основных типа баз данных: SQL и NoSQL.

Начнём с SQL. Это язык запросов, предназначенный для работы с реляционными базами данных. SQL немного отличается в зависимости от продукта, который вы используете, но основы одинаковы в каждом из них.

Сами данные хранятся в таблицах, и каждая добавленная часть будет представлена в виде строки в таблице, как в Google Sheets или Microsoft Excel.

В базе данных SQL вы можете определить схемы — эти схемы предоставят скелет для данных, которые вы собираетесь разместить. Перед тем, как сохранить данные, необходимо задать типы различных значений. Например, вам нужно будет определить таблицу для ваших пользовательских данных и сообщить базе данных, что у неё есть имя пользователя, которое является строкой, и возраст, который является целым типом.

NoSQL

С другой стороны, NoSQL базы данных стали весьма популярными в последнее десятилетие. С NoSQL вам не нужно определять схему, и вы можете хранить любой произвольный JSON. Это хорошо сочетается с JavaScript, потому что мы можем легко превратить любой объект в JSON. Будьте осторожны, потому что вы никогда не можете гарантировать, что данные консистентны, и вы никогда не сможете узнать, какая структура находится в базе данных.

Node.js и MongoDB

Существует распространённое заблуждение о Node.js, которое мы слышим довольно часто:

«Node.js можно использовать только с MongoDB (которая является самой популярной NoSQL базой данных)».

По моему опыту, это не так. У большинства баз данных имеются драйверы для Node.js, и у них также есть библиотеки в NPM. По моему мнению, они такие же простые и лёгкие в использовании, как MongoDB.

Node.js и PostgreSQL

Для простоты мы будем использовать SQL в следующем примере. Мой выбор — PostgreSQL.

Чтобы запустить PostgreSQL, вам необходимо установить его на свой компьютер. Если вы используете Mac, вы можете использовать Homebrew для установки PostgreSQL. В противном случае, если вы работаете в Linux, вы можете установить его с помощью своего диспетчера пакетов.

Для получения дополнительной информации ознакомьтесь с этим отличным руководством по началу работы с вашей первой базой данных.

Если вы планируете использовать инструмент для просмотра базы данных, я бы рекомендовал утилиту для командной строки — psql . Она поставляется вместе с сервером PostgreSQL. Вот небольшая инструкция, которая пригодится, если вы начнёте её использовать.

Если вам не нравится интерфейс командной строки, вы можете использовать pgAdmin, который является инструментом с открытым исходным кодом и предназначен для администрирования PostgreSQL.

Обратите внимание, что SQL — это сам по себе язык программирования. Мы не будем рассматривать все его функции, только наиболее простые. Если нужно изучить его глубже, то в Интернете есть много отличных онлайн-курсов, которые охватывают все основы PostgreSQL.

Взаимодействие Node.js с базой данных

Во-первых, мы должны создать базу данных, которую мы будем использовать. Для этого введите следующую команду в терминал: createdb node_hero .

Затем мы должны создать таблицу для наших пользователей.

Наконец, мы можем вернуться к программированию. Вот как вы можете взаимодействовать с вашей базой данных через вашу программу на Node.js.

Это был простой пример — «hello world» в PostgreSQL. Обратите внимание, что первым параметром является строка, которая является нашей SQL-командой, второй параметр представляет собой массив значений, которыми мы хотели бы параметризовать наш запрос.

Большой ошибкой с точки зрения безопасности был бы ввод данных, пришедших от пользователя, в том виде, в котором они были переданы. Приведённая выше функция client.query защищает вас от SQL-инъекций, которые являются распространённым видом атаки, когда злоумышленник пытается внедрить в запрос произвольный SQL-код. Всегда учитывайте это при создании любого приложения, в котором возможен ввод данных со стороны пользователя. Чтобы узнать больше, ознакомьтесь с нашим контрольным списком безопасности Node.js-приложений.

Давайте продолжим наш предыдущий пример.

Читать еще:  Javascript примеры кода

Достижение разблокировано: пользователь сохранён в базе данных! 🙂 Теперь давайте попробуем прочитать эти данные. Затем добавим новый роут для поиска пользователей в наше приложение.

Это было не так сложно, не так ли?

Теперь вы можете запустить любой сложный SQL-запрос, который вы можете найти в вашем Node.js-приложении.

С помощью этой техники вы можете постоянно хранить данные в своём приложении, и благодаря трудолюбивой команде разработчиков модуля node-postgres это проще простого.

Работа с базами данных

Node Hero: Глава 5

Перевод книги Node Hero от RisingStack . Переведено с разрешения правообладателей.

В следующей главе я покажу вам, как вы можете настроить приложение Node.js для работы с базой данных и научу вас основам её использования.

Хранение данных в глобальной переменной

Раздача статических страниц пользователям (о чём вы узнали в предыдущей главе) может быть подходящим вариантом для лэндингов или для личных блогов. Однако, если вы хотите отдавать персонализированный контент, вам придётся где-то хранить данные.

Возьмём простой пример: регистрация пользователя. Вы можете отдавать пользовательский контент для отдельных пользователей или сделать его доступным для них только после идентификации.

Если пользователь хочет зарегистрироваться в вашем приложении, вы можете создать обработчик соответствующего роута, чтобы сделать регистрацию возможной:

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

Использование этого метода может быть проблематичным по нескольким причинам:

  • оперативная память дорогая
  • память очищается каждый раз, когда вы перезапускаете ваше приложение
  • если вы не будете чистить память, иногда вы можете получить переполнение памяти

Хранение данных в файле

Следующее решение, которое может прийти вам в голову, это хранить данные в файлах.

Если мы постоянно сохраняем наши пользовательские данные в файловой системе, мы можем избежать ранее перечисленных проблем.

На практике этот метод выглядит следующим образом:

Таким образом, мы не потеряем пользовательские данные даже после перезагрузки сервера. Это решение также экономически выгодно, так как увеличение дискового пространства дешевле, чем покупка ОЗУ.

К сожалению, хранение пользовательских данных таким образом все ещё имеет несколько недостатков:

  • добавление данных работает неплохо, но подумайте об обновлении или удалении
  • если мы работаем с файлами, нет простого решения для параллельного доступа к ним (системные блокировки не позволят вам писать в один файл параллельно)
  • когда мы пытаемся масштабировать наше приложение, мы не можем разделить файлы между серверами (на самом деле можем, но это далеко за пределами уровня этого руководства)

Здесь выходят на сцену настоящие базы данных.

Возможно, вы уже слышали, что существуют два основных типа баз данных: SQL и NoSQL.

Начнём с SQL. Это язык запросов, предназначенный для работы с реляционными базами данных. SQL немного отличается в зависимости от продукта, который вы используете, но базовые вещи в них тождественны.

Сами данные хранятся в таблицах. Каждая добавленная часть будет представлена в виде строки в таблице, как в Google Sheets или Microsoft Excel.

В базе данных SQL вы можете определить схемы. Они предоставят скелет для данных, которые вы собираетесь разместить. Также, перед тем, как сохранить данные, будет необходимо задать типы различных значений. Например, вам нужно будет определить таблицу для ваших пользовательских данных и сообщить базе данных, что у неё есть имя пользователя, являющееся строкой, и возраст — целый тип.

NoSQL

С другой стороны, в последнее десятилетие стали весьма популярны NoSQL базы данных. С NoSQL вам не нужно определять схему и вы можете хранить любой произвольный JSON. Это хорошо сочетается с JavaScript, потому что мы можем легко превратить любой объект в JSON. Будьте осторожны, потому что вы никогда не можете гарантировать, что данные консистентны, и вы никогда не сможете узнать, какая структура находится в базе данных.

Node.js и MongoDB

Существует распространённое заблуждение о Node.js, которое можно услышать довольно часто:

«Node.js можно использовать только с MongoDB (самая популярная NoSQL база данных)».

По моему опыту, это не так. У большинства баз данных имеются драйверы для Node.js и библиотеки в NPM. По моему мнению, они такие же простые и лёгкие в использовании, как MongoDB.

Node.js и PostgreSQL

Для простоты мы будем использовать SQL в следующем примере. Мой выбор — PostgreSQL.

Чтобы запустить PostgreSQL, вам необходимо установить его на свой компьютер. Если вы используете Mac, вы можете использовать Homebrew для установки PostgreSQL. В противном случае, если вы работаете в Linux, вы можете установить его с помощью своего диспетчера пакетов.

Для получения дополнительной информации ознакомьтесь с этим отличным руководством по началу работы с вашей первой базой данных.

Если вы планируете использовать инструмент для просмотра базы данных, я бы рекомендовал утилиту для командной строки — psql . Она поставляется вместе с сервером PostgreSQL. Вот небольшая инструкция, которая пригодится, если вы начнёте использовать psql .

Если вам не нравится интерфейс командной строки, вы можете использовать pgAdmin, который является инструментом с открытым исходным кодом и предназначен для администрирования PostgreSQL.

Обратите внимание, что SQL — это сам по себе язык программирования. Мы не будем рассматривать все его возможности, а только наиболее простые. Если вам потребуется глубже изучить SQL, то в интернете есть много отличных онлайн-курсов, охватывающих все основы PostgreSQL.

Взаимодействие Node.js с базой данных

Во-первых, мы должны создать базу данных, которую мы будем использовать. Для этого введите следующую команду в терминал: createdb node_hero .

Читать еще:  Java net bindexception

Затем мы должны создать таблицу для наших пользователей.

Наконец, мы можем вернуться к программированию. Вот как вы можете взаимодействовать с вашей базой данных через вашу программу на Node.js:

Это был простой пример — “hello world” в PostgreSQL. Обратите внимание, что первым параметром является строка, которая является нашей SQL-командой, второй параметр представляет собой массив значений, которыми мы хотели бы параметризовать наш запрос.

Большой ошибкой с точки зрения безопасности был бы ввод данных, пришедших от пользователя, в том виде, в котором они были переданы. Приведённая выше функция client.query защищает вас от SQL-инъекций, являющихся распространённым видом атаки, когда злоумышленник пытается внедрить в запрос произвольный SQL-код. Всегда учитывайте это при создании любого приложения, в котором возможен ввод данных со стороны пользователя. Чтобы узнать больше, ознакомьтесь с нашим контрольным списком безопасности Node.js-приложений.

Примечание переводчика: обычно никто не пишет SQL-запросы руками, вместо этого используют так называемые конструкторы запросов (query builder), например sequelize и knex .

Давайте продолжим наш предыдущий пример.

Достижение разблокировано: пользователь сохранён в базе данных! 🙂 Теперь давайте попробуем прочитать эти данные. Затем добавим в наше приложение новый роут для поиска пользователей.

Это было не так сложно, не так ли?

Теперь вы можете запустить любой сложный SQL-запрос, который вы только сможете вообразить, в вашем Node.js-приложении.

С помощью этой техники вы можете постоянно хранить данные в своём приложении, а благодаря трудолюбивой команде разработчиков модуля node-postgres это проще простого.

HTML 5. Работа с Web SQL базой данных

В HTML 5 есть много новых возможностей, которые позволяют web разработчикам создавать более мощные и насыщенные приложения. К этим возможностям относятся и новые способы хранения данных на клиенте, такие как web storage(поддерживается в IE8) и web SQL database.

При этом если web storage ориентирован на хранение пар ключ-значение, то в случае с web SQL database у нас есть полноценный sqlite(во всех текущих реализациях применяется именно этот движок баз данных, что является проблемой при стандартизации).

Далее я расскажу, как работать с web SQL database. При этом примеры естественно будут на JavaScript. Кроме того, стоит отметить, что с поддержкой браузерами всего этого хозяйства дела обстоят, не очень хорошо, но всё постепенно меняется к лучшему и, скажем, в Opera 10.50 поддержка будет, а браузерах на движке WebKit она уже есть. Более подробно про то, какой браузер, что поддерживает можно узнать, пройдя по ссылке.

Соединение с базой данных.

Подсоединиться к базе данных очень просто:

db = openDatabase(«ToDo», «0.1», «A list of to do items.», 200000);

Данный код создаёт объект, представляющий БД, а если базы данных с таким именем не существует, то создаётся и она. При этом в аргументах указывается имя базы данных, версия, отображаемое имя и приблизительный размер. Кроме того важно отметить, что приблизительный размер не является ограничением. Реальный размер базы данных может изменяться.

Успешность подключения к БД можно оценить, проверив объект db на null:

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

Выполнение запросов.

Для выполнения запросов к БД предварительно надо создать транзакцию, вызвав функцию database.transaction(). У неё один аргумент, а именно другая JavaScript функция, принимающая объект транзакции и предпринимающая запросы к базе данных.

Собственно сам SQL запрос можно выполнить, вызвав функцию executeSql объекта транзакции. Она принимает 4 аргумента:

  • строка SQL запроса
  • массив параметров запроса (параметры подставляются на место вопросительных знаков в SQL запросе)
  • функция, вызываемая при успешном выполнении запроса
  • функция, вызываемая в случае возникновения ошибки выполнения запроса

Пример работы функции executeSql ниже:

db.transaction(function(tx) <
tx.executeSql(«SELECT COUNT(*) FROM ToDo», [], function(result)<>, function(tx, error)<>);
>);

Давайте теперь изменим код так, чтобы при невозможности выборки из таблицы «ToDo»(которой пока не существует), данная таблица создавалась.

db.transaction(function(tx) <
tx.executeSql(«SELECT COUNT(*) FROM ToDo», [], function (result) < alert('dsfsdf') >, function (tx, error) <
tx.executeSql(«CREATE TABLE ToDo (id REAL UNIQUE, label TEXT, timestamp REAL)», [], null, null);
>)>);

Вставка данных.

Давайте вставим новую строку в таблицу «ToDo». Для знакомых с синтаксисом SQL пример, приведённый ниже, покажется очень знакомым:

db.transaction(function(tx) <
tx.executeSql(«INSERT INTO ToDo (label, timestamp) values(?, ?)», [«Купить iPad или HP Slate», new Date().getTime()], null, null);
>);

Первый знак вопроса в SQL запросе заменяется на «Купить iPad или HP Slate», а второй на метку времени. В итоге выполнен будет примерно такой запрос:
INSERT INTO ToDo (label, timestamp) values («Купить iPad или HP Slate», 1265925077487)

Работа с результатами запросов.

Результат выполнения запроса на выборку данных содержит набор строк, а каждая строка содержит значения столбцов таблицы для данной строки.

Вы можете получить доступ к какой-либо строке результата вызвав функцию result.rows.item(i), где i – индекс строки. Далее, для получения требуемого значения, нужно обратиться к конкретному столбцу по имени – result.rows.item(i)[ «label»].

Следующий пример выводит результат запроса к базе данных на страницу:

db.transaction(function(tx) <
tx.executeSql(«SELECT * FROM ToDo», [], function(tx, result) <
for(var i = 0; i

Заключение.

Использование web SQL database предоставляет мощные возможности, но не стоит увлекаться. Если задачу можно решить с помощью web storage, лучше использовать его.

Вы можете найти дополнительную информацию по данной теме в соответствующем разделе сайта консорциуме w3c.
Также для web SQL database уже начали разрабатывать ORM библиотеки. Пример такой библиотеки тут.

Ссылка на основную публикацию
Adblock
detector