Вставка данных в базу данных Oracle с использованием PHP

0

Вставка данных в Oracle с использованием oci_8. Пример запроса для вставки строки со специальными символами или кавычками

 update TABLENAME set COMMENTS = 'As per Mark email dated 28-Feb-2015 - Bill Gates & Team effort' where ID = 99;

Вставить/обновить

$query = 'update TABLENAME set COMMENTS = '$_POST[comments]';

$result = customexecute($new_query);

public function customexecute($query)
{

    $resutlt = parent::customquery($query);
    return $resutlt;
}


public static function customquery($query)
{

  try{

        $stmt = oci_parse($conn, $query);
        oci_execute($stmt,OCI_COMMIT_ON_SUCCESS);
        oci_commit(db_singleton::getInstance());
        oci_free_statement($stmt);
        }catch (Exception  $e)
        {
            print_r($e);
        }

    }

Выполняя его в ORACLE DB, он говорит, SQl command not properly ended. Посмотрел на Parameterized queries упомянутые здесь, но не смог интегрировать их успешно.

$query = 'UPDATE tablename SET field = :field WHERE id = :id';
$stmt = oci_parse($oracleConnection, $query);
oci_bind_by_name($stmt, ':field', "The field value with 'apostrophes' and so");
oci_bind_by_name($stmt, ':id', '125');
$result = oci_execute($stmt);

Я могу передать :bind_comments в моем запросе, который находится в моем контроллере. Но $stmt находится в моем файле db_singleton (общий для всех запросов БД) и не может проходить отдельно для отдельного запроса.

Как я могу дезинфицировать ввод пользователя или не разрешать использование данных при создании кода SQL

  • 0
    Можете ли вы опубликовать полный фрагмент, пожалуйста? Мне не хватает кода, который создает строку SQL ( $query ) и часть связывания.
  • 0
    @Mureinik проверь фрагмент.
Теги:
prepared-statement
oci

3 ответа

0
Лучший ответ

Из функции обновления передайте все необходимое для выполнения функции:

$result = customExecute(
    'update xxx set comments=:COMMENTS where id=:ID',
    [
        ':COMMENTS' => $_POST['comment'],
        ':ID' => 99
    ]
);

Затем в функции execute просто перебираем массив для привязки всех параметров:

public static function customExecute($sql, array $params = [])
{
    $stmt = oci_parse($conn, $sql);
    foreach ($params as $key => &$value) {
        oci_bind_by_name($stmt, $key, $value);
    }
    $result = oci_execute($stmt);
    ...
}
  • 0
    Timclutton: $result = oci_execute($stmt);echo $result; , Выход 1
  • 0
    Да, потому что возвращаемое значение из oci_execute - bool . Что вы ожидаете от $result ?
Показать ещё 8 комментариев
0

Нет, неудивительно, что функции MySQL не будут работать с Oracle DB :)

Вам нужно параметризовать вещи, например:

$query = 'update TABLENAME set COMMENTS = :bind_comments where id = :bind_id';
$stmt = $dbh->prepare($query);
$stmt->bindParam(':bind_comments', $_POST['comments']);
$stmt->bindParam(':bind_id', $_POST['id']);

$stmt->execute();
  • 0
    Я могу передать :bind_comments в моем запросе, который находится в контроллере. Но $stmt находится в моем файле db_singleton (общий для запросов к БД) и не может проходить отдельно для отдельного запроса.
  • 0
    Вам не нужно передавать $ stmt из вашего синглтона. Оператор генерируется каждый раз, когда вы готовите запрос ( $dbh->prepare($query); строка). Все, что вам нужно, это получить доступ к $dbh (обработчику базы данных) из вашего кода. В любом случае, этот код использует PDO, а диски Oracle PDO не рекомендуются для доступа к базе данных Oracle (он помечен как экспериментальный: php.net/manual/en/ref.pdo-oci.php ).
Показать ещё 1 комментарий
0

Правильный способ использования расширений PHP OCI8:

$query = 'UPDATE tablename SET field = :field WHERE id = :id';
$stmt = oci_parse($oracleConnection, $query);
oci_bind_by_name($stmt, ':field', "The field value with 'apostrophes' and so");
oci_bind_by_name($stmt, ':id', '125');
$result = oci_execute($stmt);

Дополнительная информация: http://php.net/manual/book.oci8.php

  • 0
    mHouse: правильный путь упоминается в руководстве, но как я могу изменить в соответствии с приведенной выше структурой кода?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню