在oracle

时间:2017-11-08 12:44:49

标签: php oracle blob

我有以下代码来制作文件:

  $imagem = base64_to_jpeg( $iten->file->content,  'saida.'.getB64Type( $iten->file->content ));
  $tamanhoImg = filesize($imagem);
  $mysqlImg = addslashes(fread(fopen($imagem, "r"), $tamanhoImg));

// unlink($imagem);

  $values[2] = $mysqlImg;

  $teste = $osController->inserirAnexo( $values );

该文件成功完成,我想将此文件保存在具有字段BLOB类型

的oracle数据库中
public function inserirAnexo( $values ){
        require_once "class.connection_factory.php";
        $con  = new connection_factory();
        $conn = $con->getConnection();
        $retorno = false;

        $sql = "INSERT INTO TABLE_PIC VALUES (:p0,SEQ_SEEQUENCIA.NEXTVAL,:p1,:p2)";
     //   $valor1 = bin2hex( base64_decode( $values[2] ) ) ;

        try{
            $stmt = ociparse( $conn,$sql );
            oci_bind_by_name( $stmt, ":p0", $values[0] );
            oci_bind_by_name( $stmt, ":p1", $values[1] );
            oci_bind_by_name( $stmt, ":p2", $values[2] );
            $retorno = oci_execute( $stmt, OCI_COMMIT_ON_SUCCESS );

        }catch (PDOException $e){
            echo "Erro: ".$e->getMessage();
        }

        return $retorno;
    }

:p2是带有图像文件的字段。

当我尝试在数据库中保存时显示以下消息:

  

警告:oci_execute():ORA-01465:十六进制数无效

1 个答案:

答案 0 :(得分:1)

这包含在The Underground PHP and Oracle Manual,第233页“插入和更新LOB”中。以下是该页面的示例:

<?php
$c = oci_connect('hr', 'welcome', 'localhost/XE');
$myblobid = 123;
$myv = 'a very large amount of binary data';
$s = oci_parse($c, 'insert into mybtab (blobid, blobdata)
                    values (:myblobid, EMPTY_BLOB())
                    returning blobdata into :blobdata');
$lob = oci_new_descriptor($c, OCI_D_LOB);
oci_bind_by_name($s, ':myblobid', $myblobid);
oci_bind_by_name($s, ':blobdata', $lob, -1, OCI_B_BLOB);
oci_execute($s, OCI_NO_AUTO_COMMIT); // Don't commit so $lob->save() works

$lob->save($myv);
oci_commit($c);
$lob->close(); // close LOB descriptor to free resources
?>

以及随附的描述:

  

RETURNING子句返回新行的Oracle LOB定位符。通过绑定为OCI_B_BLOB,$lob中的PHP描述符引用此定位器。然后$lob->save()方法将$myv中的数据存储到BLOB列中。 OCI_NO_AUTO_COMMIT标志用于oci_execute(),因此描述符对save()方法仍然有效。提交结束插入并使数据对其他数据库用户可见。如果应用程序使用Web表单上载LOB数据,则可以使用$lob->import($filename)直接从上载目录插入。使用upload_max_filesize参数在php.ini中设置PHP上传文件的最大允许大小。