проверка базы данных php
Работа с MySQL в PHP
PHP поддерживает работу с базой данных MySQL.
Специальные встроенные функции для работы с MySQL позволяют просто и эффективно работать с этой СУБД: выполнять любые запросы, читать и записывать данные, обрабатывать ошибки.
Сценарий, который подключается к БД, выполняет запрос и показывает результат, будет состоять всего из нескольких строк. Для работы с MySQL не надо ничего дополнительно устанавливать и настраивать; всё необходимое уже доступно вместе со стандартной поставкой PHP.
Что такое mysqli?
mysqli (MySQL Improved) — это расширение PHP, которое добавляет в язык полную поддержку баз данных MySQL. Это расширение поддерживает множество возможностей современных версий MySQL.
Как выглядит работа с базой данных
Типичный процесс работы с СУБД в PHP-сценарии состоит из нескольких шагов:
Функция mysqli connect: соединение с MySQL
Но чтобы выполнить соединение с сервером, необходимо знать как минимум три параметра:
Базовый синтаксис функции mysqli_connect() :
Проверка соединения
Первое, что нужно сделать после соединения с СУБД — это выполнить проверку, что оно было успешным.
Эта проверка нужна, чтобы исключить ошибку при подключении к БД. Неверные параметры подключения, неправильная настройка или высокая нагрузка заставит MySQL отвеграть новые подключения. Все эти ситуации приведут к невозможности соединения, поэтому программист должен проверить успешность подключения к серверу, прежде чем выполнять следующие действия.
Соединение с MySQL и проверка на ошибки:
Функция mysqli_connect_error() просто возвращает текстовое описание последней ошибки MySQL.
Установка кодировки
Первым делом после установки соединения крайне желательно явно задать кодировку, которая будет использоваться при обмене данными с MySQL. Если этого не сделать, то вместо записей со значениями, написанными кириллицей, можно получить последовательность из знаков вопроса: ‘. ’.
Вызови эту функцию сразу после успешной установки соединения: mysqli_set_charset($con, «utf8»);
Выполнение запросов
Установив соединение и определив кодировку мы готовы выполнить свои первые SQL-запросы. Вы уже умеете составлять корректные SQL команды и выполнять их через консольный или визуальный интерфейс MySQL-клиента.
Те же самые запросы можно отправлять без изменений и из PHP-сценария. Помогут в этом несколько встроенных функций языка.
Два вида запросов
Следует разделять все SQL-запросы на две группы:
При выполнении запросов из среды PHP, запросы из второй группы возвращают только результат их исполнения: успех или ошибку.
Запросы первой группы при успешном выполнении возвращают специальный ресурс результата. Его, в свою очередь, можно преобразовать в ассоциативный массив (если нужна одна запись) или в двумерный массив (если требуется список записей).
Добавление записи
Вернёмся к нашему проекту — дневнику наблюдений за погодой. Начнём практическую работу с заполнения таблиц данными. Для начала добавим хотя бы один город в таблицу cities.
Выражение INSERT INTO используется для добавления новых записей в таблицу базы данных.
Функция insert id: как получить идентификатор добавленной записи
Теперь у нас есть всё необходимое, чтобы добавить погодную запись.
Вот как будет выглядеть комплексный пример с подключением к MySQL и добавлением двух новых записей:
Чтение записей
В этом примере показано, как вывести все существующие города из таблицы cities:
Чтобы получить действительные данные, то есть записи из таблицы, следует использовать другую функцию — mysqli_fetch_array() — и передать ей единственным параметром эту самую ссылку.
Теперь каждый вызов функции mysqli_fetch_array() будет возвращать следующую запись из всего результирующего набора записей в виде ассоциативного массива.
Цикл while здесь используется для «прохода» по всем записям из полученного набора записей.
Значение поля каждой записи можно узнать просто обратившись по ключу этого ассоциативного массива.
Как получить сразу все записи в виде двумерного массива
Иногда бывает удобно после запроса на чтение не вызывать в цикле mysqli_fetch_array для извлечения очередной записи по порядку, а получить их сразу все одним вызовом. PHP так тоже умеет. Функция mysqli_fetch_all($res, MYSQLI_ASSOC) вернёт двумерный массив со всеми записями из результата последнего запроса.
Перепишем пример с показом существующих городов с её использованием:
Как узнать количество записей
Фильтрация и проверка данных PHP. Частые ошибки
Материал предназначен в основном для начинающих веб-программистов.
Введение.
Часто ко мне обращаются клиенты, у которых установлены самописные CMS или модули, написанные начинающими веб-программистами, которые не понимают, что нужно для защиты данных и зачастую копируют функции фильтрации, не задумываясь о том как они работают и что именно нужно с ними делать.
Здесь я постараюсь описать как можно подробнее частые ошибки при фильтрации данных в PHP скрипте и дать простые советы как правильно выполнить фильтрацию данных.
В сети много статей по поводу фильтрации данных, но они как правильно не полные и без подробные примеров.
Разбор полетов.
Фильтрация. Ошибка №1
Для числовых переменных используется такая проверка:
Почему она приведет к SQL инъекции? Дело в том, что пользователь может указать в переменной input_number значение:
В таком случаи проверка будет успешно пройдена, т.к. функция intval получает целочисленное значение переменной, т.е. 1, но в самой переменной $number ничего не изменилось, поэтому весь вредоносный код будет передан в SQL запрос.
Правильная фильтрация:
Конечно, условие может меняться, например если вам нужно получить только определенный диапазон:
Если вы используете чекбоксы или мультиселекты с числовыми значениями, выполните такую проверку:
array_map
Так же встречаю фильтрацию в виде:
Ничего кроме улыбки это не может вызвать 🙂
Фильтрация. Ошибка №2.
Для стринг-переменных используется такая фильтрация:
Функция addslashes экранирует спец. символы, но она не учитывает кодировку БД и возможен обход фильтрации. Не стану копировать текст автора, который описал данную уязвимость и дам просто ссылку Chris Shiflett (перевод можно поискать в рунете).
Если вы не предполагаете вхождение html тегов, то лучше всего сделать такую фильтрацию:
strip_tags — убирает html теги.
htmlspecialchars — преобразует спец. символы в html сущности.
Так вы защитите себя от XSS атаки, помимо SQL инъекции.
Если же вам нужны html теги, но только как для вывода исходного кода, то достаточно использовать:
Если вам важно, чтобы значение переменной не было пустой, то используйте функцию trim, пример:
Фильтрация. Ошибка №3.
Она касается поиска в БД.
Для поиска по числам используйте фильтрацию, описанную в первой ошибке.
Для поиска по тексту используйте фильтрацию, описанную во второй ошибке, но с оговорками.
Для того, чтобы пользователь не смог выполнить логическую ошибку, нужно удалять или экранировать спец. символы SQL.
Пример без доп. обработки строки:
На выходе у нас получится запрос вида:
Это значительно увеличит нагрузку на базу.
В своём скрипте я использую функцию, которая удаляет нежелательные мне символы из поиска:
Конечно, не все из выше перечисленных символов представляют опасность, но в моём случаи они не нужны, поэтому выполняю поиск и замену.
Пример использования фильтрации:
Также советую сделать ограничение по количеству символов в поиске, хотя бы не меньше 3-х, т.к. если у вас будет большое количество записей в базе, то поиск по 1-2 символам будет значительно увеличивать нагрузку на БД.
Фильтрация. Ошибка №4.
Не фильтруются значения в переменной $_COOKIE. Некоторые думаю, что раз эту переменную нельзя передать через форму, то это гарантия безопасности.
Данную переменную очень легко подделать любым браузером, отредактировав куки сайта.
Например, в одной известной CMS была проверка, используемого шаблона сайта:
В данном случаи можно подменить значение переменной $_COOKIE[‘skin’] и вызвать ошибку, в результате которой вы увидите абсолютный путь до папки сайта.
Если вы используете значение куков для сохранения в базу, то используйте одну из выше описанных фильтраций, тоже касается и переменной $_SERVER.
Фильтрация. Ошибка №5.
В PHP скрипте переменная $group будет равна 5, если в скрипте она не была объявлена со значением по умолчанию.
Фильтрация. Ошибка №6.
Проверка. Ошибка №1.
Сталкивался со случаями, когда для AJAX запроса (например: повышение репутации) передавалось имя пользователя или его ID (кому повышается репутация), но в самом PHP не было проверки на существование такого пользователя.
Например:
Получается мы создаем запись в базе, которая совершенно бесполезна нам.
Проверка. Ошибка №2.
При выполнении различного рода действий (добавление, редактирование, удаление) с данными не забывайте проверять права пользователя на доступ к данной функции и дополнительные возможности (использование html тегов или возможность опубликовать материал без проверки).
Давно исправлял в одном модуле форума подобную ошибку, когда любой пользователь мог отредактировать сообщение администрации.
Проверка. Ошибка №3.
При использовании нескольких php файлов сделайте простую проверку.
В файле index.php (или в любом другом главном файле) напишите такую строчку перед подключением других php файлов:
В начале других php файлов напишите:
Так вы ограничите доступ к файлам.
Проверка. Ошибка №4.
Используйте хеши для пользователей. Это поможет предотвратить вызов той или иной функции путём XSS.
Пример составления хеша для пользователей:
Далее во все важные формы подставляйте инпут со значением текущего хеша пользователя:
Во время выполнения скрипта осуществляйте проверку:
Проверка. Ошибка №5.
При выводе SQL ошибок сделайте простое ограничение к доступу информации. Например задайте пароль для GET переменной:
Это позволит скрыть от хакера информацию, которая может ему помочь во взломе сайта.
Проверка. Ошибка №5.
Старайтесь не подключать файлы, получая имена файлов извне.
Например:
В таком случаи вы предотвратите подключение файлов, которые не были вами предусмотрены.
Совет.
Для большей надежности используйте один из готовых и популярных классов для фильтрации данных, дабы самому не пропустить какие-то вредоносные символы/данные. Также в этих классах часто имеется возможность выбора фильтра данных.
UPD: Поправил пост. Перенес все советы по поводу функций и переменных, которые были в комментариях.
Проверить на наличие данных в базе
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Не выходит проверить наличие в базе данных введенного ключа
Пытаюсь сделать проверку наличия ключа в базе данных. Всегда выдает что ключа нет. может что не так.
Как проверить наличие данного имени в базе данных
Существует столбец Name как проверить есть-ли там определённое имя(на пример 1 (: )
Как проверить наличие уже существующих данных в базе?
доброе время суток! помогите пожалуйста! Есть таблица, надо сделать так, чтобы если я ввожу данные.
Решение
Вот чёрт. Я и проверить то не могу.. у меня всё deprecated
А всё.. не увидел что GoDr, переписал.
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Проверка на наличие элемента в базе данных
Здравствуйте. Мне надо чтобы проводилась проверка на наличие пользователя с данными id first_name.
Проверить массив на наличие данных
Подскажите пожалуйста, как проверить массив на наличие не нулевых элементов? К примеру есть массив.
Проверить наличие данных в переменной
Доброго всем времени суток. Подскажите пожалуйста никак не получается реализовать условие. Если в.
Проверка на наличие новых обьектов в базе данных и их вывод в listbox
Здравствуйте. Необходимо сделать программу, чтобы проводилась проверка в БД на хостинге MySql в.
Как произвести поиск в базе данных на наличие совпадений с заданным массивом
есть многомерный массив например А(4,5) и есть таблица в базе данных как можно в цикле пробежаться.
Работа с базами данных SQL в PHP для новичков
Учебник PHP
Практика
Важное
Регулярки
Работа с htaccess
Файлы, папки
Сессии и куки
Работа с БД
Практика по работе с БД в PHP
Перед чтением см. новые уроки раздела «Важное», которые появились выше.
Практика
Движок PHP
Продвинутые БД
Аутентификация
Практика
ООП и MVC
Абстрактные классы и интерфейсы
Трейты
ООП Магия
Практика
Практика: классы как набор методов
Что такое база данных
Это могут быть тексты страниц, списки пользователей с их логинами и паролями, каталоги продукции и другое.
База данных состоит из таблиц. Что такое таблица вы знаете из жизни: это строки и столбцы. А на пересечении строк и столбцов располагаются ячейки.
В базах данных столбцы часто называют полями.
PhpMyAdmin
Для редактирования баз данных часто пользуются программой PhpMyAdmin.
Видео на PhpMyAdmin
Задачи на PhpMyAdmin
Давайте откроем PhpMyAdmin и приступим к изучению его интерфейса.
Чтобы вам было проще с ним освоится, сделайте следующие практические задачи:
AUTO_INCREMENT
Обратите внимание на то, что мы создали поле id и поставили ему галочку AUTO_INCREMENT. Это очень важный шаг!
Теперь при вставке новой записи (строки) в таблицу это поле будет заполняться автоматически уникальным номером.
При этом если мы удалим строку с каким-то id (например 1), то такого id больше никогда не будет.
Зачем нужно поле id?
Затем, чтобы мы всегда могли обратиться к конкретной строке по ее id, например с целью удаления или редактирования.
Типы переменных
В SQL довольно много типов переменных, но чаще всего приходится пользоваться следующими:
Как работать с mySQL через PHP
Работа с БД из PHP осуществляется всего лишь с помощью трех функций:
Далее подробнее про каждую из функций.
Устанавливаем соединение с БД
Данный материал есть также в виде видео: https://youtu.be/J8GFuyA_k_8
Прежде, чем начать работать с базой данных из PHP, нужно установить соединение с сервером, на котором эта база находится.
Делается это с помощью функции PHP mysql_connect, которая принимает 3 параметра: имя хоста (сервера), имя пользователя, под которым мы работаем с базой и пароль для этого пользователя.
Давайте установим соединение с базой данных:
Посылаем запросы к базе данных
Это относиться к командам SELECT, UPDATE, FROM, DELETE, WHERE и другим такого рода.
Конечно, синтаксической ошибки не будет, если вы напишите их маленькими буквами, но принято большими.
Отлавливаем ошибки базы данных
Многие начинающие зачастую не умеют отлавливать ошибки, которые вернула база данных.
Чтобы вывести ошибки, следует пользоваться конструкцией or die ( mysqli_error($link) ), которую необходимо добавлять к каждому запросу к БД.
Таким образом вы сразу будете получать сообщения об ошибках синтаксиса SQL. Обратите внимание на то, что на рабочем сайте эти конструкции следует удалять, чтобы пользователи и тем более хакеры не видели ошибок БД.
Проблемы с кодировками
Чтобы не было проблем с кодировками следует придерживаться простых правил:
Начнем практиковаться
Сейчас мы с вами начнем изучить SQL запросы на практике. Для этого нам понадобится тестовая таблица в базе данных, заполненная некоторыми данными. Сейчас мы с вами ее сделаем и заполним.
Итак, создайте свою первую базу данных с помощью PhpMyAdmin.
Создайте в этой базе новую таблицу.
Назовите ее «workers» (англ. работники).
В ней создайте 4 столбца (столбцы по другому называются поля):
Ее заполните тестовыми данными, как показано в таблице ниже (этот шаг обязателен, так как дальше все задачи будут по этой таблице):
id | name | age | salary |
---|---|---|---|
1 | Дима | 23 | 400 |
2 | Петя | 25 | 500 |
3 | Вася | 23 | 500 |
4 | Коля | 30 | 1000 |
5 | Иван | 27 | 500 |
6 | Кирилл | 28 | 1000 |
Тестируем работоспособность
Просто скопируйте этот код и запустите его у себя:
В таком случае проверьте все еще раз, уберите последовательно все ошибки PHP, если таковые есть.
Как достать результат
После того, как мы сделали запрос к базе, в переменной $result будет лежать результат этого действия.
Однако лежит он не в той форме, которая нам нужна в PHP, а в той форме, в которой его прислала нам база.
Достать результат в нормальном виде (в массиве) можно с помощью следующего кода:
Как работает последняя строка?
Функция mysqli_fetch_assoc считывает последовательно каждую строку результата, который прислала нам база.
В цикле for мы считываем построчно результат из базы.
А результат из БД будет лежать в нормальном виде в массиве $data.
Как проверить наличие записей в таблице MySQL через PHP?
Функция проверяет, есть ли уже в таблице ‘users’ запись о пользователе. Но функция дает ошибку: при вызове она всегда возвращает ‘true’, хотя никакой записи о пользователе в таблице еще нет. Из-за этого данные, переданные через форму, так и не попадают в базу данных. Может быть я неправильно проверяю результат выполнения запроса в функции?
P.S. Вот условие, в котором вызывается функция:
Это очень распространенная ошибка.
И очень нелогичная.
Ты, когда запрашиваешь выписку в банке чтобы узнать, есть ли у тебя деньги, на что смотришь? Просто на то пришла ли выписка, или нет? Серьёзно? Или все-таки смотришь в саму выписку, какие там цифры?
Чтобы узнать, еслть ли в таблице данные, нельзя запрашивать все строки. А представь что ты наконец освоишь программирование и на твоем сайте будет миллион пользователей. Будешь всех запрашивать в РНР чтобы узнать, есть ли хоть один?
Кроме того, забудь про global. Привыкай всегда понимать, откуда и куда у тебя идут переменные, чтобы четко знать какая переменная у тебя что содержит и откуда взялась. А не просто с неба свалилась. Пеередавай переменные в функцию только через параметры