ACCESO A BASES DE DATOS ORACLE CON PHP

21
ACCESO A BASES DE DATOS ORACLE CON PHP MANUEL BUTRÓN BLANES

description

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. - PowerPoint PPT Presentation

Transcript of ACCESO A BASES DE DATOS ORACLE CON PHP

Page 1: ACCESO A BASES DE DATOS ORACLE CON PHP

ACCESO A BASES DE DATOS ORACLE CON PHP

MANUEL BUTRÓN BLANES

Page 2: ACCESO A BASES DE DATOS ORACLE CON PHP

Índice

Introducción Qué necesito… Funciones básicas Introducción a las bind variables Otras funciones.

Page 3: ACCESO A BASES DE DATOS ORACLE CON PHP

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.

Page 4: ACCESO A BASES DE DATOS ORACLE CON PHP

Qué necesito…

Gestor de bases de datos oracle. Apache o IIS. Php 5.0 para las funciones actuales. Editor highlight.

Page 5: ACCESO A BASES DE DATOS ORACLE CON PHP

Operaciones básicas

Conectarse a la base de datos. Preparar una sentencia para su

ejecución. Ejecutarla. Cerrar la conexión.

Page 6: ACCESO A BASES DE DATOS ORACLE CON PHP

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.

Page 7: ACCESO A BASES DE DATOS ORACLE CON PHP

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.

Page 8: ACCESO A BASES DE DATOS ORACLE CON PHP

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.

Page 9: ACCESO A BASES DE DATOS ORACLE CON PHP

Ejecutar una senteciabool 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.

Page 10: ACCESO A BASES DE DATOS ORACLE CON PHP

<?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):'&nbsp;').'</td>';       }       print '</tr>';  }  print '</table>';

  oci_close($conn);?>

Page 11: ACCESO A BASES DE DATOS ORACLE CON PHP

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.

Page 12: ACCESO A BASES DE DATOS ORACLE CON PHP

Introducción a las bind variables II

Sintaxis-> :bindVariable

oci_bind_by_namebool oci_bind_by_name ( resource stmt, string

ph_name, mixed &variable [, int maxlength [, int type]] )

Page 13: ACCESO A BASES DE DATOS ORACLE CON PHP

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

Page 14: ACCESO A BASES DE DATOS ORACLE CON PHP

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);

Page 15: ACCESO A BASES DE DATOS ORACLE CON PHP

<?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);

?>

Insertar con bind variables

Page 16: ACCESO A BASES DE DATOS ORACLE CON PHP

Funciones auxiliares 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_bothoci_assococi_num

oci_return_nullsoci_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>";}?>

Page 17: ACCESO A BASES DE DATOS ORACLE CON PHP

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.

Page 18: ACCESO A BASES DE DATOS ORACLE CON PHP

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…)

Page 19: ACCESO A BASES DE DATOS ORACLE CON PHP

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

Page 20: ACCESO A BASES DE DATOS ORACLE CON PHP

Bibliografía

php.net

Wikipedia

Page 21: ACCESO A BASES DE DATOS ORACLE CON PHP

?