функция extract в php

PHP Функция extract()

Пример

Определение и использование

Функция extract() импортирует переменные в локальную таблицу символов из массива.

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

Эта функция возвращает количество переменных, извлеченных при успешном выполнении.

Синтаксис

Параметр значений

ПараметрОписание
arrayТребуемый. Задает массив использовать
extract_rulesНеобязательный. Функция extract() проверяет наличие недопустимых имен переменных и коллизий с существующими именами переменных. Этот параметр определяет, как обрабатываются недопустимые и сталкивающиеся имена.

Этот параметр указывает префикс. Префикс автоматически отделяется от ключа массива символом подчеркивания.

Технические подробности

Возврат значения:Возвращает количество переменных, извлеченных при успешном выполнении
PHP Версия:4+
PHP Список изменений:Значение extract_rules EXTRA_REFS было добавлено в PHP 4.2.

Значение extract_rules EXTRA_IF_EXISTS и EXTRA_PREFIX_IF_EXISTS были добавлены в PHP 4.2.

Начиная с PHP 4.0.5, эта функция теперь возвращает количество извлеченных переменных.

Значение extract_rules EXTR_PREFIX_INVALID было добавлено в PHP 4.0.5.

Начиная с PHP 4.0.5, значение extract_rules EXTRA_PREFIX_ALL теперь включает числовые переменные.

Еще примеры

Пример

Использование всех параметров::

«Кот», «b» => «Собака», «c» => «Лошадь»);

extract($my_array, EXTR_PREFIX_SAME, «dup»);

Источник

extract

extract — Импортирует переменные из массива в текущую таблицу символов

Описание

Импортирует переменные из массива в текущую таблицу символов.

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

Список параметров

Вы должны использовать ассоциативный массив, использование числовых массивов не приведёт ни к каким результатам, если вы не используете EXTR_PREFIX_ALL или EXTR_PREFIX_INVALID.

Если extract_type не указан, он трактуется как EXTR_OVERWRITE.

Обратите внимание, что prefix имеет значение, только если extract_type установлен в EXTR_PREFIX_SAME, EXTR_PREFIX_ALL, EXTR_PREFIX_INVALID или EXTR_PREFIX_IF_EXISTS. Если в результате добавления префикса, не будет получено допустимое имя для переменной, она не будет импортирована в текущую символьную таблицу.

Возвращаемые значения

Возвращает количество переменных, успешно импортированных в текущую таблицу символов.

Список изменений

ВерсияОписание
4.3.0Добавлена константа EXTR_REFS.
4.2.0Добавлены константы EXTR_IF_EXISTS и EXTR_PREFIX_IF_EXISTS.
4.0.5Эта функция теперь возвращает количество извлеченных переменных. Добавлена константа EXTR_PREFIX_INVALID. Константа EXTR_PREFIX_ALL также включает числовые переменные.

Примеры

Пример #1 Пример использования extract()

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

Примечания

Смотрите также

Источник

extract

(PHP 3 >= 3.0.7, PHP 4, PHP 5)

Описание

Эта функция используется для импорта переменных из массива в текущую символьную таблицу. Она берёт ассоциативный массив в качестве параметра var_array и трактует его ключи как имена переменных и значения как значения переменных. Для каждой пары ключ/значение будет создана переменная в текущей символьной таблице, согласно параметрам extract_type и prefix.

Замечание: Начиная с версии 4.0.5, эта функция возвращает количество извлечённых переменных.

Замечание: EXTR_IF_EXISTS и EXTR_PREFIX_IF_EXISTS были добавлены в версии 4.2.0.

Замечание: EXTR_REFS был добавлен в версии 4.3.0.

extract() проверяет каждый ключ на соответствие приемлемости в качестве имени переменной. Эта функция также обрабатывает коллизии имён, если ключ совпадает с именем переменной, уже существующей в текущей символьной таблице. Способ обработки неприемлемых/числовых ключей и коллизий имён устанавливает параметр extract_type. Он может принимать одно из следующих значений:

Если переменная с таким именем существует, она будет переназначена.

Если переменная с таким именем существует, будет сохранено её прежнее значение.

Если переменная с таким именем существует, к её имени будет добавлен префикс, определённый параметром prefix.

Добавить префикс prefix ко всем именам переменных. Начиная с PHP 4.0.5, также включает числовые имена.

Добавить префикс prefix только к неприемлемым/числовым именам переменных. Этот флаг был добавлен в PHP 4.0.5.

Создать переменные, имена которых начинаются с prefix только если переменная с названием, которому не предшествует prefix, определена в текущей символьной таблице. Этот флаг был добавлен в PHP 4.2.0.

Извлечь переменные как ссылки. Это означает, что значения таких переменных будут всё ещё ссылаться на значения массива var_array. Вы можете использовать этот флаг отдельно или комбинировать его с другими, используя OR. Этот флаг был добавлен в PHP 4.3.0.

extract() возвращает количество переменных, успешно импортированных в символьную таблицу.

Пример 1. Пример использования extract()

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

Источник

Функция extract в php

