Apache. Документация на русском


Директивы Apache
  1    2    3    4    5    6    7    8    9    10    11    12    13    14    15    16    17    18    19    20    21    22    23    24    25    26    27    28    29    30    31    32    33    34    35    36    37    38    39    40    41    42    43    44    45    46    47    48    49    50    51    52    53    54    55    56    57    58    59    60    61    62    63    64    65    66    67    68    69    70    71    72    73    74    75    76    77    78    79    80    81    82    83    84    85  
  86    87    88    89    90    91    92  
  93    94    95    96    97    98    99    100    101    102      103      104    105    106    107    108    109    110    111    112    113    114    115    116    117    118    119    120    121    122    123    124    125    126    127    128    129    130    131    132    133    134    135    136    137    138    139    140    141    142    143    144    145    146    147    148    149    150    151    152    153    154    155    156    157    158    159    160    161    162    163    164    165  
  166    167    168    169    170    171    172    173    174    175    176    177    178    179    180    181    182    183    184    185    186    187    188    189    190    191    192    193    194    195    196    197    198    199    200    201    202    203    204    205    206    207    208    209    210    211    212    213    214    215    216    217    218    219    220    221    222    223    224    225    226    227    228    229    230    231    232    233    234    235    236    237    238    239    240    241    242  

 <         > 
Список директив: Core  |  ModRewrite  |  Lua  |  Proxy  |  SSL

Database connectivity
  RU            EN  

Mod_lua реализует простую функцию базы данных для запросов и выполнения команд в самых популярных механизмах баз данных (mySQL, PostgreSQL, FreeTDS, ODBC, SQLite, Oracle), а также в mod_dbd.

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

function handle(r)
 -- Acquire a database handle
 local database, err = r:dbacquire("mysql", "server=localhost,user=someuser,pass=somepass,dbname=mydb")
 if not err then
 -- Select some information from it
 local results, err = database:select(r, "SELECT `name`, `age` FROM `people` WHERE 1")
 if not err then
 local rows = results(0) -- fetch all rows synchronously
 for k, row in pairs(rows) do
 r:puts( string.format("Name: %s, Age: %s<br/>", row[1], row[2]) )
 end
 else
 r:puts("Database query error: " .. err)
 end
 database:close()
 else
 r:puts("Could not connect to the database: " .. err)
 end
end

Чтобы использовать mod_dbd , укажите mod_dbd в качестве типа базы данных или оставьте поле пустым:

local database = r:dbacquire("mod_dbd")

Объект базы данных и содержащиеся в нем функции

Объект базы данных, возвращаемый dbacquire имеет следующие методы:

Обычный выбор и запрос из базы данных:

-- Run a statement and return the number of rows affected:
local affected, errmsg = database:query(r, "DELETE FROM `tbl` WHERE 1")
-- Run a statement and return a result set that can be used synchronously or async:
local result, errmsg = database:select(r, "SELECT * FROM `people` WHERE 1")

Использование подготовленных операторов (рекомендуется):

-- Create and run a prepared statement:
local statement, errmsg = database:prepare(r, "DELETE FROM `tbl` WHERE `age` > %u")
if not errmsg then
 local result, errmsg = statement:query(20) -- run the statement with age > 20
end
-- Fetch a prepared statement from a DBDPrepareSQL directive:
local statement, errmsg = database:prepared(r, "someTag")
if not errmsg then
 local result, errmsg = statement:select("John Doe", 123) -- inject the values "John Doe" and 123 into the statement
end

Экранирование значений, закрытие баз данных и т. д.:

-- Escape a value for use in a statement:
local escaped = database:escape(r, [["'|blabla]])
-- Close a database connection and free up handles:
database:close()
-- Check whether a database connection is up and running:
local connected = database:active()

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

Набор результатов, возвращаемый db:select функциями подготовленных операторов, созданными с помощью, db:prepare может использоваться для выборки строк синхронно или асинхронно, в зависимости от указанного номера строки:
result(0) выборка всех строк синхронным образом, возвращая таблицу строк.
result(-1) асинхронно извлекает следующую доступную строку в наборе.
result(N) извлекает номер строки N асинхронно:

-- fetch a result set using a regular query:
local result, err = db:select(r, "SELECT * FROM `tbl` WHERE 1")
local rows = result(0) -- Fetch ALL rows synchronously
local row = result(-1) -- Fetch the next available row, asynchronously
local row = result(1234) -- Fetch row number 1234, asynchronously
local row = result(-1, true) -- Fetch the next available row, using row names as key indexes.

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

function rows(resultset, async)
 local a = 0
 local function getnext()
 a = a + 1
 local row = resultset(-1)
 return row and a or nil, row
 end
 if not async then
 return pairs(resultset(0))
 else
 return getnext, self
 end
end
local statement, err = db:prepare(r, "SELECT * FROM `tbl` WHERE `age` > %u")
if not err then
 -- fetch rows asynchronously:
 local result, err = statement:select(20)
 if not err then
 for index, row in rows(result, true) do
 ....
 end
 end
 -- fetch rows synchronously:
 local result, err = statement:select(20)
 if not err then
 for index, row in rows(result, false) do
 ....
 end
 end
end

Закрытие соединения с базой данных

Дескрипторы базы данных должны быть закрыты с помощью, database:close() когда они больше не нужны. Если вы не закроете их вручную, они в конечном итоге будут удалены сборщиком мусора и закрыты mod_lua, но вы можете получить слишком много неиспользуемых соединений с базой данных, если вы оставите закрытие mod_lua. По сути, следующие две меры одинаковы:

-- Method 1: Manually close a handle
local database = r:dbacquire("mod_dbd")
database:close() -- All done
-- Method 2: Letting the garbage collector close it
local database = r:dbacquire("mod_dbd")
database = nil -- throw away the reference
collectgarbage() -- close the handle via GC

Меры предосторожности при работе с базами данных

Хотя стандарт query и run функции находятся в свободном доступе, рекомендуется по возможности использовать подготовленные операторы, чтобы оптимизировать производительность (если ваш дескриптор базы данных существует в течение длительного времени) и свести к минимуму риск атак SQL-инъекций. run и query его следует использовать только тогда, когда в оператор не вставлены переменные (статический оператор). При использовании динамических операторов используйте db:prepare или db:prepared .

  RU            EN