Как использовать подготовленные операторы и связанные параметры в PHP oci8 - PullRequest
0 голосов
/ 03 февраля 2019

Таким образом, использование подготовленных операторов и связанных параметров является рекомендуемым способом написания SQL-операторов.Руководство Oci8 не описывает, как это сделать с подготовленными утверждениями.

Ниже показано, как вернуть следующую строку из запроса в качестве объекта, но это не лучшая практика, поскольку строка запроса может содержать where col = $PHPvariable

<?php

    $conn = oci_connect('hr', 'welcome', 'localhost/XE');
    if (!$conn) {
        $e = oci_error();
        trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
    }

    $select_sql= oci_parse($conn, 'SELECT id, description FROM mytab');
    oci_execute($select_sql);

    while (($row = oci_fetch_object($select_sql)) != false) {
        // Use upper case attribute names for each standard Oracle column
        echo $row->ID . "<br>\n";
        echo $row->DESCRIPTION . "<br>\n"; 
    }

    oci_free_statement($stid);
    oci_close($conn);

    ?>

1 Ответ

0 голосов
/ 03 февраля 2019

Да, можно использовать параметризованный запрос oci8 для ваших операторов SQL.

oci_bind_by_name привязывает переменную PHP к переменной-заполнителю переменной связывания Oracle bv_name.Связывание важно для производительности базы данных Oracle, а также как способ избежать проблем безопасности SQL-инъекций.

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

Подробнее здесь .

 <?php

    $conn = oci_connect("hr", "hrpwd", "localhost/XE");
    if (!$conn) {
        $m = oci_error();
        trigger_error(htmlentities($m['message']), E_USER_ERROR);
    }

    $sql = 'SELECT last_name FROM employees WHERE department_id = :dpid ';

    $stid = oci_parse($conn, $sql);
    $didbv = 60;

    oci_bind_by_name($stid, ':dpid ', $didbv);
    oci_execute($stid);

    while (($row = oci_fetch_object($stid)) != false) {
        echo $row->last_name ."<br>\n";
    }


    oci_free_statement($stid);
    oci_close($conn);

    ?>
...