Заносит элементы массива в переменные.
Синтаксис:

Наподобие array(), функция list() не совсем функция, а языковая конструкция. Она используется для формирования списка переменных.
Замечание: list() работает только с цифровыми индексами массива и принимает ключи элементов начиная с 0.

Пример использования функции list():

Пример использования функции list():

Пример использования функции list(): Индексы

Функция поддерживается PHP 3, PHP 4, PHP 5

Упаковывает в массив переменные из текущего контекста.
Синтаксис:

Пример использования функции compact():

Функция поддерживается PHP 4, PHP 5

Импорт элементов массива в переменные.
Синтаксис:

Функция extract() используется для импортирования значений массива в строку. Эта функция берет ассоциативный массив var_array, использую ключ элемента как имя переменной, а значение элемента как значение полученной переменной. Для создания переменных из пары ключ =>
значение можно также использовать необязательные параметры extract_type и prefix.
Замечание: начиная с PHP версии 4.0.5 эта функция возвращала количество извлеченных переменных.
Функция extract() проверяет, действительно ли каждый ключ массива может быть названием переменной. Она также проверяет на наличие одинаковых названий получаемых переменных. В случае, если обнаруживаются недействительные или числовые ключи, поведение функции предопределяет параметр extract_type, который может принимать следующие значения:
EXTR_OVERWRITE

Если переменная с таким именем уже существует, то ее значение будет заменено (значение по умолчанию).

Если переменная с таким именем уже существует, то ее значение не будет заменено.
EXTR_PREFIX_SAME

Если переменная с таким именем уже существует, то к ее имени добавится префикс, определенный в параметре prefix.
EXTR_PREFIX_ALL

Ко всем образуемым переменным будет добавлен префикс prefix.
EXTR_PREFIX_INVALID

Только при неправильных или числовых индексах массива к имени переменной будет добавлен префикс prefix.
EXTR_IF_EXISTS

Создает переменные с префиксом, если такие переменные без префикса уже существовали. В любом другом случае ничего не создает. Этот флаг был добавлен в PHP 4.2.0

Переменные создаются как ссылки. Это означает, что созданные переменные все еще ссылаются на значения соответствующих элементов массива var_array. Вы можете применять этот флаг как в одиночку, так и совместно с другими флагами. Этот флаг был добавлен в PHP 4.3.0

Пример использования функции extract():

Функция поддерживается PHP 3 >= 3.0.7, PHP 4, PHP 5

Источник

extract

(PHP 4, PHP 5, PHP 7, PHP 8)

extract — Импортирует переменные из массива в текущую таблицу символов

Описание

Импортирует переменные из массива в текущую таблицу символов.

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

Список параметров

Возвращаемые значения

Возвращает количество переменных, успешно импортированных в текущую таблицу символов.

Примеры

Пример #1 Пример использования extract()

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

Примечания

Смотрите также

User Contributed Notes 31 notes

They say «If the result is not a valid variable name, it is not imported into the symbol table.»

What they should say is that if _any_ of the results have invalid names, _none_ of the variables get extracted.

Under 4.3.10 on Windows 2000, I was pulling some mySQL records, but needed to convert two fields into IP addresses:

I had forgotten the second AS modifier in the SQL query. Because it couldn’t extract a variable called INET_NTOA(baz) into the symbol table, it didn’t do either of them.

(BTW I don’t normally stack functions up like that! Just to make a short example!)

[New Version]
This function is very useful for filtering complicated array structure.
Also, Some integer bitmasks and invalid UTF-8 sequence detection are available.

Example Usage:
[ ‘A’ ][ ‘a’ ] = ‘ CORRECT(including some spaces) ‘ ;
$_GET [ ‘A’ ][ ‘b’ ] = ‘ CORRECT(including some spaces) ‘ ;
$_GET [ ‘A’ ][ ‘c’ ] = «Invalid UTF-8 sequence: \xe3\xe3\xe3» ;
$_GET [ ‘A’ ][ ‘d’ ][ ‘invalid_structure’ ] = ‘INVALID’ ;

$_GET [ ‘B’ ][ ‘a’ ] = ‘ CORRECT(including some spaces) ‘ ;
$_GET [ ‘B’ ][ ‘b’ ] = «Invalid UTF-8 sequence: \xe3\xe3\xe3» ;
$_GET [ ‘B’ ][ ‘c’ ][ ‘invalid_structure’ ] = ‘INVALID’ ;
$_GET [ ‘B’ ][ «Invalid UTF-8 sequence: \xe3\xe3\xe3» ] = ‘INVALID’ ;

$_GET [ ‘C’ ][ ‘a’ ] = ‘ CORRECT(including some spaces) ‘ ;
$_GET [ ‘C’ ][ ‘b’ ] = «Invalid UTF-8 sequence: \xe3\xe3\xe3» ;
$_GET [ ‘C’ ][ ‘c’ ][ ‘invalid_structure’ ] = ‘INVALID’ ;
$_GET [ ‘C’ ][ «Invalid UTF-8 sequence: \xe3\xe3\xe3» ] = ‘INVALID’ ;

$_GET [ ‘unneeded_item’ ] = ‘UNNEEDED’ ;

Following up on ktwombley at gmail dot com’s post:

Presumably one easy way of dealing with this security issue is to use the EXTR_IF_EXISTS flag and make sure

a) your define acceptable input variables beforehand (i.e. as empty variables)
b) Sanitise any user input to avoid unacceptable variable content.

If you do these two things, then I’m not sure I see the difference between extract($_REQUEST,EXTR_IF_EXISTS); and assigning each of the variables by hand.

I’m not talking here about the idea of storing the variables in a database, just the immediately necessary steps to allow you to use extract on REQUEST arrays with relative safety.

Using extract’s return parameter can lead to unintended results, particularly with EXTR_REFS:

When extracting from a row after a database query using for example:

$row = mysql_fetch_array($result, MYSQL_ASSOC)
extract($row);

I find that the resultant variables may not match the variable type in the database. In particular I have found integers in the database may gettype() to string on the extracted variable.

Notice: Undefined variable: 1 in /Users/Lutashi/t.php on line 7
NULL

Sometimes you may want to extract only a named subset of the key/value pairs in an array. This keeps things more orderly and could prevent an unrelated variable from getting clobbered from an errant key. For example,

$things = ‘unsaid’;
$REQUEST = array(He=>This, said=>1, my=>is, info=>2, had=>a,
very=>3, important=>test, things=>4);
$aVarToExtract = array(my, important, info);
extract (array_intersect_key ($REQUEST, array_flip($aVarToExtract)));

will extract
$my = ‘is’;
$important = ‘test’;
$info = 2;

but will leave certain
$things = ‘unsaid’

For instance, the submission by kake26 at gmail dot com will not only perfectly emulate register globals (that’s bad), but it’ll store it in a database and recall the same variables every time the script runs (essentially allowing an attacker to attack your script every time it runs via one attack). Oops!

Dan O’Donnell’s suggestion needs a third requirement to work as described:

Without that condition the difference between extract() and assigning variables by hand (and the resulting security implications) should be obvious.

It is possible to use this as a way to create public attributes for a class.

As shown in the example, if your ‘prefix’ is used, a single underscore is added to the name of the extracted variable. Meaning, a prefix of ‘p’ becomes a prefix of ‘p_’, so ‘blarg’ prefixed would be ‘p_blarg’.

If you’re not sure what variables you’ve created through extraction, you can call get_defined_vars() to see all defined variables in the current scope.

Re: anon at anon dot org, about extract() and null values

Personally I’ve found use extracting multiple resultsets from db where the latter would overwrite the previous when a variable is not null ( and optionally if its not >0 )

with something like this:

EXTR_OVERWRITE_NULL
— If there is a collision, overwrite the existing variable if it is null

EXTR_OVERWRITE_0
— Same thing but == 0 or null

EXTR_SKIP_NULL
— If there is a collision, skip the new variable if the existing is not null

EXTR_SKIP_0
— Same thing but == 0 or null

Those ought to cover a few good cases that aren’t covered now.

A warning about extract() and null values.

This might be an actual Zend2 Engine bug, but it’s bad programming practice, so I’m sharing it here instead.

I often work in envrionments where E_STRICT (which would prevent errors like this) isn’t on, and I don’t have access to change it. I also use a very simple template class that in a nutshell works like this:

display() more or less looks like this:

In a nutshell, if you start getting wierd behavior when using extract() make sure that the array or object you are trying to get variables out of doesn’t contain null keys or values!

In response to Dan O’Donnell’s note:

«Presumably one easy way of dealing with this security issue is to use the EXTR_IF_EXISTS flag and make sure»

seems all well and good if we had a url like

as that would specifically find joe bloggs of 20 any street.

however what if someone typed in

SELECT table_name FROM information_schema.tables

could be a real disaster!

Of course, this is only a basic example, but it could be quite easy to forget about global variables and these global variables could quite easily be used with extract to cause serious security risks if GET, REQUEST or POST is sent to extract!

We can use extract () function for Template Engine:

Page Header
This is the content page

Here is a little example of how an extraction method should look like when it needs to work recursive (work on nested_arrays too).

Note that this is only an example, it can be done more easily, and more advanced too.

In the meantime, I’m using this:

// extract alternative
# extracts variables where new value is above the threshold or if old value is on or below the threshold (or var is not defined)
# an associative array is obviously the sane thing to pass
#
# I am absolutely certain someone will find obvious problems or errors with this
# I haven’t even tried to compare other values than 0 so if you need to do that and surely finds obvious flaws,
# please mail me, I’d really like to know.
# benjaminATwebbutvecklarnaDOTse

// usage example:
# thrextract(mysql_fetch_assoc(mysql_query(«SELECT preset_this,preset_that FROM site_preset WHERE /># thrextract(mysql_fetch_assoc(mysql_query(«SELECT preset_this,preset_that FROM category_preset WHERE

Besides I teach PHP in a school, and this function has made my examples easier.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *