如何使用OCI检查插入成功

时间:2016-01-29 11:29:54

标签: php insert oci

我有以下代码,但我不知道如何检查插入是否成功。 execute返回resource id。我想检查一下是否成功,并在失败时返回所有错误。

public function persist()
  {
    $update = FALSE;
    if(!is_array($this->tablePrimaryKey)) {
        if(!empty($this->fieldVals[$this->tablePrimaryKey])) {
            $update = true;         
        }
    }

    if ($update) {    
      $sql = "UPDATE " . $this->tableName . " SET ";
      $binds = [];
      foreach ($this->fieldVals as $key=>$val) {
        if ($key != $this->tablePrimaryKey) {
            if(in_array($key, $this->DATE_IDS)) {
                $sql .= '"' . strtoupper($key) . '" = sysdate,';
            } else {
                $bind = 't_' . $key;
                $binds[$bind] = $val;   
                $sql .= '"' . strtoupper($key) . '" = :' . $bind . ',';
            }
        }
      }
      $sql = substr($sql,0,-1);

      $sql .= " WHERE " . $this->tablePrimaryKey . " = '" . $this->fieldVals[$this->tablePrimaryKey] ."'";
    } else {
        $binds = $fields = $date_fields = [];
        if(!empty($this->tablePrimaryKey) && !is_array($this->tablePrimaryKey)) {
            $this->fieldVals[$this->tablePrimaryKey] = $this->generateNewPrimaryKey();
        }
        foreach ($this->fieldVals as $key=>$val) {

                $bind = ':t_' . $key;
                if (in_array($key, $this->DATE_IDS)) {
                    $date_fields[] = strtoupper($key);
                } else {
                    $binds[$bind] = $val;
                    $fields[] =  strtoupper($key);
                }   


      } 
      $sql = 'INSERT INTO ' . $this->tableName . '("' . implode('","', $fields);

      if(count($date_fields) >0) {
        $sql .= '","';
        $sql .= implode('","', $date_fields);
      }
      $sql.='") VALUES (' . implode(',', array_keys($binds));
      if(count($date_fields) >0) {
        $cnt=0;
        foreach($date_fields as $date) {
            $cnt++;
            if(preg_match('/NULL/i', $this->fieldVals[strtolower($date)], $result)) {

                $sql .= ",NULL";

            } elseif(isset($this->fieldVals[strtolower($date)])) {

                $sql .= ",TO_DATE('" . (new DateTime($this->fieldVals[strtolower($date)]))->format("Y-M-d H:i:s") . "', 'yyyy/mm/dd hh24:mi:ss')";
            } else {
                $sql .= ",sysdate";
            }

        }
      } 
      $sql .= ')';
    }

    $this->oiDb->parse($sql, $binds);


    return $this->oiDb->execute();


  }

我跑$result = $oiRequests->hydrate($reportingRequest)->persist();$reportingRequest是列/值的关键值对。 $result包含resource id$oiRequests是我的模特。

我试过了

$num_rows = oci_fetch_assoc ($result);

            print_r($num_rows);

返回

Warning: oci_fetch_assoc(): ORA-24374: define not done before fetch or execute and fetch in /var/SP/oiadm/docroot/dev/uddins/requestportal/requestportal_ajax.php on line 65

1 个答案:

答案 0 :(得分:0)

大多数OCI函数在出错时返回false。这意味着您可以对返回值进行简单检查,如果是false,请致电oci_error()

对于检查INSERT语句是否有效的具体情况,您可以参考example code for oci_commit()。该示例的相关部分在此重复:

// The OCI_NO_AUTO_COMMIT flag tells Oracle not to commit the INSERT immediately
// Use OCI_DEFAULT as the flag for PHP <= 5.3.1.  The two flags are equivalent
$r = oci_execute($stid, OCI_NO_AUTO_COMMIT);
if (!$r) {    
    $e = oci_error($stid);
    trigger_error(htmlentities($e['message']), E_USER_ERROR);
}