220 likes | 397 Views
ACCESO A BASES DE DATOS ORACLE CON PHP. MANUEL BUTRÓN BLANES. Índice. Introducción Qué necesito… Funciones básicas Introducción a las bind variables Otras funciones. Introducción. Mejor dupla bajo web: oracle+php. Muchos tipos de funciones. Diferentes para cada SGDB.
E N D
ACCESO A BASES DE DATOS ORACLE CON PHP MANUEL BUTRÓN BLANES
Índice • Introducción • Qué necesito… • Funciones básicas • Introducción a las bind variables • Otras funciones.
Introducción • Mejor dupla bajo web: oracle+php. • Muchos tipos de funciones. • Diferentes para cada SGDB. • El codigo no es portable. • Uso de bind variables.
Qué necesito… • Gestor de bases de datos oracle. • Apache o IIS. • Php 5.0 para las funciones actuales. • Editor highlight.
Operaciones básicas • Conectarse a la base de datos. • Preparar una sentencia para su ejecución. • Ejecutarla. • Cerrar la conexión.
Establecer una conexión con la BD oci_connect ( string username, string password [, string db [, string charset [, int session_mode]]] ) <?php $conn = oci_connect(‘user', ‘pass', 'orcl'); if (!$conn) { $e = oci_error(); print htmlentities($e['message']); exit; } ?> • Devuelve un identificador que se usa en todas las funciones o falso en el caso de que la conexión falle.
Cerrar una conexión con la base de datos bool oci_close ( resource connection ) <?php $conn = oci_connect(‘user', ‘pass', 'orcl'); if (!$conn) { $e = oci_error(); print htmlentities($e['message']); exit; }oci_close($conn) ?> • Devuelve true si se cierra y false si no.
Preparar una sentencia oracle para su ejecución. oci_parse(resource connection, string query) Prepara la query usando el identificador que devuelve oci_connect y devuelve un sentecia identificadora, que puede ser usada con oci_bind_by name() o oci_execute principalmente pero tambien con otras funciones. <?php $query = 'SELECT * FROM DEPARTMENTS'; $stid = oci_parse($conn, $query); if (!$stid) { $e = oci_error($conn); print htmlentities($e['message']); exit; ?> Nota: Esta funcion no valida la query. La unica manera de validar si la query es una sentencia correcta de SQL es ejecutandola Devuelve falso o error.
Ejecutar una sentecia bool oci_execute (resource stmt , [int mode]) <?php $query = 'SELECT * FROM DEPARTMENTS'; $stid = oci_parse($conn, $query); if (!$stid) { $e = oci_error($conn); print htmlentities($e['message']); exit; ?> $r = oci_execute($stid, OCI_DEFAULT); if (!$r) { $e = oci_error($stid); echo htmlentities($e['message']); exit; • Ejecuta una sentecia SQL previamente comprobada con oci_parse • Devuelve un resultado dependiendo del tipo de query o false en caso de error.
<?php $conn = oci_connect(‘user', ‘pass', 'orcl'); if (!$conn) { $e = oci_error(); print htmlentities($e['message']); exit; } $query = 'SELECT * FROM DEPARTMENTS'; $stid = oci_parse($conn, $query); if (!$stid) { $e = oci_error($conn); print htmlentities($e['message']); exit; } $r = oci_execute($stid, OCI_DEFAULT); if (!$r) { $e = oci_error($stid); echo htmlentities($e['message']); exit; } print '<table border="1">'; while ($row = oci_fetch_array($stid, OCI_RETURN_NULLS)) { print '<tr>'; foreach ($row as $item) { print '<td>'.($item?htmlentities($item):' ').'</td>'; } print '</tr>'; } print '</table>'; oci_close($conn); ?>
Introducción a las bind variables • Ligar variables en un enunciado SQL. • Ventaja sobre MySQL o ACCESS que no manejan bind nativamente. • Pre-compilacion de enunciados SQL. • Optimización. Aumento importante de velocidad al insertar. • SQL inalterable. • Medida de seguridad ante el SQL injection.
Introducción a las bind variables II • Sintaxis-> :bindVariable • oci_bind_by_name bool oci_bind_by_name ( resource stmt, string ph_name, mixed &variable [, int maxlength [, int type]] )
Ejemplo web insegura. SQL injection. • Ejecutar sentecias SQL mediante la aplicación sin la debida autentificación. • Login.asp; user:Obelix, pass: Dogmatix SELECT * FROM Users WHERE username= 'Obelix' and password='Dogmatix' • Nombre de Usuario: ‘ or 1=1— • SELECT * FROM Users WHERE username='' or 1=1-- and password='‘ • SELECT * FROM Users WHERE username='' or 1=1
Ejemplo seguridad con bind variables $SQL = "SELECT * FROM TECNICOS WHERE USUARIO = :USUARIO AND CLAVE = :CLAVE"; $Sentencia =oci_parse ($Conexion, $SQL); oci_bind_by_name ($Sentencia,”:USUARIO", $USUARIO, -1); oci_bind_by_name ($Sentencia, “:CLAVE", $CLAVE, -1); oci_execute ($Sentencia);
Insertar con bind variables <?php // Before running, create the table: // CREATE TABLE MYTABLE (mid NUMBER, myd VARCHAR2(20)); $conn = oci_connect(‘user', ‘pass', 'orcl'); $query = 'INSERT INTO MYTABLE VALUES(:myid, :mydata)'; $stid = oci_parse($conn, $query); $id = 60; $data = 'Some data'; oci_bind_by_name($stid, ':myid', $id); oci_bind_by_name($stid, ':mydata', $data); $r = oci_execute($stid); if ($r) print "One row inserted"; oci_close($conn);?>
array oci_fetch_array ( resource statement [, int mode] ) devuelve un array asociativo o numerico o ambos, con el resultado, false en caso de error oci_both oci_assoc oci_num oci_return_nulls oci_return_lobs <?php$conexion = oci_connect(“user", “pass");$SQL= "SELECT id, name FROM fruits";$sentencia = oci_parse ($conexion, $SQL);oci_execute ($sentencia);while ($row = oci_fetch_array ($sentencia, OCI_BOTH)) { echo $row[0]." and ".$row['ID']." is the same<br>"; echo $row[1]." and ".$row['NAME']." is the same<br>";}?> Funciones auxiliares
Funciones auxiliares II • int oci_fetch_all ( resource statement, array &output [, int skip [, int maxrows [, int flags]]] ) Le pasamos el array por referencia para que lo componga y nos devuelve el numero de filas que han sido imprimidas en el array • oci_num_fields(sentencia), devuelve el numero de columas en la sentencia. • oci_num_rows(sentencia), devuelve el numero de filas en la sentencia.
Otras funciones • oci_commit, oci_roolback, para control de transacciones • oci_error, devuelve el ultimo error • oci_server_version, devuelve la version del servidor • oci_statement_type, devuelve el tipo de sentencia(select,insert…)
Otras funciones II • oci_password_change, cambia la contraseña de acceso • oci_field_ is null, precision,scale,size,type. • oci_pconnect, se conecta a oracle usando una conexión permanente. • oci_field_name, oci_row_name
Bibliografía • php.net • Wikipedia