THE SOLUTION TO PHP+ORACLE+BLOB

admin

Administrator
Staff member
Espero que este codigo solucione la vida a alguna persona que pueda encontrarse con los problemas por los que he pasado gracias a esta y muchas otras comunidades donde la gente inserta codigo sin tener idea de lo que hace ni las consecuencias.


<?php
/*
lobosolitario.php Esta pagina es la que se encarga de hacer el UPLOAD del BLOB

En mi b鷖queda desesperada en la web sobre c髆o insertar datos binarios en un BLOB de Oracle (con PHP) he
encontrado una cantidad de scripts bastante alta. Eso si me han hecho perder un cantidad de tiempo que no
tiene nombre. En los foros la gente inserta el c骴igo que le da la gana, esperando a que un novato como yo
era les haga caso y lo intente utilizar. Esto lo digo por que se encuentran cantidades desesperadas de
errores, tanto en la aportaci髇 de los visitantes como en la de los "expertos".

Creaci髇 de la base de datos en ORACLE 8i:

CREATE TABLE BINARY_DATA (
ID INTEGER NOT NULL,
DESCRIPTION VARCHAR2(100),
BIN_DATA BLOB,
FILENAME VARCHAR2(50),
FILESIZE VARCHAR2(50),
FILETYPE VARCHAR2(100)
);

*/

if(!isset($lob_upload) || $lob_upload == 'none')
{
?>
<form action="lobosolitario.php" method="post" enctype="multipart/form-data">
Description: <input type="text" name="lob_description"><br>
Upload file: <input type="file" name="lob_upload"><br><br>
<input type="submit" value=http://www.phpbuilder.com/board/archive/index.php/"Upload"> - <input type="reset">
</form>
<?php
}
else
{
$user = "USER";
$pass = "PASS";
$tsnames = "TSNAMES";
//Aqui se establece la conexion con una base de datos oracle.
$conn = OCILogon($user,$pass,$tsnames);

/*Inicializa un nuevo descriptor vac韔 LOB/FILE (LOB por defecto)
Reserva espai per mantenir descriptors o localitzadors LOB. Els valors valids pel tipus type son
OCI_D_FILE, OCI_D_LOB, OCI_D_ROWID. Per descriptors LOB, els metodes LOAD, SAVE, i SAVEFILE estan associats
amb el descriptor, per BFILE nom閟 existeix el m鑤ode LOAD*/
$lob = OCINewDescriptor($conn, OCI_D_LOB);

//Preparem la consulta SQL(INSERT) capa?d'introduir els valors a la base de dades.
$stmt = OCIParse($conn,"INSERT INTO BINARY_DATA (id,description,bin_data,filename,filesize,filetype) VALUES (LOBO.NEXTVAL,'$lob_description',EMPTY_BLOB(),'$lob_upload_name','$lob_upload_size','$lob_upload_type') returning BIN_DATA into :the_blob");

/* Enlaza una variable PHP a un Placeholder de Oracle
Enlla鏰 la variable PHP variable a un placeholder d'ORACLE ph_name. Si aquesta ser?usada per entrada o
o sortida es determinar?en temps d'execuci? i ser?reservat l'espai necessari d'emmagatzemament. El
parametre lenght estableix el tamany m鄕im de l'enlla? Si s'estableix length a -1 OCIBindByName utilitzar?br />
el tamany de la variable per establir el tamany m鄕im.*/
OCIBindByName($stmt, ':the_blob', &$lob, -1, OCI_B_BLOB);

//Ejecucion de la sentencia.
OCIExecute($stmt, OCI_DEFAULT);
if($lob->savefile($lob_upload))
{
OCICommit($conn);
echo "Blob successfully uploaded\n<br>";
echo "<a href=http://www.phpbuilder.com/board/archive/index.php/show.php>SHOW FILES</a>";
}
else
{
echo "Couldn't upload Blob\n";
}
OCIFreeStatement($stmt);
OCILogoff($conn);
}
?>

---------------------------------------------

<?
/* show.php
Este archivo nos sirve para mostrar los archivos insertados.
*/
$user = "USER";
$pass = "PASS";
$tsnames = "TSNAMES";
//Fem el Login amb la base de dades
$Conn = OciLogon($user,$pass,$tsnames);

$sql_1 = "select id, filename, filetype from binary_data";
$sql_1 = OCIParse($Conn, $sql_1);
OCIExecute($sql_1, OCI_DEFAULT);
While (OCIFetchInto($sql_1, $row, OCI_ASSOC))
{
echo "<a href=http://www.phpbuilder.com/board/archive/index.php/file.php?id=$row[ID] target=_blank>$row[FILENAME]</a>&nbsp;&nbsp;$row[FILETYPE]<br>";
}
OCIFreeStatement($sql_1);
OCILogoff($Conn);
?>

<?
/*
file.php
Archivo que nos muestra el archivo pedido a la base de datos
*/
$user = "USER";
$pass = "PASS";
$tsnames = "TSNAMES";

$Conn = OciLogon($user, $pass, $tsname);

$query = "select BIN_DATA, FILENAME, FILESIZE, FILETYPE from binary_data where ID=$id";
$stmt = OCIParse($Conn, $query);

$NewData = array();
OCIDefineByName($stmt,"BIN_DATA",&$NewData["BIN_DATA"]);
OCIDefineByName($stmt,"FILETYPE",&$NewData["FILETYPE"]);

OCIExecute($stmt);
OCIFetch($stmt);

If (is_object($NewData["BIN_DATA"]))
{
$NewData["BIN_DATA"] = $NewData["BIN_DATA"]->load();
}
Header ("Content-type: $NewData[FILETYPE]");
echo $NewData["BIN_DATA"];
OCIFreeStatement($stmt);
?>
 
Back
Top