【问题标题】:Insert Data in Oracle DB using PHP使用 PHP 在 Oracle DB 中插入数据
【发布时间】:2025-11-28 13:00:01
【问题描述】:

使用oci_8 在 oracle DB 中插入数据。插入带有特殊字符或引号的字符串的示例查询

 update TABLENAME set COMMENTS = 'As per Mark's email dated 28-Feb-2015 - Bill Gates & Team's 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 提到here 但无法成功集成。

$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 代码时使用数据

【问题讨论】:

  • 你能发一个完整的sn-p吗?我缺少创建 SQL 字符串 ($query) 和绑定部分的代码。
  • @Mureinik 检查sn-p。

标签: php oracle prepared-statement oracle-call-interface


【解决方案1】:

从更新函数,将所有需要的东西传递给执行函数:

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

然后在执行函数中简单地迭代数组以绑定所有参数:

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 包含什么?
  • timclutton:COMMENT 是 Oracle 中的 reserved 字。将其更改为 MYCOMMENTS 可以。另外,如果我只有一个要绑定的变量,我需要循环还是只使用oci_bind_by_name($stmt,":MYCOMMENTS",$comments);
  • 如果查询中没有参数(例如select * from dual),那么传递一个空的array 将导致循环不执行并且没有任何绑定。更好的是使参数可选(function customExecute($sql, $params = []));那么你可以在调用中省略参数。
  • 赞成并接受。还有一个我很好奇的*.com/questions/29002992/…
【解决方案2】:

不,不出所料,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 文件中(一般用于数据库查询),不能单独传递给单个查询。
  • 你不需要从你的单例中传递 $stmt 。每次准备查询时都会生成该语句($dbh->prepare($query); 行)。您只需要从您的代码中访问$dbh(数据库处理程序)。无论如何,这段代码使用的是 PDO,Oracle PDO 驱动器不是访问 Oracle DB 的推荐方式(它被标记为实验性:php.net/manual/en/ref.pdo-oci.php
  • 同意。正如其他人所说,我会为 Oracle 使用 OCI 而不是 PDO。如果您需要传入多个绑定参数及其值,请使用数组
【解决方案3】:

使用OCI8 PHP扩展的正确方法是:

$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

【讨论】:

  • mHouses:手册中提到了正确的方法,但是如何根据上面的代码结构进行修改?