我有以下代码来制作文件:
$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
类型
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:十六进制数无效
答案 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上传文件的最大允许大小。