Специальная ссылка на какой либо внешний ресурс чаще всего файл или подключение к базе данных
PHP поддерживает работу с базой данных MySQL.
Специальные встроенные функции для работы с MySQL позволяют просто и эффективно работать с этой СУБД: выполнять любые запросы, читать и записывать данные, обрабатывать ошибки.
Сценарий, который подключается к БД, выполняет запрос и показывает результат, будет состоять всего из нескольких строк. Для работы с MySQL не надо ничего дополнительно устанавливать и настраивать; всё необходимое уже доступно вместе со стандартной поставкой PHP.
Что такое mysqli?
mysqli (MySQL Improved) — это расширение PHP, которое добавляет в язык полную поддержку баз данных MySQL. Это расширение поддерживает множество возможностей современных версий MySQL.
Относительный путь в PHP
У относительных путей в PHP есть один подвох - они могут строиться относительно не той папки, от которой мы ожидаем.
Дело в том, что когда мы подключаем скрипт по относительному пути require('config.php'); , PHP будет искать его по следующему алгоритму:
Сначала PHP попытается найти этот файл в папках, указанных в директиве include_path. Посмотреть, что указано в этой директиве конкретно у вас можно с помощью var_dump(get_include_path()); , папки разделяются символом ;
Если мы укажем путь к скрипту в таком виде: require('./config.php'); , то этот шаг будет пропущен.
Далее PHP попытается найти файл в папке текущего рабочего каталога.
Например, если мы в index.php подключили файл scripts/script.php, а в этом самом script.php уже пытаемся подключить файл по относительному пути, тогда поиск файла произойдёт и в папке scripts тоже.
Два последних пункта - главная проблема относительных путей. Мы не можем быть уверены, что будет подключен именно тот файл, который нам нужен.
Именно по этой причине я призываю тебя отказаться от использования относительных путей в PHP.
Кому-то из практикующих разработчиков эта фраза может не понравиться, но я считаю это единственным разумным решением.
Тем более нет ничего сложного в добавлении константы __DIR__ перед именем скрипта, что автоматически сделает путь абсолютным.
Подключение HTML к базе данных
Сразу скажу, что я в этом не очень разбераюсь, поэтому за грубые/не очень грубые ошибки тут же извиняюсь.
Как происходит подключение к базе данных?
Есть у меня, к примеру, маленький сайт-самоделка, где я отмечаю точки на google.maps и хочу эти координаты сохранить в базе данных. Как это реализовать?
Подключение к базе данных
Здравствуйте. У мене есть вопросы которые я хотел бы задать. Итак, есть программа база данных.
Чайник и VS Code Подключение базе данных
Добрый день подскажите как подключиться к БД в VS Code просто я затупок. Есть база создал ее в.
Ошибка при подключение к базе данных расположенной на интернет хостинге
У меня есть интернет хостинг и на нём расположена база данных. Я пытался через Visual Studio в.
Чем отличается внешнее подключение к базе данных от внутреннего
Можете объяснить: Чем отличается внешнее подключение к базе данных от внутреннего??
Дробное число
Разделителем дробной части в PHP является точка:
С дробными числами существует проблема, характерная не только для PHP, но и для любых других языков, где используется двоичное представление чисел с плавающей точкой.
Проблема в том, что дробные числа имеют ограниченную точность, что в некоторых ситуациях может приводить к неожиданным результатам:
Оператор сравнения == возвращает true или false если два значения соответственно равны или не равны.
В примере выше PHP считает верным выражение 1 + 2 == 3 , но когда дело касается дробей, PHP не считает верным выражение 0.1 + 0.2 == 0.3 .
Это происходит потому что дроби в PHP имеют ограниченную точность. В мозгах PHP результат выражения может быть чем-то вроде 3.000000000007 .
Поэтому когда нужно производить какие-то вычисления, где важна абсолютная точность, нужно использовать специальные функции произвольной точности:
В примере выше bcadd() приняла 2 дробных числа и количество знаков после запятой, в результате мы получили правильный ответ: 0.3 .
Типы данных в PHP
В PHP существуют следующие основные типы данных:
Строка
Строки в PHP размещаются в одинарных или двойных кавычках. Главное различие в том, что в двойные кавычки можно подставить значение переменной, например:
Другие различия будут рассмотрены в отдельном уроке.
Для PHP 7+ 64-битных сборок нет ограничений на максимальную длину строки, для остальных она составляет 2Гб.
Булев тип
Значение булева типа может содержать в себе только true или false (истина или ложь).
Булев тип удобно использовать для всяких флажков и статусов вроде отправлено/не отправлено, просмотрено/не просмотрено и т.д.
Целое число
Целое число — это число без дробной части:
Целые числа имеют следующие минимальные и максимальные значения:
- От -2 147 483 648 до 2 147 483 647 , т.е. ± 2 миллиарда для 32-битных версий PHP
- От -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807 , т.е. ± 9 квинтиллионов для 64-битных версий PHP
Помимо десятичной системы счисления, PHP также поддерживает двоичную, восьмеричную и шестнадцатеричную:
Дробное число
Разделителем дробной части в PHP является точка:
С дробными числами существует проблема, характерная не только для PHP, но и для любых других языков, где используется двоичное представление чисел с плавающей точкой.
Проблема в том, что дробные числа имеют ограниченную точность, что в некоторых ситуациях может приводить к неожиданным результатам:
Оператор сравнения == возвращает true или false если два значения соответственно равны или не равны.
В примере выше PHP считает верным выражение 1 + 2 == 3 , но когда дело касается дробей, PHP не считает верным выражение 0.1 + 0.2 == 0.3 .
Это происходит потому что дроби в PHP имеют ограниченную точность. В мозгах PHP результат выражения может быть чем-то вроде 3.000000000007 .
Поэтому когда нужно производить какие-то вычисления, где важна абсолютная точность, нужно использовать специальные функции произвольной точности:
В примере выше bcadd() приняла 2 дробных числа и количество знаков после запятой, в результате мы получили правильный ответ: 0.3 .
Массив
Массив — это значение, которое может содержать в себе сразу несколько других значений:
Массивы будут подробно рассмотрены в уроке Массивы в PHP.
Объект
Объект — это часть сложной концепции под названием ООП (объектно-ориентированное программирование). Объект может иметь как собственные переменные, так и функции:
Объекты будут подробно рассмотрены в будущем.
Ресурс
Ресурс — это специальная ссылка на какой-либо внешний ресурс, чаще всего файл или подключение к базе данных:
В примере выше функция fopen возвращает ссылку на файл, которую затем можно использовать вместе с другими функциями для управления файлом.
Объект
Объект - это часть сложной концепции под названием ООП (объектно-ориентированное программирование). Объект может иметь как собственные переменные, так и функции:
Объекты будут подробно рассмотрены в будущем.
Текущий и родительский каталоги
Помимо указания конкретных папок, мы также можем добавить в путь указание "перейти на папку выше", например:
В коде выше мы подключим файл config.php, который находится не в текущей папке, а в родительской. С абсолютными путями это тоже работает:
И с URL-адресами тоже:
Также мы можем указать ссылку на текущий каталог, что бывает актуально в некоторых операционных системах:
Возвращает тип PHP-переменной value . Для проверки типа переменной используйте функции is_* .
Список параметров
Возвращаемые значения
- "boolean"
- "integer"
- "double" (по историческим причинам в случае типа float возвращается "double" , а не просто "float" )
- "string"
- "array"
- "object"
- "resource"
- "resource (closed)" с PHP 7.2.0
- "NULL"
- "unknown type"
Список изменений
Примеры
$data = array( 1 , 1. , NULL , new stdClass , ‘foo’ );
foreach ( $data as $value ) echo gettype ( $value ), "\n" ;
>
Результатом выполнения данного примера будет что-то подобное:
Смотрите также
- get_debug_type() — Возвращает имя типа переменной в виде, подходящем для отладки
- settype() — Задаёт тип переменной
- get_class() — Возвращает имя класса, к которому принадлежит объект
- is_array() — Определяет, является ли переменная массивом
- is_bool() — Проверяет, является ли переменная булевой
- is_callable() — Проверяет, что значение может быть вызвано как функция в текущей области видимости
- is_float() — Проверяет, является ли переменная числом с плавающей точкой
- is_int() — Проверяет, является ли переменная целым числом
- is_null() — Проверяет, является ли значение переменной равным null
- is_numeric() — Проверяет, является ли переменная числом или строкой, содержащей число
- is_object() — Проверяет, является ли переменная объектом
- is_resource() — Проверяет, является ли переменная ресурсом
- is_scalar() — Проверяет, является ли переменная скалярным значением
- is_string() — Проверяет, является ли переменная строкой
- function_exists() — Возвращает true, если указанная функция определена
- method_exists() — Проверяет, существует ли метод в данном классе
User Contributed Notes 1 note
Here is something that had me stumped with regards to gettype and is_object.
Gettype will report an incomplete object as such, whereas is_object will return FALSE.
if (! is_object ( $incomplete_obj )) <
echo ‘This variable is not an object, it is a/an ‘ . gettype ( $incomplete_obj );
>
?>
Will print:
This variable is not an object, it is a/an object
Простое правило при работе null, которое помогает избегать проблем
Вообще-то, не стоило читать этот пост. Держать в голове все эти нюансы, которые разные платформы трактуют по-разному, — неблагодарное занятие. Для того, чтобы избежать проблем с null нужно запомнить всего лишь одно правило:
Ошибка №1: Подстановка физического пути в URL
Очень частая ошибка новичков - пытаться подставить в URL адрес ссылку на физический файл, вроде такого:
Это неправильно. Браузер не может видеть реальную файловую структуру сервера. Он не видит никаких дисков D, он видит только URL адреса.
Правильная ссылка выглядит так (разницу объясню чуть позже):
FALSE, NULL и пустые значения — проверка условий и работа с ними
Небольшое описание примеров проверки выполнения условий на PHP.
Данный материал поможет разобраться Вам в понимании механизма работы проверки условий на PHP для разных типов переменных
Типы данных в PHP
В PHP существуют следующие основные типы данных:
Строка
Строки в PHP размещаются в одинарных или двойных кавычках. Главное различие в том, что в двойные кавычки можно подставить значение переменной, например:
Другие различия будут рассмотрены в отдельном уроке.
Для PHP 7+ 64-битных сборок нет ограничений на максимальную длину строки, для остальных она составляет 2Гб.
Булев тип
Значение булева типа может содержать в себе только true или false (истина или ложь).
Булев тип удобно использовать для всяких флажков и статусов вроде отправлено/не отправлено, просмотрено/не просмотрено и т.д.
Целое число
Целое число — это число без дробной части:
Целые числа имеют следующие минимальные и максимальные значения:
- От -2 147 483 648 до 2 147 483 647 , т.е. ± 2 миллиарда для 32-битных версий PHP
- От -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807 , т.е. ± 9 квинтиллионов для 64-битных версий PHP
Помимо десятичной системы счисления, PHP также поддерживает двоичную, восьмеричную и шестнадцатеричную:
Дробное число
Разделителем дробной части в PHP является точка:
С дробными числами существует проблема, характерная не только для PHP, но и для любых других языков, где используется двоичное представление чисел с плавающей точкой.
Проблема в том, что дробные числа имеют ограниченную точность, что в некоторых ситуациях может приводить к неожиданным результатам:
Оператор сравнения == возвращает true или false если два значения соответственно равны или не равны.
В примере выше PHP считает верным выражение 1 + 2 == 3 , но когда дело касается дробей, PHP не считает верным выражение 0.1 + 0.2 == 0.3 .
Это происходит потому что дроби в PHP имеют ограниченную точность. В мозгах PHP результат выражения может быть чем-то вроде 3.000000000007 .
Поэтому когда нужно производить какие-то вычисления, где важна абсолютная точность, нужно использовать специальные функции произвольной точности:
В примере выше bcadd() приняла 2 дробных числа и количество знаков после запятой, в результате мы получили правильный ответ: 0.3 .
Массив
Массив — это значение, которое может содержать в себе сразу несколько других значений:
Массивы будут подробно рассмотрены в уроке Массивы в PHP.
Объект
Объект — это часть сложной концепции под названием ООП (объектно-ориентированное программирование). Объект может иметь как собственные переменные, так и функции:
Объекты будут подробно рассмотрены в будущем.
Ресурс
Ресурс — это специальная ссылка на какой-либо внешний ресурс, чаще всего файл или подключение к базе данных:
В примере выше функция fopen возвращает ссылку на файл, которую затем можно использовать вместе с другими функциями для управления файлом.
Проверка null if-выражениях, а так же в функциях empty() и isset()
Тут переменные с null ведут себя абсолютно предсказуемо, как и любые другие ложные значения (которые в if-выражениях приводятся к false). Но нужно помнить, что это не гарантирует нам, что в переменной находится именно null:
Строка
Строки в PHP размещаются в одинарных или двойных кавычках. Главное различие в том, что в двойные кавычки можно подставить значение переменной, например:
Другие различия будут рассмотрены в отдельном уроке.
Для PHP 7+ 64-битных сборок нет ограничений на максимальную длину строки, для остальных она составляет 2Гб.
Код для создания таблицы при загрузке сайта
База данных готова, теперь напишем код для создания таблицы при загрузке сайта.
Как было указано в необходимых условиях, в качестве хоста будет использоваться Apache2, поэтому выполняем такие команды:
С их помощью создается файл и открывается редактор Vim.
Копируем и вставляем в редактор следующий код:
В строках 7, 8 и 9 объявляются переменные, в которых сохраняются имя пользователя, пароль и localhost. Дальше они задействуются в строке 10 и передаются в качестве параметров в команду mysqli_connect , которой инициируется соединение с сервером MySQL. Если соединение установить не удалось, для отображения ошибки используется оператор if и mysqli_error() . Затем пишется запрос на создание таблицы, который присваивается переменной sql . И запускается запрос для выбора базы данных test . После чего запускается mysqli_query для создания таблицы посредством передачи в качестве параметров переменных sql и connection .
Теперь сохраняем файл и выходим из него, открываем браузер и заходим на этот сайт:
Каждая переменная и каждое значение в PHP имеет свой тип данных:
Тип данных - это такая характеристика данных, которая определяет, какие значения могут содержать данные, какие возможны операции с ними и как они хранятся в памяти.
Булев тип
Значение булева типа может содержать в себе только true или false (истина или ложь).
Булев тип удобно использовать для всяких флажков и статусов вроде отправлено/не отправлено, просмотрено/не просмотрено и т.д.
Функции gettype() в PHP с примерами
Тип переменной можно узнать с помощью функции gettype() , которая возвращает строку с типом переменной.
Попробуйте подставить в функцию gettype() разные переменные, чтобы этот материал отложился у вас в памяти. Тип данных object мы пока трогать не будем.
Абсолютный путь в URL
Абсолютный путь в URL означает путь от корня сайта. Корень сайта - это папка, которая содержит публичную часть сайта, т.е. доступную извне.
Функции settype() в PHP с примерами
Тип переменной можно поменять с помощью функции settype() .
Функции settype() возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.
Поведение null при нетождественном сравнении с приведением типов данных
PHP разрешает сравнивать null-ы не только между собой, но и с другими типами данных. При этом не стоит забывать, что гибкое сравнение в php не является транзитивным, то есть, если два значения равны третьему по отдельности, не гарантирует их равенство между собой. Согласно таблицам приведения типов, гибкое сравнение null при помощи оператора == с разными значениями возвращает разные результаты:
Сравнение с null с помощью >, =, PHP -> JavaScript) поведение null может меняться.
Исследование null в JavaScript (а вместе с ним и загадочного undefined) заслуживает отдельной статьи. Главное отличие состоит в том, что, не смотря на приведение типов, null в JavaScript ничему не равен, кроме самого null и этого самого undefined, хотя в if-выражениях и срабатывает аналогично false. А при сравнении с числами он выдаёт ещё более забавные результаты, чем в PHP.
NULL в MySQL, к примеру, действует гораздо более прямолинейно. Он просто при любых действиях с null (даже при сравнении двух null) возвращает null. С его точки зрения, при любых действиях с неизвестностью в результате получится какая-то другая неизвестность 🙂
Ошибка №1: относительные пути к стилям, скриптам и другим файлам
Представим, что мы решили подключить стили к нашему сайту:
Разработчик указывает относительный URL style.css и видит, что всё работает. По крайней мере, на главной странице.
Но при переходе по любой ссылке, например /products/15 , стили перестают работать.
А причина в том, что относительный путь строится от текущего URL-адреса, а значит в нашем примере он из style.css превратился в /products/15/style.css .
Проверка переменной на null
Чтобы точно узнать, что переменная содержит null (то есть, ничего не содержит), нужно использовать либо специальную функцию is_null() либо тождественное сравнение ===, а любые другие способы не подойдут:
Ошибка №2: Подключение скриптов по URL
Иногда новички пытаются подключить физический файл по его URL:
Это неправильно. Во-первых, подключится не сам скрипт, а результат его работы. Во-вторых, подключать какие-то файлы через URL вообще идея очень опасная.
Сравнение двух null
В PHP как гибкое, так и тождественное сравнение двух null всегда возвращает false, в отличие от многих других платформ, где сравнение двух неизвестностей возвращает так же неизвестность (то есть, null).
Типы данных в PHP
Каждая переменная и каждое значение в PHP имеет свой тип данных:
Тип данных — это такая характеристика данных, которая определяет, какие значения могут содержать данные, какие возможны операции с ними и как они хранятся в памяти.
Ресурс
Ресурс - это специальная ссылка на какой-либо внешний ресурс, чаще всего файл или подключение к базе данных:
В примере выше функция fopen возвращает ссылку на файл, которую затем можно использовать вместе с другими функциями для управления файлом.
Пути к файлам - тема, которая обычно взрывает мозг новичкам. Но не волнуйся, сейчас мы всё расставим по полочкам.
Создание таблицы при загрузке сайта
Для начала у вас должен быть установлен PHP. Чтобы получить версию, запускаем:
Вот такой ответ должен прийти:
Теперь установим сервер MySQL. Для этого открываем терминал и запускаем:
Вводим пароль, чтобы начать установку, и нажимаем на Enter.
Проверяем, установлен ли MySQL, этой командой:
Если установка прошла успешно, выводится примерно следующее:
Теперь для доступа к базе данных с использованием программы на PHP нужно передать в качестве аргументов в SQL-запросе имя пользователя и пароль. Поэтому создадим пользователя с паролем и предоставим ему права доступа к базе данных.
Нового пользователя и пароль создаем, выполняя следующую команду:
Теперь предоставим пользователю разрешения на доступ к базе данных, а заодно убедимся, что эти права доступа отображаются (для этого задействуем команду flush ):
И для доступа к MySQL в Google Cloud:
Для привязки ко всем адресам запускаем это:
Для создания нового пользователя и пароля нужно выполнить указанные выше команды. После добавления нового пользователя выходим и перезапускаем сервер MySQL:
Обратите внимание: в случае с PHP версией 7+ для правильного выполнения команд MySQL необходимо использовать расширение MySQLi. Функции MySQLi позволяют получать доступ к серверам баз данных MySQL.
Для установки расширения MySQLi запускаем:
Теперь все готово к выполнению программ на PHP с интегрированием MySQL. Переходим к решению сформулированной выше задачи.
Первым делом создадим базу данных на сервере MySQL. Для этого подключимся к серверу MySQL:
Для того, чтобы создать таблицу, сначала нужно создать базу данных. Следующей командой создаем базу данных с названием «test»:
Дальше эту базу данных нужно выбрать:
Целое число
Целое число - это число без дробной части:
Целые числа имеют следующие минимальные и максимальные значения:
- От -2 147 483 648 до 2 147 483 647 , т.е. ± 2 миллиарда для 32-битных версий PHP
- От -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807 , т.е. ± 9 квинтиллионов для 64-битных версий PHP
Помимо десятичной системы счисления, PHP также поддерживает двоичную, восьмеричную и шестнадцатеричную:
Функция is_null() и языковые конструкции isset() и empty()
is_null() возвращает TRUE только для переменных, которым не присвоено никакого значения или которым присвоено значение NULL.
isset() возвращает один в один противоположные булевые значения в сравнении с is_null().
Если переменной не присвоено значение, то is_null() также выдает предупреждение «Undefined variable», в отличии от isset(), которая не выдает никаких предупреждение.
Напомним, для того, чтобы убрать значение переменной, можно использовать функцию unset(). Также с этой целью можно присвоить значение NULL, чтобы избежать предупреждений компилятора при попытке чтения значения переменной.
Обратите внимание, что в отличии от переменных для работы с константами необходимо использовать конструкцию defined().
С empty() все просто – возвращает TRUE для истинных значений, FALSE – для всех остальных, полностью в соответствии со списком выше, взятым из документации. Кстати, для тех кто будет экспериментировать самостоятельно, в empty() аргументом можно передать только переменную. При попытке передать константу компилятор выдает синтаксическую ошибку.
Что такое null и как с этим жить: сравнение с null в PHP, тонкости в приведении типов данных
В работе с любыми данными то и дело требуется как-то обозначить их отсутствие. Новички зачастую для этой цели используют значение false, которое, по сути, является не отсутствием данных, а определённым значением типа boolean. Для того, чтобы как-то помечать неопределённость или отсутствие данных, существует специальное значение null. Про false, null и прочее уже немало сказано и добавить что-то оригинальное крайне сложно. Но гораздо сложнее бывает найти баг, вызванный неочевидным поведением этих штуковин. Поэтому, вдохновлённый одним таким багом, самым элегантным в моём послужном списке, я решил написать маленькую шпаргалку на эту тему.
- ей была присвоена константа NULL.
- ей еще не было присвоено никакого значения.
- она была удалена с помощью unset().
До этого момента всё кажется простым, но чтобы так оставалось и дальше, при работе с null нужно придерживаться определённых правил.
Чтение записей
Другая частая операция при работе с базами данных в PHP — это получение записей из таблиц (запросы типа SELECT).
Составим SQL-запрос, который будет использовать SELECT выражение. Затем выполним этот запрос с помощью функции mysqli_query() , чтобы получить данные из таблицы.
В этом примере показано, как вывести все существующие города из таблицы cities:
В примере выше результат выполнения функции mysqli_query() сохранён в переменной $result .
Важно понимать, что в этой переменной находятся не данные из таблицы, а специальный тип данных — так называемая ссылка на результаты запроса.
Чтобы получить действительные данные, то есть записи из таблицы, следует использовать другую функцию — mysqli_fetch_array() — и передать ей единственным параметром эту самую ссылку.
Теперь каждый вызов функции mysqli_fetch_array() будет возвращать следующую запись из всего результирующего набора записей в виде ассоциативного массива.
Цикл while здесь используется для «прохода» по всем записям из полученного набора записей.
Значение поля каждой записи можно узнать просто обратившись по ключу этого ассоциативного массива.
Как получить сразу все записи в виде двумерного массива
Иногда бывает удобно после запроса на чтение не вызывать в цикле mysqli_fetch_array для извлечения очередной записи по порядку, а получить их сразу все одним вызовом. PHP так тоже умеет. Функция mysqli_fetch_all($res, MYSQLI_ASSOC) вернёт двумерный массив со всеми записями из результата последнего запроса.
Перепишем пример с показом существующих городов с её использованием:
Как узнать количество записей
Часто бывает необходимо узнать, сколько всего записей вернёт выполненный SQL запрос.
Это может помочь при организации постраничной навигации, или просто в качестве информации.
Узнать число записей поможет функция mysqli_num_rows() , которой следует передать ссылку на результат запроса.
Операторы сравнения
Перейдем к операторам сравнения.
$undef –переменная, которой не присваивалось значение
Из таблицы можно сделать некоторые приятные выводы:
1. Если мы знаем, что у нас используются только строки, то мы их можем спокойно сравнивать и не беспокоиться, что "" (пустая строка) будет равна "0".
2. Массивы никогда не равны строкам, целым и действительным числам.
Поскольку тип различных ложных констант разный, то для того, чтобы их отличать можно использовать пару операторов === и !==.
Оператор === возвращает ложное значение для всех пар ложных значений.
Истинное значение возвращает лишь для аргументов, одному из которых присвоено значение NULL, а второму не присвоено никакого значения.
Отличие переменных с NULL значением и неопределенных переменных
Оператор === позволяет различать все ложные значения, кроме как переменных с NULL-значением от переменных, которым значение не присваивалось.
Такие переменные можно отличить с помощью функции get_defined_vars().
Если нужно определить, было ли присвоено значение переменной $var, то для этого может быть использован следующий фрагмент код:
Выводы
Всегда нужно помнить, что в PHP два ложных значения могут быть не равны между собой, а переменные, которые, на первый взгляд, разные, могут оказаться одинаковыми при сравнении. Чтобы избежать таких сюрпризов, можно воспользоваться операторами === и !==.
При работе с массивами, во избежание сюрпризов, можно написать функцию конвертирования значений в гарантированно различные индексы. После этого к элементам массива обращаться только с ее помощью. Это может замедлить работу программы, но поможет избежать сюрпризов.
Работа с данными в PHP
В PHP не нужно для переменных устанавливать тип, достаточно просто присвоить значение переменной.
Индексация массивов
При работе с массивами все ложные значения будут обращаться к одному элементу.
Исключением являются только значения индексов пустой строки (») и NULL — для этих двух значений используется отдельное место в памяти.
Также значение пустого массива array(), как впрочем и любого другого массива, не может быть индексом массива – компилятор выдает предупреждение «Illegal offset type» и значение, соответствующее такому индексу, не устанавливается.
Для того, чтобы индексам пустой строки и NULL соответствовали различные елементы в массиве, можно использовать следующий подход. Опишем функцию:
Далее при установке значений мы получим отдельные индексы для пустой строки и значения NULL, точнее будем эмулировать различные индексы:
Индексы массивов — это отдельная тема. Приведу лишь пример того, что значение с целочисленным индексом $arr[555] совпадает со значением соответствующее строковыму индексу $arr[‘555’] в массиве.
Такие особенности прежде всего связаны с тем, что индексы массивов либо целые, либо строки. Более детальная информация может быть найдена в описании типа массива в руководстве php.
Преобразование массивов в строки и наоборот
Рассмотрим что происходит если строку преобразовать в массив:
Тут всё просто, создан массив с единственным элементом, состоящим из строки.
Попробуйте сделать тоже самое с типом данных integer самостоятельно.
FALSE в If-выражениях
В соответствии с документацией PHP следующие значения равны FALSE после приведения в тип boolean:
- само булевское значение FALSE
- integer 0
- float 0.0
- пустая строка (string) ("") и строка "0".
- пустой массив (array) – array().
- an object with zero member variables (только в PHP 4, в статье не рассматривается)
- специальное значение NULL (включая неустановленные переменные)
- SimpleXML objects (в данной статье не рассматривается)
Это значит, что если такие значения, передаются в условие:
то будет выведена строка "0".
Если значение переменной не установлено (unset), то еще и может выдаваться предупреждение. Напомним, предупреждение в условии можно убрать, написав перед переменной @.
Но использовать @ стоит только в крайних случаях, когда вы хорошо подумали и других подходящих вариантов нет. См. функцию isset().
Как выглядит работа с базой данных
Типичный процесс работы с СУБД в PHP-сценарии состоит из нескольких шагов:
- Установить подключение к серверу СУБД, передав необходимые параметры: адрес, логин, пароль.
- Убедиться, что подключение прошло успешно: сервер СУБД доступен, логин и пароль верные и так далее.
- Сформировать правильный SQL запрос (например, на чтение данных из таблицы).
- Убедиться, что запрос был выполнен успешно.
- Получить результат от СУБД в виде массива из записей.
- Использовать полученные записи в своём сценарии (например, показать их в виде таблицы).
Относительный путь в URL
Относительные пути в URL указываются без слеша в начале ссылки, например:
Относительные пути в URL более предсказуемы, чем в PHP. Но я рекомендую использовать их только там, где это действительно необходимо.
Чаще всего их использование приводит к путанице. И вот пара типичных проблем, с которыми часто сталкиваются новички.
Чем отличаются пути в PHP и URL
Когда мы смотрим любимый фильм или сериал, мы видим только готовый продукт.
А за кадром существует совсем другой, невидимый для нас мир: стилисты и гримёры, искусственные декорации, наложение спецэффектов и многое другое.
В PHP существует такое же разделение. С одной стороны - реальная файловая система с реальными папками и файлами, с другой - URL адреса, которые могут не иметь ничего общего с реальной файловой структурой.
Если ты видишь на каком-нибудь сайте страницу с URL /category/monitors - это совсем не значит, что на сайте есть скрипт /category/monitors/index.php .
Вполне вероятно, что и такой папки там тоже нет, а все URL адреса обрабатываются одним единственным PHP файлом.
И даже если в URL присутствует расширение файла, например /about.html - это тоже не говорит о существовании файла about.html . Может он есть, а может и нет.
Новички часто путают пути к реальным файлам с URL адресами. Сейчас я разберу пару таких ошибок, на примере которых можно будет прочувствовать разницу.
Временное преобразование типа переменной
Можно временно преобразовать тип переменной. Для этого в выражении нужно указать требуемый тип в скобках. Вот пример:
В данном примере привоадя в выражении переменную $w к строковому типу ( string ) вы не меняете тип этой переменной. Вместо этого создаётся временная копия переменной $w с преобразованным типом и её значение помещается в переменную $ww.
Выполнение запросов
Установив соединение и определив кодировку мы готовы выполнить свои первые SQL-запросы. Вы уже умеете составлять корректные SQL команды и выполнять их через консольный или визуальный интерфейс MySQL-клиента.
Те же самые запросы можно отправлять без изменений и из PHP-сценария. Помогут в этом несколько встроенных функций языка.
Два вида запросов
Следует разделять все SQL-запросы на две группы:
- Чтение информации (SELECT).
- Модификация (UPDATE, INSERT, DELETE).
При выполнении запросов из среды PHP, запросы из второй группы возвращают только результат их исполнения: успех или ошибку.
Запросы первой группы при успешном выполнении возвращают специальный ресурс результата. Его, в свою очередь, можно преобразовать в ассоциативный массив (если нужна одна запись) или в двумерный массив (если требуется список записей).
Типы данных в PHP
В PHP существуют следующие основные типы данных:
Добавление записи
Вернёмся к нашему проекту — дневнику наблюдений за погодой. Начнём практическую работу с заполнения таблиц данными. Для начала добавим хотя бы один город в таблицу cities.
Выражение INSERT INTO используется для добавления новых записей в таблицу базы данных.
Составим корректный SQL-запрос на вставку записи с именем города, а затем выполним его путём передачи этого запроса в функцию mysqli_query() , чтобы добавить новые данные в таблицу.
Обратите внимание, что первым параметром для функциии mysqli_query() передаётся ресурс подключения, полученный от функции mysqli_connect() , вторым параметром следует строка с SQL-запросом.
При запросах на изменение данных (не SELECT) результатом выполнения будет логическое значение — true или false.
false будет означать, что запрос выполнить не удалось. Для получения строки с описанием ошибки существует функция mysqli_error($link) .
Функция insert id: как получить идентификатор добавленной записи
Следующим шагом будет добавление погодной записи для нового города.
Погодные записи хранит таблица weather_log, но, чтобы сослаться на город, необходимо знать идентификатор записи из таблицы cities.
Здесь пригодится функция mysqli_insert_id() .
Она принимает единственный аргумент — ресурс соединения, а возвращает идентификатор последней добавленной записи.
Теперь у нас есть всё необходимое, чтобы добавить погодную запись.
Вот как будет выглядеть комплексный пример с подключением к MySQL и добавлением двух новых записей:
Автоматическое преобразование типов данных в PHP
У нас есть две переменные string и integer . Мы проводим над ними операцию используя арифметичекий оператор " + ". В результате PHP автоматически меняет тип строковой переменной string на числовой integer .
А теперь самостоятельно попробуйте заменить строку "12" на "3.34".
Далее, попробуем применить оператор конкатенации строк к этим же переменным.
Преобразование типов переменных в PHP происходит в зависимости от контекста. Когда использовали арифметический оператор, предназначенный для работы с числами, строковую переменную PHP автоматически преобразовал в число. При использовании оператора конкатенации строк число было автоматически преобразовано в строку.
Ещё пример преобразования типов данных в PHP:
Правило: если строка начинается с числа, то при преобразовании она преобразуется в число. Это относится к целым и вещественным числам. Если в начале строки нет числа, то она преобразуется в число ноль.
При использовании инкремента и декремента строка преобразовывается по определённым правилам. Вот простой пример:
Тут строки можно преобразовать в числа без труда. А теперь другой пример.
В этом примере последняя буква поменялась с "о" на "p", то есть единица была добавлена к коду символа.
Давайте применим к строке другой метод инкрементации:
В этом примере арифметический оператор " += " сначала преобразовал строку "hello" в число ноль, затем прибавил к нему единицу.
Обратите внимание: при при обработке выражения с выполнением автоматического преобразования ни один операнд не меняется. В операции используется преобразованная копия переменной.
Абсолютный путь в PHP
Абсолютный путь - это полный путь к папке или файлу. Вот пара примеров для разных операционных систем:
Как видите, это полный путь от корня диска до конкретного файла или папки. Начинается со слеша или буквы диска (Windows).
Получить абсолютный путь скрипта можно с помощью магической константы __FILE__ :
Для получения абсолютного пути к папке, в которой находится скрипт, есть магическая константа __DIR__ :
Как этим пользоваться. Допустим, у нас в корне сайта лежат файлы index.php и config.php и мы хотим подключить второй в первый.
Если мы хотим подключить config.php по его абсолютному пути, есть два способа сделать это:
Поскольку константа __DIR__ не добавляет слеш после последней папки, мы указываем его вручную.
Функция mysqli connect: соединение с MySQL
Перед началом работы с данными внутри MySQL, нужно открыть соединение с сервером СУБД.
В PHP это делается с помощью стандартной функции mysqli_connect() . Функция возвращает результат — ресурс соединения. Данный ресурс используется для всех следующих операций с MySQL.
Но чтобы выполнить соединение с сервером, необходимо знать как минимум три параметра:
- Адрес сервера СУБД;
- Логин;
- Пароль.
Если вы следовали стандартной процедуре установки MySQL или используете OpenServer, то адресом сервера будет localhost , логином — root . При использовании OpenServer пароль для подключения — это пустая строка ‘’, а при самостоятельной установке MySQL пароль вы задавали в одном из шагов мастера установки.
Базовый синтаксис функции mysqli_connect() :
Проверка соединения
Первое, что нужно сделать после соединения с СУБД — это выполнить проверку, что оно было успешным.
Эта проверка нужна, чтобы исключить ошибку при подключении к БД. Неверные параметры подключения, неправильная настройка или высокая нагрузка заставит MySQL отвеграть новые подключения. Все эти ситуации приведут к невозможности соединения, поэтому программист должен проверить успешность подключения к серверу, прежде чем выполнять следующие действия.
Соединение с MySQL устанавливается один раз в сценарии, а затем используется при всех запросах к БД.
Результатом выполнения функции mysqli_connect() будет значение специального типа — ресурс.
Если подключение к MySQL не удалось, то функция mysqli_connect() вместо ресурса вернет логическое значение типа «ложь» — false .
Хорошей практикой будет всегда проверять значение результа выполнения этой функции и сравнивать его с ложью.
Соединение с MySQL и проверка на ошибки:
Функция mysqli_connect_error() просто возвращает текстовое описание последней ошибки MySQL.
Установка кодировки
Первым делом после установки соединения крайне желательно явно задать кодировку, которая будет использоваться при обмене данными с MySQL. Если этого не сделать, то вместо записей со значениями, написанными кириллицей, можно получить последовательность из знаков вопроса: ‘. ’.
Вызови эту функцию сразу после успешной установки соединения: mysqli_set_charset($con, "utf8");
Строковое представление
Расмотрим строковое представление ложных констант.
Например при конкатенации значения преобразуются в следующие строки, приведенные в таблице ниже:
Значение | Строка |
---|---|
FALSE | (пустая строка) |
0 | 0 |
0.0 | 0 |
"" | (пустая строка) |
«0» | 0 |
array() | Array |
NULL | (пустая строка) |
@$undef | (пустая строка) |
Более подробно тема преобразования в строки описана на официальном сайте в параграфе Converting to string.
Типы данных в PHP
Каждая переменная и каждое значение в PHP имеет свой тип данных:
Тип данных — это такая характеристика данных, которая определяет, какие значения могут содержать данные, какие возможны операции с ними и как они хранятся в памяти.
Математические операции с null
Во всех математических операциях null ведёт себя аналогично int(0):
Проверка типов
Про функцию gettype() вы уже знаете, она возвращает строку с типом данных. Иногда нужно проверить переменную на соответствие одному типу. Для этого есть следующие функции:
- is_array()
- is_bool()
- is_double() — псевдоним is_real() , is_float()
- is_int() — псевдоним is_integer() , is_long()
- is_object()
- is_string()
- is_null() — проверяет, является ли значение переменной равным NULL
- is_numeric() — проверяет, является ли переменная числом или строкой, содержащей число
Все эти функции возвращают true или false в зависимости от результатов проверки.
Как выглядит работа с базой данных
Типичный процесс работы с СУБД в PHP-сценарии состоит из нескольких шагов:
- Установить подключение к серверу СУБД, передав необходимые параметры: адрес, логин, пароль.
- Убедиться, что подключение прошло успешно: сервер СУБД доступен, логин и пароль верные и так далее.
- Сформировать правильный SQL запрос (например, на чтение данных из таблицы).
- Убедиться, что запрос был выполнен успешно.
- Получить результат от СУБД в виде массива из записей.
- Использовать полученные записи в своём сценарии (например, показать их в виде таблицы).
Ошибка №2: Рекурсия в ссылках
При использовании относительных путей есть риск случайно создать на сайте бесконечные ссылки. Вот один из таких способов:
Для работы данного кода должна быть настроена единая точка входа.
Массив
Массив - это значение, которое может содержать в себе сразу несколько других значений:
Массивы будут подробно рассмотрены в уроке Массивы в PHP.
Читайте также: