Вставка данных в 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
Из функции обновления передайте все необходимое для выполнения функции:
$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);
...
}
$result = oci_execute($stmt);echo $result;
, Выход 1
oci_execute
- bool
. Что вы ожидаете от $result
?
Нет, неудивительно, что функции 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();
:bind_comments
в моем запросе, который находится в контроллере. Но $stmt
находится в моем файле db_singleton
(общий для запросов к БД) и не может проходить отдельно для отдельного запроса.
$dbh->prepare($query);
строка). Все, что вам нужно, это получить доступ к $dbh
(обработчику базы данных) из вашего кода. В любом случае, этот код использует PDO, а диски Oracle PDO не рекомендуются для доступа к базе данных Oracle (он помечен как экспериментальный: php.net/manual/en/ref.pdo-oci.php ).
Правильный способ использования расширений 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
$query
) и часть связывания.