【问题标题】:Is this the correct way to INSERT a row in an Oracle database?这是在 Oracle 数据库中插入一行的正确方法吗?
【发布时间】:2012-03-01 07:53:47
【问题描述】:

我创建了一个 Web 应用程序,它将使用 PHP 将一行插入 Oracle 数据库。我正在使用 Zend Framework 连接到数据库。当我测试它时,我没有收到任何错误,但我没有在表中看到添加的行。

这是我的代码:

$remote = $_SERVER['REMOTE_ADDR'];   

// Connect with PDO
$db = Zend_Db::factory('PDO_OCI', 
array(
  'dbname' => $dbname,
  'username' => $dbuser,
  'password' => $dbpass
)
);

$req = "INSERT INTO " . $dbtable . " (id, url, adddate, addip) VALUES ('', '" . $safeurl . "', SYSDATE, '" . $remote . "')";
$res = $db->prepare($req);
$res->execute();

$safeurl 由用户输入生成,并经过清理。 id 在插入行时自动生成。

请帮我解决这个问题。谢谢!

【问题讨论】:

  • id 是如何自动生成的,如果是,为什么要在列列表中?另外,您是否尝试在 SQLPlus 中输入相同的确切 INSERT 命令或其他东西以查看它是否有效?
  • 是的,我使用带有 SQL Plus 的 Oracle Instant CLient 输入了它,并且工作起来就像一个魅力。我只是无法让 PHP 自己完成。

标签: php sql oracle zend-framework insert


【解决方案1】:

你必须承诺。如果未启动,则每个更新/插入/删除都会开始一个新事务。所以在插入一条记录(或一堆记录)后发出另一个COMMIT 语句。 Oracle 没有自动提交模式。

【讨论】:

  • 通常 PDO 会自动提交。
  • 当然,你可以用 PDO 来做,它会更好($db->commit()),但我怀疑它是自动完成的......
【解决方案2】:

之后

 $res = $db->prepare($req);

执行echo $req->__toString(); 获取生成的查询,然后复制它并在 SQL Plus 中执行它 如果它有效,那么您唯一的问题是您需要提交:

$db->beginTransaction();
$req = "INSERT INTO " . $dbtable . " (id, url, adddate, addip) VALUES ('', '" . $safeurl . "', SYSDATE, '" . $remote . "')";
$res = $db->prepare($req);
$res->execute();
$db->commit();

【讨论】:

    猜你喜欢
    • 2011-03-20
    • 2018-03-28
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    相关资源
    最近更新 更多