Функции mysql


Содержание

Дополнительные функции MySQL

Содержание

Побитовый XOR (побитовое сложение по модулю 2) ( ^ )

Сдвиг числа влево ( > )

DES_ENCRYPT(строка[, (номер_ключа | строка_ключа)])

MASTER_POS_WAIT(имя_журнала, позиция_в_журнале [, таймаут])

Битовые функции

MySQL использует для двоичных операций 64-битовые величины BIGINT, следовательно, для двоичных операторов максимальный диапазон составляет 64 бита.

Побитовое ИЛИ ( | )


Побитовое И ( & )


Побитовый XOR (побитовое сложение по модулю 2) ( ^ )


Сдвиг числа влево ( )


Сдвиг числа вправо ( >> )


Инвертировать биты (


BIT_COUNT(N)

Возвращает количество битов аргумента N, которые установлены в единицу

Функции шифрования

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

AES_ENCRYPT(строка, строка_ключа)


AES_DECRYPT(зашифрованная_строка, строка_ключа)

Эти функции позволяют выполнять шифрование и дешифрацию данных с использованием официального алгоритма AES (Advanced Encryption Standard), ранее известного как «Rijndael». Применяется кодирование с 128-разрядным ключом, но можно расширить его до 256 разрядов, должным образом изменив исходные тексты. Длина ключа 128 бит выбрана, поскольку он работает намного быстрее и при этом обеспечивает приемлемый уровень безопасности.

Входные аргументы могут иметь любую длину. Если любой из них равен NULL, результатом функции также будет NULL.

Поскольку AES — алгоритм блочного типа, дополнение применяется для строк с нечетным количеством символов, и поэтому длина результирующей строки может быть рассчитана как 16* (trunc (длина_строки/16) +1).

Если функция AES_DECRYPT() обнаруживает неверные данные или неправильное дополнение, она возвращает NULL. Однако существует вероятность, что AES_DECRYPT() вернет значение, не равное NULL (возможно, «мусор»), если входные данные или ключ неверны.

Вы можете использовать AES-функции для сохранения данных в зашифрованной форме, модифицировав существующие запросы:

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

Функции AES_ENCRYPT() и AES_DECRYPT() были добавлены в MySQL 4.0.2 и могут рассматриваться как наиболее криптографически безопасные функции, доступные в MySQL на текущий момент.

DECODE(зашифрованная_строка, строка_пароля)

Расшифровывает строку зашифрованная_строка, используя значение строка_пароля в качестве пароля. Аргумент зашифрованная_строка должен быть строкой, ранее возвращенной функцией ENCODE().

ENCODE(строка, строка_пароля)

Шифрует строку строка, используя значение строка_пароля в качестве пароля. Для расшифровки результата применяется функция DECODE(). Результатом является бинарная строка той же длины, что и строка. Если нужно сохранить ее в столбце, применяйте тип BLOB.

DES_DECRYPT(зашифрованная_строка [, строка_ключа])

Расшифровывает строку зашифрованная_строка, зашифрованную с помощью DES_ENCRYPT(). В случае ошибки возвращает NULL. Следует отметить, что эта функция работает, только если MySQL настроен на поддержку SSL. Если не указан аргумент строка_ключа, DES_DECRYPT() проверяет первый байт зашифрованной строки для определения номера DES-ключа, использованного при шифровании исходной строки, а затем читает ключ из файла DES-ключей для расшифровки сообщения. Чтобы это работало, пользователь должен иметь привилегию SUPER. Файл ключей может быть указан с помощью опции сервера —des-key-file.

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

Если аргумент зашифрованная_строка не выглядит как зашифрованная строка, MySQL вернет строку зашифрованная_строка без изменений.

DES_ENCRYPT(строка[, (номер_ключа | строка_ключа)])

Шифрует строку с помощью заданного ключа, используя тройной DES-алгоритм. В случае ошибки возвращает NULL.

Следует отметить, что эта функция работает, только если MySQL настроен на поддержку SSL. Ключ шифрования выбирается на базе второго аргумента DES_ENCRYPT(). Если таковой указан, то берётся первый ключ из используемого файла DES-ключей. Если задан номер_ключа, то он берётся из используемого файла DES-ключей. Если задана строка_ключа, то она используется в качестве ключа для шифрования.

Имя файла ключей указывается в опции сервера —des-key- file.

Длина строки результата рассчитывается как новая_длина = оригинальная_длина + (8 – (оригинальная_длина % 8)) + 1. Каждая строка в файле DES-ключей имеет следующий формат: номер_ключа строка_ключа_des.

Каждый номер_ключа должен быть числом в диапазоне от 0 до 9. Строки в файле могут следовать в любом порядке. строка_ключа_des — это строка, которая будет использоваться для шифрования сообщения. Между номером и ключом должен быть, по меньшей мере, один пробел. Первый ключ является ключом по умолчанию, который применяется в случае, если не указан аргумент строка_ключа в функции DES_ENCRYPT().

Можно указать MySQL на необходимость чтения новых значений ключа из файла ключей с помощью оператора FLUSH DES_KEY_FILE. Это требует наличия привилегии RELOAD.

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

ENCRYPT(строка [, нач])

Шифрует строку строка, используя системный вызов Unix crypt(). Необязательный аргумент нач должен быть строкой из не менее двух символов. Если аргумент нач отсутствует, то будет использовано случайное значение Unix crypt().

ENCRYPT() игнорирует все, кроме первых восьми символов аргумента строка. Это поведение определяется реализацией лежащего в основе системного вызова crypt().

Если функция crypt() не доступна в вашей системе, ENCRYPT() всегда возвращает NULL. По этой причине следует всегда применять вместо этой функции MD5(), поскольку эта функция представлена на всех платформах.

MD5(строка)

Вычисляет 128-разрядную контрольную сумму MD5 для аргумента строка. Значение возвращается в виде 32-разрядной шестнадцатеричной строки или же NULL, если аргумент равен NULL. Возвращаемое значение может быть использовано, например, в качестве хэш-ключа.

PASSWORD(строка)

Вычисляет и возвращает строку пароля по значению пароля строка, заданному простым текстом. Эта функция применяется для шифрования паролей, сохраняемых в столбце Password таблицы привилегий user.

Шифрование функцией PASSWORD() является однонаправленным (то есть необратимым).

Примечание: функция PASSWORD() используется системой аутентификации сервера MySQL, которая не должна быть задействованной в ваших собственных приложениях. Для этой цели вместо нее применяйте функции MD5() и SHA1().

Информационные функции

BENCHMARK(количество, выражение)

Функция BENCHMARK() выполняет выражение в точности количество раз. Она может использоваться для определения того, насколько быстро MySQL выполняет выражение. Возвращаемый результат всегда равен 0. Предполагаемое применение — в среде клиента mysql, который сообщает время выполнения запроса:

Время, которое сообщает mysql — это время обслуживания клиента, а не потраченное центральным процессором время на стороне сервера. Рекомендуется выполнить BENCHMARK() несколько раз, и интерпретировать результат в зависимости от степени загруженности сервера.

CHARSET(строка)

Возвращает набор символов аргумента строка.

COERCIBILITY(строка)

Возвращает значение принуждения сопоставления для аргумента строка.

Возвращаемые значения имеют следующий смысл:

0 — явное сравнение

1 — нет сравнения

2 — неявное сравнение

Меньшие значения обладают большим приоритетом.

COLLATION(строка)

Возвращает наименование порядка сопоставления символьного набора для заданного аргумента строка.

CONNECTION_ID()

Возвращает идентификатор соединения (идентификатор потока) текущего сеанса. Каждое клиентское соединение получает свой собственный уникальный идентификатор.

CURRENT_USER()

Возвращает комбинацию имени пользователя и имени хоста после аутентификации в текущем сеансе. Это значение соответствует пользовательской учетной записи MySQL, которая определяет ваши права доступа. Оно может отличаться от значения, возвращаемого функцией USER().

Приведенный выше пример иллюстрирует, что, несмотря на то, что клиент имеет имя davida (как показывает функция USER ), сервер аутентифицировал клиента, использующего анонимный доступ (что видно по пустой части имени пользователя в значении CURRENT_USER() ). Единственной причиной, почему такое может случиться, является отсутствие учетной записи для davida в таблице привилегий.

DATABASE()

Возвращает имя базы данных по умолчанию (текущей базы данных).


Если текущей базы данных нет, DATABASE() возвращает NULL.

FOUND_ROWS()

Оператор SELECT может включать конструкцию LIMIT для ограничения количества строк, которые сервер возвращает клиенту. В некоторых случаях желательно знать, сколько строк сервер вернул бы без конструкции LIMIT, но без повторного выполнения запроса. Чтобы получить значение счетчика строк, включите опцию SQL_CALC_FOUND_ROWS в состав оператора SELECT, после чего вызовите FOUND_ROWS():

Второй оператор SELECT вернет число, показывающее, сколько строк первый оператор SELECT вернул бы, будь он без конструкции LIMIT.

Следует отметить, что когда используется SELECT SQL_CALC_FOUND_ROWS, то MySQL приходится посчитать, сколько строк будет в полном результирующем наборе. Однако это делается быстрее, чем если запустить запрос снова без конструкции LIMIT, поскольку результирующий набор не приходится отсылать клиенту.

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

Функция FOUND_ROWS() позволяет определить, сколько других страниц необходимо для отображения оставшейся части результата.

Применение SQL_CALC_FOUND_ROWS и FOUND_ROWS() более сложно для запросов с UNION, чем для простых операторов SELECT, потому что LIMIT может встретиться в UNION во многих местах. Они могут касаться отдельных операторов SELECT в составе UNION либо общего результата UNION в целом.

Цель SQL_CALC_FOUND_ROWS для UNION состоит в том, что он должен вернуть количество строк, которые будут возвращены без глобального LIMIT. Условия применения SQL_CALC_FOUND_ROWS с UNION перечислены ниже:

  • Ключевое слово SQL_CALC_FOUND_ROWS должно указываться в первом операторе SELECT.
  • Значение FOUND_ROWS() будет точным только при условии применения UNION ALL. Если указано UNION без ALL, происходит исключение дубликатов, и значение FOUND_ROWS() будет лишь приблизительным.
  • Если в UNION не присутствует LIMIT, то SQL_CALC_FOUND_ROWS игнорируется и возвращается количество строк во временной таблице, которая создается для выполнения UNION.

LAST_INSERT_ID()


LAST_INSERT_ID(выражение)

Возвращает последнее автоматически сгенерированное значение, которое было вставлено в столбец AUTO_INCREMENT.

Последний идентификатор, который был сгенерирован, поддерживается на сервере на основе соединений. Это означает, что значение, возвращаемое клиенту, соответствует последнему сгенерированному значению AUTO_INCREMENT в сеансе данного клиента. Оно никак не может быть затронуто другими клиентами, равно как не требует блокировок или транзакций.

Значение, возвращаемое LAST_INSERT_ID() не изменяется, если вы обновляете столбец AUTO_INCREMENT в строке не с помощью «магических» значений (то есть, не NULL и не 0 ).

Если вы вставляете много строк одним оператором, LAST_INSERT_ID() возвращает значение для первой вставленной строки. Цель этого состоит в том, чтобы облегчить воспроизведение того же оператора INSERT на другом сервере.

Если указан аргумент выражение, значение аргумента возвращается функцией и запоминается как следующее значение, которое LAST_INSERT_ID() вернет при следующем вызове. Это можно использовать для эмуляции последовательностей:

  • Создать таблицу для хранения счетчика последовательности и инициализировать его:

  • Использовать таблицу для генерации последовательности чисел:

Оператор UPDATE увеличивает счетчик последовательности и заставляет следующий вызов LAST_INSERT_ID() возвращать измененное значение.

Вы можете генерировать последовательности без вызова LAST_INSERT_ID(), но польза от ее применения заключается в том, что значение идентификатора поддерживается сервером как последнее автоматически сгенерированное значение.

Это обеспечивает безопасное использование в многопользовательской среде, поскольку множество клиентов могут отправлять операторы UPDATE и получать свои собственные значения последовательности через оператор SELECT (или mysql_insert_id() ), никак не влияя и не подвергаясь влиянию других клиентов, для которых генерируются их собственные значения последовательности.

SESSION_USER()


SYSTEM_USER()

Возвращает имя текущего пользователя MySQL и имя хоста, с которого он подключился.

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

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

VERSION()

Возвращает строку, содержащую информацию о версии сервера MySQL:

Следует отметить, что если строка версии заканчивается на ‘-log’, это означает, что регистрация в журнале включена.

Прочие функции

FORMAT(X,D)

Форматирует число X в формате, подобном ‘ #,###,###.## ‘, округленное до D разрядов, и возвращает результат в виде строки. Если D равно 0, результат не имеет десятичной точки или дробной части.

GET_LOCK(строка, таймаут)

Пытается получить блокировку по имени, заданном строкой строка, с таймаутом длительностью таймаут секунд. Возвращает 1, если блокировка получена успешно, 0, если время ожидания превысило таймаут (например, из-за того, что другой клиент уже заблокировал это имя), либо NULL, если произошла ошибка (такая как переполнение памяти или уничтожение потока командой mysqladmin kill ). Если у вас есть блокировка, полученная через GET_LOCK(), она снимается после выполнения RELEASE_LOCK(), нового вызова GET_LOCK() либо разрыва соединения (как нормального, так и ненормального).

Эта функция может использоваться для реализации блокировок приложений или для эмуляции блокировок записей. Имена блокируются в глобальном контексте сервера. Если имя блокировано одним клиентом, GET_LOCK() блокирует любой запрос другого клиента на получение блокировки с тем же именем. Это позволяет клиентам согласовывать попытки доступа к общим ресурсам.

Следует отметить, что второй вызов RELEASE_LOCK() возвращает NULL, поскольку блокировка ‘ lock1 ‘ была автоматически снята вторым вызовом GET_LOCK().

INET_ATON(выражение)

Принимает сетевой адрес, представленный четырьмя числами с разделителем-точкой, и возвращает целое, представляющее числовое значение адреса. Адрес может быть 4- или 8-байтным.

Сгенерированное число всегда содержит байты в порядке, заданном в сетевом адресе. Для только что приведенного примера оно вычисляется как 209 * 256 3 + 207 * 256 2 + 224 * 256 + 40.

INET_ATON() также понимает IP-адреса в сокращенной форме:

INET_NTOA(выражение)

Принимает сетевой адрес в виде числа (4- или 8- байтного), возвращает адрес, представленный строкой, состоящей из четырех чисел, разделенных точкой.

IS_FREE_LOCK(строка)

Проверяет, свободна ли блокировка с именем строка. Возвращает 1, если блокировка свободна (никем не используется), 0, если занята, и NULL в случае ошибки.

IS_USED_LOCK(строка). Проверяет, используется ли блокировка с именем строка (то есть, установлена ли она). Если это так, возвращает идентификатор соединения клиента, который удерживает блокировку. В противном случае возвращает NULL.

MASTER_POS_WAIT(имя_журнала, позиция_в_журнале [, таймаут])

Эта функция удобна для управления синхронизацией главный/подчиненный. Блокирует главный сервер до тех пор, пока подчиненный сервер не прочитает и не проведет все изменения вплоть до указанной позиции в бинарном журнале главного сервера. Возвращаемое значение представляет количество событий в журнале, обработку которых нужно выполнить системе синхронизации, чтобы дойти до указанной позиции. Функция возвращает NULL, если поток SQL подчиненного сервера не запущен, либо информация о главном сервере не инициализирована на подчиненном, либо указаны неправильные аргументы. Возвращает -1, если истекло время таймаута. Если подчиненный сервер уже достиг указанной позиции, функция возвращает управление немедленно.

Если задано значение таймаут, MASTER_POS_WAIT() прекращает ожидание, когда истекают таймаут секунд. Значение таймаут может быть больше 0, а если его значение равно 0 или является отрицательным, то ожидания нет.

RELEASE_LOCK(строка)

Снимает блокировку с именем строка, которая была получена с помощью функции GET_LOCK(). Возвращает 1, если блокировка снята, 0, если блокировка была установлена другим потоком (а значит, не может быть снята), и NULL, если блокировка с таким именем не существует. Блокировка не существует, если не была установлена вызовом GET_LOCK(), либо она уже снята.

Возвращает Универсальный Уникальный Идентификатор (Universal Unique Identifier — UUID). Идентификатор UUID спроектирован как число, которое является глобально уникальным во времени и пространстве. Ожидается, что два вызова UUID сгенерируют два разных значения, даже если эти два вызова произойдут на двух разных компьютерах, которые не подключены друг к другу.

UUID — это 128-разрядное число, представленное в виде строки, состоящей из пяти шестнадцатеричных чисел в формате aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee:

  • Первые три числа генерируются на основе временной метки.
  • Четвертое число предохраняет темпоральную уникальность в случае, если значение временной метки теряет монотонность (например, из-за перехода на летнее время и обратно).
  • Пятое число — это номер узла IЕЕ 802, который представляет пространственную уникальность. Случайное число подставляется в случае, если последнее недоступно (например, если компьютер-хост не имеет сетевой платы Ethernet, или нет возможности извлечь аппаратный адрес интерфейса вашего компьютера). В этом случае пространственная уникальность не может быть гарантирована. Однако, несмотря на это, коллизии крайне маловероятны. В настоящее время МАС-адрес интерфейса принимается во внимание только в средах FreeBSD и Linux. В других операционных системах MySQL использует случайно сгенерированное 48-разрядное число.

Функции MySQL

Эти функции дают доступ к серверам БД MySQL. Информацию о MySQL см. на http://www.mysql.com/

Чтобы иметь возможность работать с этими функциями, вы обязаны скомпилировать РНР с поддержкой MySQL.

С помощью опции конфигурации --with-mysql вы включаете доступ PHP к БД MySQL. Если вы используете эту опцию без специфицирования пути к MySQL, PHP будет использовать встроенные клиентские библиотеки MySQL. В PHP4 поддержка MySQL всегда включена; Если вы не специфицируете эту опцию конфигурации, используются связанные библиотеки. Пользователи, запускающие другие приложения, которые используют MySQL (например, при запуске PHP 3 и PHP 4 как конкурирующих модулей Аpache, или auth-mysql), всегда должны специфицировать путь к MySQL: --with-mysql=/path/to/mysql. Это заставит PHP использовать клиентские библиотеки, установленные MySQL, исключая любые конфликты.

При загрузке этого расширения вместе с расширением recode могут возникать проблемы со стартом и обломом РНР. См. расширение recode.

Установка

Поведение функций MySQL определяется установками в глобальном файле конфигурации php.ini.

Таблица 1. Опции конфигурации MySQL
Предупреждение!
Имя По умолчанию Изменяемая
mysql.allow_persistent «On» PHP_INI_SYSTEM
mysql.max_persistent «-1» PHP_INI_SYSTEM
mysql.max_links «-1» PHP_INI_SYSTEM
mysql.default_port NULL PHP_INI_ALL
mysql.default_socket NULL PHP_INI_ALL
mysql.default_host NULL PHP_INI_ALL
mysql.default_user NULL PHP_INI_ALL
mysql.default_password NULL PHP_INI_ALL

Дополнительные детали и определение констант PHP_INI_* см. в ini_set().

Вот краткое описание директив конфигурации.

Максимальное количество постоянных MySQL-соединений на процесс.

Максимальное количество постоянных MySQL-соединений на процесс, включая постоянные соединения.

Номер порта по умолчанию TCP для использования при соединении с сервером БД, если иной порт не специфицирован. Если порт по умолчанию не специфицирован, значение получается из переменной окружения MYSQL_TCP_PORT, вхождения mysql-tcp в /etc/services или константы времени компиляции MYSQL_PORT, в указанном порядке. Win32 используют только константу MYSQL_PORT.


Имя сокета по умолчанию для использования при соединении с локальным сервером БД, если иное имя сокета не специфицировано.

Хост сервера по умолчанию для использования при соединении с локальным сервером БД, если другой хост не специфицирован. Не примеряется в режиме safe mode.

Имя пользователя по умолчанию для использования при соединении с сервером БД, если иное имя не специфицировано. Не применяется в режиме safe mode.

Пароль по умолчанию для использования при соединении с сервером БД, если иной пароль не специфицирован. Не применяется в режиме safe mode.

Типы ресурсов

Есть два типа ресурсов, используемых в MySQL-модуле. Первый это идентификатор ссылки для соединения с БД, второй — ресурс, содержащий результат выполнения запроса.

Предопределённые константы

Функция mysql_fetch_array() использует константу для различных типов результирующих массивов. Определены следующие константы:

Таблица 2. Константы извлечения MySQL
константа значение
MYSQL_ASSOC Столбцы возвращаются в массиве, содержащем имя поля как индекс массива.
MYSQL_BOTH Столбцы возвращаются в массиве, содержащем числовой индекс и имя поля как индекс массива.
MYSQL_NUM Столбцы возвращаются в массиве, содержащем числовой индекс полей. Этот индекс начинается с 0, первого поля результата.
MYSQL_STORE_RESULT Специфицирует, что MySQL-результат должен буферизоваться.
MYSQL_USE_RESULT Специфицирует, что MySQL-результат не должен буферизоваться.

Примеры

Данный пример показывает, как соединиться с БД, выполнить запрос/query, напечатать результирующие ряды и отсоединиться от БД MySQL.

zoonman ·ru ПроектыСтатьи и заметки

Внимание! Данная работа построена на основе перевода раздела «17.1. Stored Routines and the Grant Tables» описания ПО MySQL 5.0.19, «Reference Manual. It documents MySQL 5.0 through 5.0.19. Document generated on: 2006-01-23 (revision:995)»
«Сначала прочти все, а потом пробуй примеры»

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

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

Хранимые программы (процедуры и функции) поддерживаются в MySQL 5.0. Хранимые процедуры – набор SQL -выражений, который может быть сохранен на сервере. Как только это сделано, клиенту уже не нужно повторно передавать запрос, а требуется просто вызвать хранимую программу.

Это может быть полезным тогда, когда:

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

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

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

MySQL следует в синтаксисе за SQL:2003 для хранимых процедур, который уже используется в IBM’s DB2.

От слов к делу…

Хранимые процедуры требуют наличия таблицы proc в базе mysql . Эта таблица обычно создается во время установки сервера БД. Если вы апгрейдите СУБД более ранних версий, то вам следует почитать секцию 2.10.3, “Upgrading the Grant Tables”. Сейчас вместо нее читайте Upgrade MySQL System Tables.

При создании, модификации, удалении хранимых подпрограмм сервер манипулирует с таблицей mysql.proc

Начиная с MySQL 5.0.3 требуются следующие привилегии:

CREATE ROUTINE для создания хранимых процедур

ALTER ROUTINE необходимы для изменения или удаления процедур. Эта привилегия автоматически назначается создателю процедуры (функции)

EXECUTE привилегия потребуется для выполнения подпрограммы. Тем не менее, автоматически назначается создателю процедуры (функции). Также, по умолчанию, SQL SECURITY параметр для подпрограммы DEFINER , который разрешает пользователям, имеющим доступ к БД вызывать подпрограммы, ассоциированные с этой БД.

Синтаксис хранимых процедур и функций

Хранимая подпрограмма представляет собой процедуру или функцию. Хранимые подпрограммы создаются с помощью выражений CREATE PROCEDURE или CREATE FUNCTION . Хранимая подпрограмма вызывается, используя выражение CALL , причем только возвращающие значение переменные используются в качестве выходных. Функция может быть вызвана подобно любой другой функции и может возвращать скалярную величину. Хранимые подпрограммы могут вызывать другие хранимые подпрограммы.

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

    Когда подпрограмма вызывается, то подразумевается, что надо произвести вызов USE db_name (и отменить использование базы, когда подпрограмма завершилась, и база больше не потребуется)

  • Вы можете квалифицировать обычные имена с именем базы данных. Это может быть использовано, чтобы ссылаться на подпрограмму, которая — не в текущей базе данных. Например, для выполнения хранимой процедуры p или функции f которые связаны с БД test , вы можете сказать интерпретатору команд так: CALL test.p() или test.f() .
  • Когда база данных удалена, все загруженные подпрограммы связанные с ней тоже удаляются. В MySQL 5.0.0, загруженные подпрограммы — глобальные и не связанны с базой данных. Они наследуют по умолчанию базу данных из вызывающего оператора. Если USE db_name выполнено в пределах подпрограммы, оригинальная текущая БД будет восстановлена после выхода из подпрограммы (Например текущая БД db_11 , делаем вызов подпрограммы, использующей db_22 , после выхода из подпрограммы остается текущей db_11 )
  • MySQL поддерживает полностью расширения, которые разрешают юзать обычные SELECT выражения (без использования курсоров или локальных переменных) внутри хранимых процедур. Результирующий набор, возвращенный от запроса, а просто отправляется напрямую клиенту. Множественный SELECT запрос генерирует множество результирующих наборов, поэтому клиент должен использовать библиотеку, поддерживающую множественные результирующие наборы.

    CREATE PROCEDURE – создать хранимую процедуру.

    CREATE FUNCTION – создать хранимую функцию.

    Синтаксис:

    Рассмотрим все на практике.

    Сначала создадим хранимую процедуру следующим запросом:

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

    После этого вызовем ее:

    Для отделения внутреннего запроса от внешнего всегда используют разделитель отличный от обычно (для задания используют команду DELIMITER )

    Вот еще один пример с учетом всех требований.

    Весь процесс можно пронаблюдать на рисунке ниже:

    Триггеры

    Поддержка триггеров появилась в MySQL начиная с версии 5.0.2.

    Триггер – поименованный объект БД, который ассоциирован с таблицей и активируемый при наступлении определенного события, события связанного с этой таблицей.

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

    Объявим переменную sum и присвоим ей значение 1. После этого при каждой вставке в таблицу account значение этой переменной будет увеличивать согласно вставляемой части.

    Замечание. Если значение переменной не инициализировано, то триггер работать не будет!

    Синтаксис создания триггера

    Если с именем триггера и именем пользователя все понятно сразу, то о «времени триггера» и «событии» поговорим отдельно.

    время_триггера

    Определяет время свершения действия триггера. BEFORE означает, что триггер выполнится до завершения события срабатывания триггера, а AFTER означает, что после. Например, при вставке записей (см. пример выше) наш триггер срабатывал до фактической вставки записи и вычислял сумму. Такой вариант уместен при предварительном вычислении каких-то дополнительных полей в таблице или параллельной вставке в другую таблицу.

    событие_срабатывания_триггера

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

    • INSERT: т.е. при операциях вставки или аналогичных ей выражениях (INSERT, LOAD DATA, и REPLACE)
    • UPDATE: когда сущность (строка) модифицирована
    • DELETE: когда запись удаляется (запросы, содержащие выражения DELETE и/или REPLACE)

    Функции базы данных MySQL

    Как и в PHP-сценариях, в запросах к базе данных MySQL можно использовать функции. Мы рассмотрим несколько категорий, начиная с функций для работы со строками. Другие крупные категории, о которых вы узнаете, – это функции для работы с датой и временем.

    Продолжение урока будет доступно вам
    после покупки курса MySQL с нуля

    Об авторе

    Если вам интересно узнать
    как я стал программистом,
    читайте вот эту статью.

    Встроенные функции

    Функции для работы со строками

    Для работы со строка в MySQL определен ряд встроенных функций:

    CONCAT : объединяет строки. В качестве параметра принимает от 2-х и более строк, которые надо соединить:

    При этом в функцию можно передавать не только непосредственно строки, но и числа, даты — они будут преобразовываться в строки и также объединяться.


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

    LENGTH : возвращает количество символов в строке. В качестве параметра в функцию передается строка, для которой надо найти длину:

    LTRIM : удаляет начальные пробелы из строки. В качестве параметра принимает строку:

    RTRIM : удаляет конечные пробелы из строки. В качестве параметра принимает строку:

    TRIM : удаляет начальные и конечные пробелы из строки. В качестве параметра принимает строку:

    С помощью дополнительного оператора можно задать где имеено удалить пробелы: BOTH (в начале и в конце), TRAILING (только в конце), LEADING (только в начале):

    LOCATE(find, search [, start]) : возвращает позицию первого вхождения подстроки find в строку search. Дополнительный параметр start позволяет установить позицию в строке search, с которой начинается поиск подстроки find. Если подстрока search не найдена, то возвращается 0:

    LEFT : вырезает с начала строки определенное количество символов. Первый параметр функции — строка, а второй — количество символов, которые надо вырезать сначала строки:

    RIGHT : вырезает с конца строки определенное количество символов. Первый параметр функции — строка, а второй — количество символов, которые надо вырезать сначала строки:

    SUBSTRING(str, start [, length]) : вырезает из строки str подстроку, начиная с позиции start. Третий необязательный параметр передает количество вырезаемых символов:

    SUBSTRING_INDEX(str, delimiter, count) : вырезает из строки str подстроку. Параметр delimiter определяет разделитель внутри строки. А параметр count определяет, до какого вхождения разделителя надо вырезать подстроку. Если count положительный, то подстрока вырезается с начала, если count отрицательный, то с конца строки str:

    REPLACE(search, find, replace) : заменяет в строке find подстроку search на подстроку replace. Первый параметр функции — строка, второй — подстрока, которую надо заменить, а третий — подстрока, на которую надо заменить:

    INSERT(str, start, length, insert) : вставляет в строку str, заменяя length символов с позиции start подстрокой insert. Первый параметр функции — строка, второй — позиция, с которой надо заменить, третий — сколько символов с позиции start надо заменить вставляемой подстрокой, четвертый параметр — вставляемая подстрока:

    REVERSE : переворачивает строку наоборот:

    LOWER : переводит строку в нижний регистр:

    UPPER : переводит строку в верхний регистр

    SPACE : возвращает строку, которая содержит определенное количество пробелов

    REPEATE(str, count) : возвращает строку, которая содержит определенное количество повторов подстроки str. Количество повторов задается через параметр count.

    LPAD(str, length, pad) : добавляет слева от строки str некоторое количество символов, которые определены в параметре pad. Количество добавляемых символов вычисляется по формуле length — LENGTH(str) . Если параметр length меньше длины строки str, то эта строка усекается до length символов.

    RPAD(str, length, pad) : добавляет справа от строки str некоторое количество символов, которые определены в параметре pad. Количество добавляемых символов вычисляется по формуле length — LENGTH(str) . Если параметр length меньше длины строки str, то эта строка усекается до length символов.

    Например, возьмем таблицу:

    И при извлечении данных применим строковые функции:

    Тема: Функции MySQL

    Опции темы
    Поиск по теме

    Функции MySQL

    Для версий MySQL R5-R6, MySQL R33

    Mysql connect
    mysql_connect — Функция подключения плагина к серверу.

    Возвращает Номер подключения

    Mysql close
    mysql_close — Функция закрытия соединения с базой данных.

    connectionHandle Номер подключения возвращённый функцией mysql_connect.

    Возвращает Результат (0 или 1).

    Mysql debug
    mysql_debug — функция включение логирования действий MySQL плагина.

    enable Включить (1) либо выключить (0) логирование. По умолчанию 1.

    Mysql ping
    mysql_ping — Функция закрытия соединения с базой данных.

    connectionHandle Номер подключения возвращённый функцией mysql_connect.

    Возвращает Статус базы (0-соединение потеряно, или 1-соединение присутствует).

    Операторы:
    Операторы определения данных (Data Definition Language, DDL)

    CREATE создает объект БД (саму базу, таблицу, представление, пользователя и т. д.)
    Стандарт SQL-92 определяет команду CREATE в вариантах:

    CREATE ASSERTION — создание утверждения для проверки
    CREATE CHARACTER SET — создание набора символов
    CREATE COLLATION — создание правила сортировки для набора символов
    CREATE DOMAIN — создание домена (пользовательского типа данных столбца).
    CREATE SCHEMA — создание схемы (именованной группы объектов)
    CREATE TABLE — создание таблицы базы данных
    CREATE TRANSLATION — создание правила преобразования (трансляции) из одного набора символов в другой (используется в операторе TRANSLATE)
    CREATE VIEW — создание представления данных

    ALTER изменяет объект

    ALTER TABLE — данный запрос используется для добавления, удаления или модификации колонки в уже существующей таблице.

    Пример:
    Для добавления колонки в таблицу, используйте следующий синтаксис:

    DROP удаляет объект

    DROP TABLE Удаляет одно или больше определений таблиц и все данные, индексы, триггеры, ограничения и разрешения для этих таблиц. Любое представление или хранимая процедура, ссылающаяся на удаленную таблицу, должна быть явно удалена с помощью инструкции

    Структура:
    DROP VIEW или DROP PROCEDURE. Получить отчет о зависимостях в таблице можно с помощью sys.dm_sql_referencing_entities.

    database_name Имя базы данных, в которой создана таблица.
    schema_name Имя схемы, которой принадлежит таблица.
    table_name Имя таблицы, предназначенной для удаления.

    Инструкцию DROP TABLE нельзя использовать для удаления таблицы, на которую ссылается ограничение FOREIGN KEY. Сначала следует удалить ссылающееся ограничение FOREIGN KEY или ссылающуюся таблицу. Если и ссылающаяся таблица, и таблица, содержащая первичный ключ, удаляются с помощью одной инструкции DROP TABLE, ссылающаяся таблица должна быть первой в списке.

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

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

    При удалении всех строк в таблице с помощью инструкции DELETE tablename или TRUNCATE TABLE таблица продолжает существовать, пока она не будет удалена.

    Большие таблицы и индексы из более чем 128 экстентов удаляются в два этапа: логический и физический. На логическом этапе существующие единицы распределения, используемые в таблице, отмечаются для освобождения и остаются заблокированными до фиксации транзакции. На физическом этапе страницы IAM, отмеченные для освобождения, физически удаляются пакетами. Дополнительные сведения см. в разделе Удаление и повторная сборка больших объектов.

    При удалении таблицы, которая содержит столбец VARBINARY(MAX) с атрибутом FILESTREAM, не будут удалены никакие данные, которые хранятся в файловой системе.

    Примеры:
    Удаление таблицы из текущей базы данных:

    Функция MySQL IFNULL

    В этой статье мы расскажем о функции MySQL IFNULL . Это удобная функция для обработки значений NULL .

    Общие сведения

    IFNULL является одной из функций потока управления MySQL , которая принимает два аргумента и возвращает первый, если он не равен NULL . Иначе она возвращает второй аргумент.

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

    Если вы хотите вернуть значение, исходя из соответствия условию TRUE или FALSE , а не NULL , вам следует использовать функцию IF .

    Примеры применения функции

    Посмотрите следующие примеры применения функции MySQL IFNULL :

    Как это работает:

    • IFNULL (1,0) возвращает 1 , потому что 1 не равно NULL ;
    • IFNULL (», 1) возвращает », потому что строка не является NULL ;
    • IFNULL (NULL, «IFNULL function») возвращает строку IFNULL function , потому что первый аргумент — NULL .

    Рассмотрим практический пример использования функции MySQL IFNULL .

    Сначала создайте новую таблицу под названием contacts , используя следующий запрос:

    Запись каждого контакта содержит имя, рабочий и домашний телефон. Затем вставьте данные в таблицу contacts :

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

    Было бы неплохо, если бы мы могли получить домашний телефон контакта, если рабочий телефон недоступен. В этом нам поможет функция IFNULL . Она вернет домашний телефон, если рабочий телефон — NULL .

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

    Необходимо избегать использования функции в операторе WHERE , поскольку это уменьшает производительность запроса. И вам может показаться, что MySQL IFNULL не работает.

    Если вы хотите проверить, является ли значение NULL или нет, можно использовать в операторе WHERE IS NULL или IS NOT NULL .

    В этой статье мы познакомились с функцией MySQL IFNULL и узнали, как использовать ее в запросах.

    Данная публикация представляет собой перевод статьи « MySQL IFNULL » , подготовленной дружной командой проекта Интернет-технологии.ру


    Введение в хранимые функции MySQL 5

    Хранимые процедуры MySQL (часть 2)

    В этой части статьи допишем начатую в предыдущей статье хранимую процедуру и научимся создавать хранимые mysql функции.

    И так нам осталось указать значение для последней переменной PostID. В качестве значения ей будет присвоен результат, который вернёт функция GetPostID, которую сейчас и создадим.

    Создание функции

    Для начала закрываем текущую форму создания процедуры, нажав на кнопку c надписью Go. Затем в этом же окне снова нажимаем на надпись Add routine, появится знакомая форма, заполним её.

    Так же можно указать дополнительные параметры:

    Is deterministic — детерминированная функция всегда возвращает один и тот же результат при одинаковых входных параметрах иначе она является не детерминированной. В нашем случае ставим галочку.

    Definer и Security type параметры безопасности, в данном примере оставим их без изменений.

    SQL data access имеет несколько значений:

    NO SQL — не содержит sql.

    Contains SQL — содержит встроенные sql функции или операторы, которые не читают, не пишут и не изменяют данные в базе данных. Например, установка значения переменной: SET name = значение;

    READS SQL DATA — только чтение данных, без любой модификации данных, указывается для запроса SELECT.

    MODIFIES SQL DATA — изменение или внесение данных, в базу данных, указывается для запросов: INSERT, UPDATE, но при этом не должен присутствовать запрос SELECT.

    В нашей функции используется запрос SELECT, укажем READS SQL DATA.

    Comment комментарий.

    После того как все поля заполнены, нажимаем на кнопку с надписью Go.

    Возвращаемся на вкладку Routines и отредактируем нашу процедуру, нажав на кнопку edit.

    Присвоим переменой PostID в качестве значения результат, который вернёт функция GetPostID.

    В результате окончательное тело процедуры будет таким

    Остальные поля формы оставим без изменений, нажимаем на кнопку Go. Процедура создана.

    Так же можно установить значения для одной или нескольких переменных в результате выполнения запроса. Например, поля: Автор, почта и id пользователя хранятся в таблице wp_users.

    Зная это можно установить значения для этих переменных следующим образом:

    Вызов хранимой процедуры

    Осталось протестировать созданную процедуру. Для начала добавим комментарий к любой статье, одобрим его и проверим, чтобы он отображался на странице.

    Затем узнаем id добавленного комментария

    Возвращаемся на вкладку Routines и нажимаем на надпись Execute

    Указываем значения передаваемых параметров: текст ответа и id комментария, после чего нажимаем на кнопку с надписью Go.

    Если ошибок нет, то открываем страницу и смотрим на результат.

    Второй способ выполнить процедуру на сервере.

    Открываем вкладку SQL

    С помощью оператора CALL производим вызов нашей процедуры

    Если ошибок нет, то должны увидеть новый комментарий на странице.

    Функции СУБД MySQL

    Примечания

    Большинство функций MySQL принимают link_identifier как последний, опциональный параметр. Если он не указан, то используется последнее открытое соединение. Если соединений нет, то модуль пытается открыть соединение используя параметры, указанные в php.ini . В случае неудачи, функции возвращают FALSE . FALSE .

    Содержание

    • mysql_affected_rows — Возвращает число затронутых прошлой операцией рядов
    • mysql_client_encoding — Возвращает кодировку соединения
    • mysql_close — Закрывает соединение с сервером MySQL
    • mysql_connect — Открывает соединение с сервером MySQL
    • mysql_create_db — Создает базу данных MySQL
    • mysql_data_seek — Перемещает внутренний указатель в результате запроса
    • mysql_db_name — Возвращает название базы данных из вызова к mysql_list_dbs
    • mysql_db_query — Переключается на указанную базу данных и посылает запрос
    • mysql_drop_db — Уничтожает базу данных MySQL
    • mysql_errno — Возвращает численный код ошибки выполнения последней операции с MySQL
    • mysql_error — Возвращает текст ошибки последней операции с MySQL
    • mysql_escape_string — Экранирует строку для использования в mysql_query
    • mysql_fetch_array — Обрабатывает ряд результата запроса, возвращая ассоциативный массив, численный массив или оба
    • mysql_fetch_assoc — Возвращает ряд результата запроса в качестве ассоциативного массива
    • mysql_fetch_field — Возвращает информацию о колонке из результата запроса в виде объекта
    • mysql_fetch_lengths — Возвращает длину каждого поля в результате
    • mysql_fetch_object — Обрабатывает ряд результата запроса и возвращает объект
    • mysql_fetch_row — Обрабатывает ряд результата запроса и возвращает массив с числовыми индексами
    • mysql_field_flags — Возвращает флаги, связанные с указанным полем результата запроса
    • mysql_field_len — Возвращает длину указанного поля
    • mysql_field_name — Возвращает название указанной колонки результата запроса
    • mysql_field_seek — Устанавливает внутренний указатель результата на переданное смещение поля
    • mysql_field_table — Возвращает название таблицы, которой принадлежит указанное поле
    • mysql_field_type — Возвращает тип указанного поля из результата запроса
    • mysql_free_result — Освобождает память от результата запроса
    • mysql_get_client_info — Возвращает данные о MySQL-клиенте
    • mysql_get_host_info — Возвращает информацию о соединении с MySQL
    • mysql_get_proto_info — Возвращает информацию о протоколе MySQL
    • mysql_get_server_info — Возвращает информацию о сервере MySQL
    • mysql_info — Возвращает информацию о последнем запросе
    • mysql_insert_id — Возвращает идентификатор, сгенерированный при последнем INSERT-запросе
    • mysql_list_dbs — Возвращает список баз данных, доступных на сервере
    • mysql_list_fields — Возвращает список колонок таблицы
    • mysql_list_processes — Возвращает список процессов MySQL
    • mysql_list_tables — Возвращает список таблиц базы данных MySQL
    • mysql_num_fields — Возвращает количество полей результата запроса

    • mysql_num_rows — Возвращает количество рядов результата запроса
    • mysql_pconnect — Устанавливает постоянное соединение с сервером MySQL
    • mysql_ping — Проверяет соединение с сервером и пересоединяется при необходимости
    • mysql_query — Посылает запрос MySQL
    • mysql_real_escape_string — Экранирует специальные символы в строках для использования в выражениях SQL
    • mysql_result — Возвращает данные результата запроса
    • mysql_select_db — Выбирает базу данных MySQL
    • mysql_set_charset — Устанавливает кодировку клиента
    • mysql_stat — Возвращает текущий статус сервера
    • mysql_tablename — Возвращает имя таблицы, содержащей указанное поле
    • mysql_thread_id — Возвращает идентификатор текущего потока
    • mysql_unbuffered_query — Посылает запрос MySQL без авто-обработки результата и его буферизации

    User Contributed Notes 38 notes

    @Amanda 12-Oct-2007 09:58

    I almost had to ask myself if this was a real question. If the MySQL server rejects the connection attempt then, yes, MySQL would be able to send back an error to PHP. And if PHP can’t access the target MySQL server at all then it is also smart enough to issue the appropriate error all by itself.

    Hi, here’s a nice little trick to select records in random order from a table in a MySQL database prior to version 3.23

    SELECT *, (ItemID/ItemID)*RAND() AS MyRandom FROM Items ORDER BY MyRandom

    [Editors note: And just «SELECT * FROM foo ORDER BY RAND()» after 3.23]

    After finally getting IIS, PHP, and MySQL on a new Windows XP machine, I decided to write the steps I took so you can see how it was done: http://www.atksolutions.com/articles/install_php_mysql_iis.html

    Hope this helps.

    If you want to replicate the output of `mysql —html`, printing your results in a HTML table, see this function:

    If you have a Windows machine running a webserver with PHP you don’t need to install MySQL server to locally test scripts, if you are granted to establish a Secure Telnet connection (port 22) to the remote webserver.

    To do this you need a Secure Telnet client, which supports port-forwarding.
    Before you establish a connection, define the port-forward.
    Forward local port 3306 to [name or ip of remote server]:3306
    Make sure that local ports accept connections from other hosts
    Save this session

    Connect to remote server with username and password
    Minimize the shell and that’s it.

    You can use the same username (and password) as if you were working on the remote server !
    E.g. : $link = mysql_connect(«localhost», «root», «») or die(«no way jose»);

    You may get a shell-timeout after xx minutes depending on your remote server, just reconnect or press enter in the shell once in a while.

    An example of a superb freeware Secure Telnet client is Putty : Putty : http://www.chiark.greenend.org.uk/

    This ‘discovery’ really has saved me a lot of time because I don’t have to upload the scripts to the remote server time and time again, pressing [save] is enough, heh (-:

    A note on resources

    When a resource (e.g. a link identifier) runs out of scope, it is deleted and the associated computer resources (e.g. the tcp link to the database) will be terminated as well. So far so good!
    However, in the following code the tcp mysql link persists until the end of execution:
    = mysql_connect ( ‘hostname’ , ‘username’ , ‘password’ );
    $conn = null ;
    sleep ( 30 );
    ?>
    This is because the internally the link-identifier is being saved, so that subsequent mysql functions will work. There seems to be no way to delete this internal reference.
    If you were, however, to open 2 connections, the oldest one will be deleted automatically (so the connection to hostname will terminate at the $conn=null statement, the connection to hostname2 will exist till the end of the script).
    = mysql_connect ( ‘hostname’ , ‘username’ , ‘password’ );
    $conn2 = mysql_connect ( ‘hostname2’ , ‘username’ , ‘password’ );
    $conn = null ;
    $conn2 = null ;
    sleep ( 30 );
    ?>

    Here a mysql helper containing the main functions of the mysql extension. It’s easy to understand for a beginner and quite useful because queries are secure. It understands what you want, just write your sql query. I called it mysql_magic.

    // Examples
    $nb_affected = mysql_magic ( ‘delete from users’ );
    $nb = mysql_magic ( ‘select count(*) from users’ );
    $one_row = mysql_magic ( ‘select * from users limit 1’ );
    $all_rows = mysql_magic ( ‘select * from users where name = ?’ , ‘John’ );
    $id = mysql_magic ( ‘insert into users(name,rank) values(. )’ , ‘Vincent’ , 3 );
    ?>

    // Usage: mysql_magic($query [, $arg. ]);
    function mysql_magic ()
    <
    global $dblink , $sqlhost , $sqluser , $sqlpass , $sqlbase ;
    $narg = func_num_args ();
    $args = func_get_args ();

    if (! $dblink )
    <
    $dblink = mysql_connect ( $sqlhost , $sqluser , $sqlpass );
    mysql_select_db ( $sqlbase , $dblink );
    >

    $req_sql = array_shift ( $args );
    $req_args = $args ;

    $req_query = mysql_bind ( $req_sql , $req_args );
    $req_result = mysql_query ( $req_query );

    if (! $req_result )
    <
    trigger_error ( mysql_error ());
    return false ;
    >

    if ( startsWith ( $req_sql , ‘delete’ ) || startsWith ( $req_sql , ‘update’ ))
    <
    return mysql_affected_rows (); // -1 || N
    >
    else if ( startsWith ( $req_sql , ‘insert’ ))
    <
    return mysql_insert_id (); // ID || 0 || FALSE
    >
    else if ( endsWith ( $req_sql , ‘limit 1’ ))
    <
    return mysql_fetch_assoc ( $req_result ); // [] || FALSE
    >
    else if ( startsWith ( $req_sql , ‘select count(*)’ ))
    <
    $line = mysql_fetch_row ( $req_result );
    return $line [ 0 ]; // N
    >
    else
    <
    return mysql_fetch_all ( $req_result ); // [][]
    >
    >

    function mysql_bind ( $sql , $values =array())
    <
    foreach ( $values as & $value ) $value = mysql_real_escape_string ( $value );
    $sql = vsprintf ( str_replace ( ‘?’ , «‘%s'» , $sql ), $values );
    return $sql ;
    >

    function mysql_fetch_all ( $result )
    <
    $resultArray = array();
    while(( $resultArray [] = mysql_fetch_assoc ( $result )) || array_pop ( $resultArray ));
    return $resultArray ;
    >

    function startsWith ( $haystack , $needle , $case = false ) <
    if( $case )
    return ( strcasecmp ( substr ( $haystack , 0 , strlen ( $needle )), $needle )=== 0 );
    >

    function endsWith ( $haystack , $needle , $case = false ) <
    if( $case )
    return ( strcasecmp ( substr ( $haystack , strlen ( $haystack ) — strlen ( $needle )), $needle )=== 0 );
    >
    ?>

    Don’t forget to set $sqlhost, $sqluser, $sqlpass and $sqlbase.

    $query = «SELECT username FROM users WHERE username REGEXP ‘$username[0-9*]'»;

    PHP may read $username[, *including* the open square bracket, and may think you are trying to get into an array.

    You should use this instead:

    $query = «SELECT username FROM users WHERE username REGEXP ‘$[0-9*]'»;

    $query = «SELECT username FROM users WHERE username REGEXP ‘$username» . «[0-9*]'»;

    [Editor’s Note: In MySQL v5.0+, you can use the INFORMATION_SCHEMA tables to retrieve information on tables, views, databases and so on. —zak@php.net]

    Here is a small function to parse a mysql creation table DDL. The function takes a string with the SQL code to create a table and returns the table name, table fields, table key fields and fields type, all in arrays (except by the name, obviously). The function requires that the primary key be named «id» and the foreign keys named «id. «. All foreign key types are suposed to be int (or its variations, bigint, etc. ). All those restrictions are easily modified to others needs.

    Here is a example of a DDL code.

    CREATE TABLE `telefones` (
    `id` int(11) NOT NULL auto_increment,
    `id_tipo_telefone` int(11) NOT NULL default ‘0’,
    `numero` varchar(15) NOT NULL default »,
    `id_pessoa` int(11) NOT NULL default ‘0’,
    PRIMARY KEY (`id`),
    KEY `id_tipo_telefone` (`id_tipo_telefone`),
    KEY `id_pessoa` (`id_pessoa`),
    CONSTRAINT `0_775` FOREIGN KEY (`id_tipo_telefone`) REFERENCES `tipos_telefone` (`id`),
    CONSTRAINT `0_776` FOREIGN KEY (`id_pessoa`) REFERENCES `pessoas` (`id`)
    ) TYPE=InnoDB

    $tbname = «telefones»
    $fields = array(«numero»);
    $kfields = array(«id_tipo_telefone»,»id_pessoa»);
    $tipos = array(«varchar»);

    function parseQuery ( $Q , & $tbname , & $fields , & $kfields , & $tipos ) <

    /** rules to a corect parse:
    *
    * 1 — primary key must be named «id»
    * 2 — foreign key must be named «id. » eg.: id_field
    * 3 — lowercase is recomended
    */

    $Q = str_replace (array( chr ( 10 ), chr ( 13 )), » » , $Q );
    $Q = str_replace (array( «‘» , «`» ), » » , $Q );

    $part1 = $A [ 1 ];
    $part2 = $A [ 2 ];
    $part3 = $A [ 3 ];

    preg_match ( «/(.*) ([a-zA-Z_]+)/» , $part1 , $A );

    $tbname = strtolower ( $A [ 2 ]);

    $temp = split ( «,» , $part2 );
    foreach ( $temp as $t ) <
    preg_match ( «/ *([a-zA-Z_]+) +([a-zA-Z_]+)(.*)/» , $t , $A );
    $pcampo = strtolower ( $A [ 1 ]);
    $ptipo = strtolower ( $A [ 2 ]);
    if (! preg_match ( «/ $pcampo /» , «primary key constraint id unique foreign» ) ) <
    if ( ( $pcampo [ 0 ] == «i» ) && ( $pcampo [ 1 ] == «d» ) )
    $kfields [] = $pcampo ;
    else <
    $fields [] = $pcampo ;
    $tipos [] = $ptipo ;
    >
    >
    >
    >
    ?>

    Enabling MySQL with Windows Server 2003/IIS 6.0:
    Find your php.ini file first, check phpinfo() to see where php is currently looking for php.ini. (i.e. Using the Windows installer for PHP 5.0.4, the php.ini file was placed in the C:\Windows dir.) I recommend, however, that you don’t use the installer — go with full manual install.

    Set the following in php.ini:
    display_errors = on
    error_reporting = E_ALL
    This will make sure that you’ll see any errors that arise during configuration. MAKE SURE TO CORRECT THESE WHEN YOU ARE DONE PLAYING WITH PHP.INI! Do not leave these settings like this on a production machine.

    In php.ini set the following:
    extension_dir = «pathtoextensions (ususally [yourpathtophp]\ext)»
    extension=php_mysql.dll (make sure this is un-commented if its already in your php.ini)

    In IIS, open Web Service Extensions, click «Add a new Web service extension. «
    Type-in PHP for the extension name
    Under required files:
    Add [yourpathtophp]\php5isapi.dll
    Add [yourpathtophp]\php5ts.dll
    Click ‘Apply’ then click ‘OK’

    Create web sites like you normally would, but make sure they have executable permissions, not just script access. Under the «Home Directory» tab, click ‘Configuration’. Scroll down the list at the top and see if you can find PHP. If you do, make sure the path to the executable for PHP is correct. If you don’t find PHP in the list, click ‘Add. ‘, then browse to the correct executable, [yourpathtophp]\php5isapi.dll, and click OK. In the extension field, enter ‘PHP’. Verbs should already be set to ‘All verbs’, leave it like that.

    Create a test page with this code:

    call it test.php, and place this file into the web site you just created. Browse to the page, with firefox preferably ;), and make sure that you have a MySql section with some MySql info in there. If not, then your paths are possibly screwed up, or you’re still not editing the correct php.ini (again, look at the location that phpinfo() shows you, and just edit it there if you have to, then move it afterwards and re-config).

    Hope this helps!

    /*
    MySQL (Community) Server Installation on 32-bit Windows XP running Apache

    On Windows, the recommended way to run MySQL is to install it as a Windows service, whereby MySQL starts and stops automatically when Windows starts and stops. A MySQL server installed as a service can also be controlled from the command line commands, or with the graphical Services utility like phpMyAdmin.

    PHP — MySQL CONNECTORS (php_mysql.dll and php_mysqli.dll as extensions)
    MySQL provides the mysql and mysqli extensions for the Windows operating system on http://dev.mysql.com/downloads/connector/php/ for MySQL version 4.1.16 and higher, MySQL 5.0.18, and MySQL 5.1. As with enabling any PHP extension in php.ini (such as php_mysql.dll), the PHP directive extension_dir should be set to the directory where the PHP extensions are located.

    MySQL is no longer enabled by default, so the php_mysql.dll DLL must be enabled inside of php.ini. Also, PHP needs access to the MySQL client library. A file named libmysql.dll is included in the Windows PHP distribution and in order for PHP to talk to MySQL this file needs to be available to the Windows systems PATH.

    Following PHP Script is useful to test PHP connection with MySQL.
    */

    //$connect = mysql_connect(«Your Host Name», «MySQL root directory», ‘MySQL password, if any’);
    //$connect = mysql_connect(«Host Name or Address — 127.0.0.1», «root», ‘password’);
    $connect = mysql_connect ( «localhost» , «root» , ‘password’ );
    if ( $connect )<
    echo «Congratulations!\n
    » ;
    echo «Successfully connected to MySQL database server.\n
    » ;
    >else <
    $error = mysql_error ();
    echo «Could not connect to the database. Error = $error .\n
    » ;
    exit();
    >

    // Closing connection
    $close = mysql_close ( $connect );
    if ( $close )<
    echo «\n
    » ;
    echo «Now closing the connection. \n
    » ;
    echo «MySQL connection closed successfully as well.\n
    » ;
    >else<
    echo «There’s a problem in closing MySQL connection.\n
    » ;
    >
    exit();
    ?>

    In response to Conrad Decker’s post below:

    If your tables contain foreign key constraints you will not be able to properly restore from a datafile created by mysqldump.

    mysqldump dumps table data in alphabetical order, not in the logical order required by the foreign key constraints.

    John Coggeshall wrote a PHP5 ext/mysqli compatibility script for applications that still use the old ext/mysql functions. This prevents the hassle of trying to have both the mysql and mysqli extensions loaded in PHP5, which can be tricky.

    i’m fairly new to this but have just managed to set up (on windows xp) apache 2.0.54 with php 5.0.4 and mySQL 4.1.13, also phpMyAdmin 2.6.4 having had exactly the problems reported by so many others. i wasnt actually aware of mySQL not being loaded in php until i tried to use phpmyadmin and it told me to check my php/mysql configuration.

    basically i just d >
    i restarted my machine and it worked! It seems i had to restart windows after editing my PATH. i didnt bother restarting until it was the last resort because on xp i have NEVER had to do this before — changes to System Variables always took effect immediately. I could understand this on, say, windows 98 where you put the addition to your PATH into your autoexec.bat but why i had to do this with xp is a mystery.

    Anyway, give it a go, it might save you tearing out prescious hair!

    I’m in the process of changing web hosts and my previous host provided a «dump» of the database in the form of a sequence of SQL requests that (I assume) have to be executed in order to rebuild the database on another system. It was generated using «MySQL dump 9.11». Queries are finished by a semicolon and linefeed, while comment-lines begin with a double hyphen. The script below opens a connection to an SQL server and loads a dump file $file of this format into the database $dest_db.

    function load_db_dump($file,$sqlserver,$user,$pass,$dest_db)
    <
    $sql=mysql_connect($sqlserver,$user,$pass);
    mysql_select_db($dest_db);
    $a=file($file);
    foreach ($a as $n => $l) if (substr($l,0,2)==’—‘) unset($a[$n]);
    $a=explode(«;\n»,implode(«\n»,$a));
    unset($a[count($a)-1]);
    foreach ($a as $q) if ($q)
    if (!mysql_query($q))
    mysql_close($sql);
    return 1;
    >

    This may not be watertight if the «;\n» sequence appears inside queries, but I hope it helps others who are in posession of such dumps.

    Client does not support authentication protocol requested by server; consider upgrading MySQL client

    means that you’re using an old version of MySQL Client ( possibly not mysqli)

    Authentication protocol for MySQL has changed with version 4.1.

    To get a hint at which mysql-client version you’re using try phpinfo();

    If you want to get PHP working nicely with MySQL, even with Apache, under Windows based systems, try XAMPP, from Apache Friends. It saves messing about with config files, which is the only major problem with trying to get the three to work together under windows.

    # Created by dhirendra can be reached at dhirendrak at yahoo dot com
    # This script is created to check the data difference between two tables
    # when the structure of both tables are same.
    # Limitation :
    # 1) Structure of both tables should be same.
    # 2) Name of both table should be different but if same than obviously
    # second table should be if different database.
    # 3) If use two database than both database permission should be same
    # as i am using aliases to get the information.
    #
    # USES::
    # 1) This may be useful when you did some changes in your existing
    # script and you expect the certain output. So with the help of this
    # function you may compare the impact due to your changes in script.
    #
    #

    $host = «» ; # host name or ip address
    $user = «» ; # database user name
    $pass = «» ; # database password
    $database = «» ; # dateabase name with which you want to connect

    # get connection with mysql
    $dblink = @ mysql_connect ( $host , $user , $pass );

    # select and open database
    mysql_select_db ( $database , $dblink );

    $db1 = » » ; // first database
    // second database if database are same for both tables than use the same as db1
    $db2 = » » ;
    $table1 = » » ; // first table
    // second table if database is same for both tables than table name
    # must be different but fields name are same and order of the fields are same.

    // function starts here
    function table_data_difference ( $first , $second )
    <
    global $dblink ;
    $sql1 = «SHOW FIELDS FROM $first » ;
    $result = mysql_query ( $sql1 , $dblink ) or die( «Having error in execution 1 ==» . mysql_error ());

    while( $row = mysql_fetch_object ( $result ))
    <
    $from_fields []= $row -> Field ;
    >

    $sql = «select * from $first » ;
    $res = mysql_query ( $sql , $dblink ) or die( «Having error in execution 2==» . mysql_error ());
    $j = 1 ;
    while( $row = mysql_fetch_array ( $res ))
    <

    $num = count ( $from_fields );

    $sql_next = «select $second .* from $second where» ;

    for( $i = 0 ; $i $num ; $i ++)
    <
    $sql_next = $sql_next . » » . $second . «.» . $from_fields [ $i ]. «='» . $row [ $from_fields [ $i ]]. «‘ and » ;
    >

    $sql_next = substr ( $sql_next , 0 , strlen ( $sql_next )- 5 );

    $res_next = mysql_query ( $sql_next , $dblink ) or die( «Having error in execution 3==» . mysql_error ());
    $num1 = mysql_num_rows ( $res_next );
    if( $num1 == 0 )
    <
    for( $i = 0 ; $i count ( $from_fields ); $i ++)
    <
    $val = $val . «
    » . $from_fields [ $i ]. «=» . $row [ $from_fields [ $i ]];
    >
    // Display the record which are not matched.
    echo «
    \n» . $j . «.» . $val ;
    echo «
    ——————————————————» ;
    $j ++;
    >

    $first = $db1 . ‘.’ . $table1 ;
    $second = $db2 . ‘.’ . $table2 ;

    table_data_difference ( $first , $second );

    Функции и операторы в MySQL

    СУБД MySQL поддерживает большинство стандартных логических и битовых операторов, операторов сравнения и, конечно же, арифметические операции, среди которых целочисленное деление «div» и взятие остатка от деления «%». Если при перемножении целых чисел результат выходит за пределы типа BIGINT, то возвращается 0. Деление на 0 в MySQL не приводит к ошибке: возвращается значение NULL.

    Как и другие СУБД, MySQL обладает большим числом встроенных функций, среди которых математические, функции даты и времени, функции работы со строками, функции шифрования данных и многие другие. Полный список этих функций можно увидеть в [1]. Следует отметить, что синтаксис MySQL не допускает использования пробела между именем функции и круглыми скобками, которые обязательны даже в случае отсутствия аргументов.

    Создание простого сценария на PHP

    Для работы с MySQL используются различные языки программирования, в числе которых Perl, Java, C++, Python и др. Опишем взаимодействие СУБД MySQL (предпочитаемую многими хост-провайдерами) и языка PHP как наиболее популярного средства создания Интернет-приложений.

    Напомним, что Интернет работает по принципу «клиент-сервер». Клиент (обычно браузер) посылает запрос серверу, сервер обрабатывает запрос и посылает клиенту ответ.

    Запрашиваемый браузером URL может указывать на статическую html-страницу (в этом случае содержимое страницы отобразится на экране браузера) или на скрипт, т.е. специальную программу, которая выполняется на сервере и генерирует содержимое страницы, посылаемой обратно в браузер. Скрипту может быть передана некоторая информация, например, данные html-форм.

    Простой скрипт на языке РНР выглядит как html-документ со вставками кода, исполняемого на сервере.

    Для написания и отладки скриптов на локальном компьютере необходимо установить web-сервер Apache, а также сопутствующее ПО. Весьма удобно использовать систему «Денвер», которая включает в себя Apache, PHP, MySQL, Perl и другие средства, применяемые при разработке web-приложений. Базовый пакет «Денвера» можно скачать по адресу http://web.dklab.ru

    После запуска «Денвера» на компьютере создается виртуальный диск (обычно Z), содержащий каталоги etc, home, tmp, usr. В каталоге home следует создать новую папку, чье имя совпадает с именем будущего виртуального хоста, например myhost.ru (или myhost). В созданном каталоге необходимо поместить папку www, в которой и будут располагаться скрипты (сценарии). Для того чтобы создать новый виртуальный хост необходимо перезапустить «Денвер». Теперь обратиться к сценарию myscript.php, расположенному в папке Z:homemyhost.ruwww можно из строки браузера следующим образом: http://myhost.ru/myscript.php

    Если скрипт имеет имя index.php, то он вызывается по умолчанию:

    Пусть на сервере уже существует база данных DB, содержащая таблицу tbl. Таблица tbl содержит два столбца: id_name (первичный ключ с атрибутом auto_increment) и name.

    Создадим сначала файл connect.php, который можно будет включать в любые РНР-сценарии для соединения с базой DB.

    Переменные $hostname и $user хранят имя и пароль одного из пользователей, зарегистрированных в MySQL. В качестве имени хоста может указываться localhost. В переменной $db_connection хранится ссылка на созданное соединение. Большинство функций РНР для работы с MySQL принимают ее в качестве необязательного аргумента.

    Выполнение SQL-запросов к базе данных выполняется в php-сценариях следующим образом:

    В переменной $query_result хранится ссылка на результат выполнения запроса, т. е. указатель на данные, возвращенные MySQL.

    Создадим сценарий index.php, который выводит html-форму, заносит в базу данных введенную в нее информацию и выводит содержимое базы в браузер.

    Рассмотрим некоторые детали этого скрипта. Данные, переданные web-серверу с помощью html-формы методом POST, доступны в php-сценариях как элементы массива $_POST, например $_POST[‘submit’].

    Запрос INSERT INTO tbl VALUES (NULL,’$name’) используется для вставки новой записи в таблицу. Применение NULL в данном случае повлечет за собой присвоение атрибуту id_name очередного порядкового номера.

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

    Функция mysql_fetch_array() возвращает по одной строке результат выборки данных в виде массива. Цикл

    выполняется до тех пор, пока есть еще данные. Элемент массива $row[1] является вторым (содержит значение name), т.к. нумерация элементов массива в РНР начинается с 0. Подробную информацию о программировании на РНР можно почерпнуть в [4].

    Илон Маск рекомендует:  Подтверждение регистрации на рнр
    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL