oci_bind_by_name

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_bind_by_name — Прикріплює змінну PHP до відповідної мітки у SQL-вираженні

Опис

oci_bind_by_name(    resource $statement,    string $param,    mixed &$var,    int $max_length = -1,    int $type = 0): bool

Прикрепляет переменнуюvarк меткеparam. Таке прикріплення дозволяє підвищити продуктивність та уникнути SQL-ін'єкцій.

Прикріплення змінної дозволяє базі даних повторно використовувати кешовані контекстні вирази від попередніх запитів, навіть якщо вони спочатку були запущені іншим користувачем чи процесом. Це також знижує ризик ін'єкцій SQL, оскільки дані в такому випадку ніколи не розглядаються як інструкції SQL. Дані не потрібно екранувати або укладати в лапки.

Прикріплені PHP-змінні можуть бути змінені та знову виконані без необхідності повторного оброблення запиту або повторного прикріплення.

У Oracle прикріплення змінних зазвичай поділяють на IN (прикріплює значення, що передаються в базу даних) та OUT (Прикріплює значення, що повертаються PHP). Змінна може бути одночасно INиOUT. Незалежно від цього характер прикріплення змінних буде визначено під час виконання.

Необхідно вказати max_lengthпри использованииOUT-прив'язки, що дозволяє PHP зарезервувати більше пам'яті для зберігання значення, що повертається

ДляIN-привязки рекомендуется также указать параметрmax_length, якщо вираз виконується кілька разів із різними значеннями PHP-змінної. В іншому випадку Oracle може урізати розмір даних до розміру початкового значення змінної PHP. Якщо максимальна довжина невідома, рекомендується викликати oci_bind_by_name() перед кожним викликом oci_execute(). Прикріплення невиправдано великої змінної вплине процес збереження бази даних.

Вигляд прикріплення вказує Oracle як працювати з пам'яттю під час читання даних. Для IN-прикріплення адрес у пам'яті повинен містити допустимі дані під час виклику oci_execute(). . Це означає, що значення змінної має бути у пам'яті під час виконання. Якщо це не так, можливі некоректні результати або помилки на кшталт "ORA-01460: unimplemented or unreasonable conversion requested" (запитані нездійсненні або некоректні перетворення) OUT-Прикріплення основною ознакою є встановлення значення змінну PHP.

Для виразу, що багаторазово виконується, прив'язка одних і тих же значень може зменшити можливості оптимізатора Oracle з вироблення найкращого варіанту виконання інструкції. Тривале прикріплення виразів, які рідко виконуються, може також принести користі. Тим не менш, в обох випадках, прикріплення є більш безпечним, ніж конкатенація рядка запиту та неперевірених даних користувача.

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

statement

Допустимий ідентифікатор виразу OCI8.

param

Мітка з префіксом у вигляді двокрапки, що використовується у виразі. Двокрапка опціонально в paramOracle не использует знак вопроса для меток.

var

Переменная PHP, ассоциированная сparam

max_length

Встановлює максимальний розмір даних. Якщо вказати -1, функція буде використовувати поточний розмір змінної var як максимальне. При цьому змінна var має існувати та містити дані під час виклику oci_bind_by_name()

type

Тип даних, до якого Oracle наводитиме значення. За замовчуванням typeимеет значение**SQLT_CHR**. Oracle наводить дані від даного типу до типу поля (або типу змінної PL/SQL), якщо це можливо.

Якщо необхідно прикріпити змінну абстрактного типу (LOB/ROWID/BFILE), слід попередньо використовувати oci_new_descriptor()Параметрlength не використовується для абстрактних типів і повинен бути встановлений -1.

Допустимі значення параметра type :

  • **SQLT_BFILEE** або **OCI_B_BFILE**- для BFILE-об'єктів;

  • **SQLT_CFILEE** або **OCI_B_CFILEE**- для CFILE-об'єктів;

  • **SQLT_CLOB** або **OCI_B_CLOB**- для CLOB-об'єктів;

  • **SQLT_BLOB** або **OCI_B_BLOB**- для BLOB-об'єктів;

  • **SQLT_RDD** або **OCI_B_ROWID**- для ROWID-об'єктів;

  • **SQLT_NTY** або **OCI_B_NTY**- для іменованих типів дати;

  • **SQLT_INT** або **OCI_B_INT**- для цілих чисел;

  • **SQLT_CHR**- для символів VARCHAR;

  • **SQLT_BIN** або **OCI_B_BIN**- для RAW-полів;

  • **SQLT_LNG**- для LONG-полів;

  • **SQLT_LBI**- для LONG RAW полів;

  • **SQLT_RSET**- для курсорів, створених функцієюoci_new_cursor()

  • **SQLT_BOL** або **OCI_B_BOL**- для PL/SQL BOOLEAN (Потрібен Oracle Database 12c)

Значення, що повертаються

Повертає true у разі успішного виконання або **false**в случае возникновения ошибки.

Приклади

Приклад #1 Додавання даних із використанням oci_bind_by_name()

Loading...

Приклад #2 Одна прив'язка для багаторазового використання

Loading...

Приклад #3 Прикрепление в циклеforeach

Loading...

Приклад #4 Прикріплення до виразу WHERE

Loading...

Приклад #5 Прикріплення до виразу LIKE

Loading...

Приклад #6 Прикріплення до виразу REGEXP_LIKE

Loading...

Для невеликої фіксованої кількості умов у вираженні IN використовуються індивідуальні імена змінних. Невідомі значення під час виконання можуть бути встановлені в NULL. Це дозволяє використовувати один вираз декільком користувачам, що підвищує ефективність кешування Oracle DB.

Приклад #7 Прикріплення кількох значень у вираз IN

Loading...

Приклад #8 Прикріплення ROWID, що повертається запитом

Loading...

Приклад #9 OUT-прикріплення ROWID, яке повертається при INSERT

Loading...

Приклад #10 Прикріплення для збереження функції PL/SQL

Loading...

Приклад #11 Прикріплення параметрів для PL/SQL збереженої процедури

Loading...

Приклад #12 Прикріплення об'єкта CLOB

Loading...

Приклад #13 Прикріплення PL/SQL BOOLEAN

Loading...

Примітки

Увага

Не используйтеaddslashes() одночасно з oci_bind_by_name(), так як лапок бути не повинно. Всі зазначені лапки будуть записані до бази даних, тому що oci_bind_by_name() вставляє дані дослівно і не видаляє лапки або символи екранування.

Зауваження :

Якщо прикріплюється рядок до CHAR-полю у виразі WHERE, помните, что Oracle использует при сравнении значенияCHAR, доповнені пробілами. Змінна PHP повинна бути доповнена пробілами до того ж розміру, що і поле, щоб вираз WHERE виконувалося правильно.

Зауваження :

Переменная PHPvar є посиланням. Деякі види циклів можуть працювати не так, як очікується:

Loading...

У цьому випадку кожен ключ прикріплюється до $value, тому всі прикріплені змінні вказують на значення останньої ітерації циклу. Натомість слід використовувати:

Loading...

Дивіться також