La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

ECOM-6030 CAPÍTULO 2 STORING & RETRIEVING DATA Prof. Nelliud D. Torres © - Derechos Reservados.

Presentaciones similares


Presentación del tema: "ECOM-6030 CAPÍTULO 2 STORING & RETRIEVING DATA Prof. Nelliud D. Torres © - Derechos Reservados."— Transcripción de la presentación:

1 ECOM-6030 CAPÍTULO 2 STORING & RETRIEVING DATA Prof. Nelliud D. Torres © - Derechos Reservados

2 CONTENIDO USO DE ARCHIVOS MANEJO DE ARCHIVOS ABRIENDO ARCHIVOS FUNCIÓN fopen() PARÁMETROS (FILE MODE) ESCRIBIR A UN ARCHIVO fwrite() CERRANDO UN ARCHIVO fclose() LABORATORIOS 8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 2

3 CONTENIDO FUNCIÓN feof() FUNCIONES fgets(), fgetss(), fgetcsv() LECTURA DE CARACTERES FUNCIONES ADICIONALES – file_exists() – filesize() – unlink() – rewind() – ftell() – fseek() HACIENDO LOCKS DE ARCHIVOS PROBLEMAS DE ARCHIVOS SECUENCIALES 8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 3

4 USO DE ARCHIVOS En este capítulo vamos a aprender a escribir los datos que se obtienen de la forma del laboratorio pasado en un archivo secuencial. Más adelante vamos a ver como leer de nuevo esos datos. Aunque no es buena idea escribir datos en archivos provenientes de una forma (form) que pueden utilizar muchos clientes a la vez (Bases de datos), existen situaciones en donde conviene utilizarlos. 8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 4

5 MANEJO DE ARCHIVOS - 1 Existen dos formas de leer archivos en PHP. 1.Archivos flats (secuenciales) 2.Bases de Datos. La forma de manejar archivos en PHP es muy similar a la que se utiliza en C. Por lo tanto aquellos que estén familiarizados en el manejo de archivos en C, no deben tener problema de trabajarlos en PHP. 8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 5 Pag. 57

6 MANEJO DE ARCHIVOS - 2 Escribir datos a un archivo requiere 3 pasos: 1.Abrir el archivo, si el archivo no existe, se crea. 2.Escribir los datos al archivo. 3.Cerrar el archivo. Por otro lado, leer los archivos también requieren 3 pasos. 1.Abrir el archivo, si no existe, abortar la operación. 2.Leer los datos del archivo. 3.Cerrar el archivo. 8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 6 Pag. 59

7 ABRIENDO ARCHIVOS Para abrir archivos en PHP se utiliza la función fopen(). Existen tres opciones cuando se abre un archivo: 1.Se puede abrir un archivo únicamente para leer, escribir o ambas operaciones. 2.Si se desea escribir, se puede hacer en un archivo que ya existe (reemplazar) o se puede añadir (append) al final del archivo si ya tiene datos. También se puede abortar la operación si el archivo existe y no se desea modificarlo. 3.Si el sistema operativo trabaja con archivos binarios y de texto, hay que indicarlo al momento de abrirlo. 8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 7 Pag. 59-60

8 FUNCIÓN fopen() Para abrir un archivo, se utiliza el siguiente formato. $fp = fopen(“$DOCUMENT_ROOT/../orders/orders.txt”, ’w’); 1.fopen() puede utilizar hasta cuatro parámetros, en el ejemplo sólo utiliza dos. 2.El primer parámetro es el path en donde va a estar el archivo que deseamos abrir. 3.El segundo parámetro indica (file mode) el modo de acceder. 4.Como el directorio puede cambiar, se utiliza una variable built- in en PHP y el formato para guardarla y abreviarla es: $DOCUMENT_ROOT = $_SERVER[‘DOCUMENT_ROOT’]; 5.Los dos puntos se utilizan para separar el directorio principal del directorio final y documento. A mi me trabajo con uno. 8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 8 Pag. 60-61

9 RESUMEN PARÁMETROS FILE MODE MODEMODE NAMEMEANING rRead Abre el archivo para leer comenzando desde el principio. r+Read Abre el archivo para leer y escribir desde el principio. wWrite Abre el archivo para escribir. Si existe borra el contenido. Si no existe, trata de crearlo en blanco. w+Write Abre el archivo para escribir y leer. Si existe borra el contenido. Si no existe, trata de crearlo en blanco. xCautious write Abre para escribir. Si el archivo existe, no lo abre. x+Cautious write Abre para escribir y leer. Si el archivo existe, no lo abre. aAppend Abre para escribir (append) al final del archivo. Si no existe, trata de crearlo. a+Append Lo mismo que el anterior solo que escribe y lee. bBinary Se incluye con una de las otras, indica archivo binario. tText Indica archivo de texto. 8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 9 Pag. 61

10 USOS DEL fopen() El siguiente ejemplo muestra como se puede abrir un archivo y corroborar si abrió exitosamente. @ $fp = fopen(“$DOCUMENT_ROOT/../orders/orders.txt”, ‘ab’); if (!$fp) { echo ‘ Your order could not be processed at this time. ‘.’Please try again later. ’; exit; } 8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 10 Pag. 64 La @ evita que salga un mensaje de error al usuario. Coteja si no se abrió el archivo exitosamente. Aborta el script. Este mensaje de error controlado es más fácil para que el usuario lo entienda que el mensaje de error que tira PHP.

11 ESCRIBIR A UN ARCHIVO fwrite() Hay dos funciones: fwrite() y fputs() (alias). Ejemplo para escribir: fwrite ($fp, $outputstring); $fp – Pointer del archivo abierto. $outputstring – String con lo que queremos guardar en el archivo (línea). Ejemplo de cómo generar un string como record: $outputstring = $date.”\t”.$tireqty.” tires \t”.$oilqty.” oil\t”.$sparkqty.” spark plugs\t\$”.$totalamount.”\t”.$address.”\n”; 8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 11 Pag. 65-66 Al principio de la página 67 hay un ejemplo de un posible output de esta instrucción.0

12 CERRANDO UN ARCHIVO fclose() La función para cerrar un archivo es fclose(): Ejemplo: fclose($fp) $fp – Pointer del archivo abierto. Esta función devuelve true si el archivo pudo cerrarse exitosamente. 8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 12 Pag. 65-66

13 FUNCIÓN fopen() Para leer de un archivo secuencial utilizamos la siguiente directiva: $fp = fopen(“$DOCUMENT_ROOT/../orders/orders.txt”, ‘rb’); rb – Significa que se va a leer del archivo desde el principio y que está en formato binario. Cualquier duda adicional, favor de cotejar los parámetros de file mode (página 61). 8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 13 Pag. 70

14 FUNCIÓN feof() (Cont.) feof() – Devuelve true si el pointer llegó al final del archivo y no hay mas datos que leer. El siguiente ejemplo muestra como se puede crear un ciclo que permita leer datos de un archivo hasta llegar al final. while (!feof($fp)) { $order= fgets($fp, 999); echo $order.' '; } 8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 14 Pag. 71 Mientras no se ha llegado al final del archivo. Lee la próxima línea del archivo y muéstrala en el Browser al cliente.

15 FUNCIONES fgets(), fgetss(), fgetcsv() fgets() – Lee una línea a la vez. En el siguiente ejemplo se lee una línea del archivo hasta que se encuentra un carácter tipo newline (\n) o un EOF ó se hallan leído 998 bytes (siempre uno menos). $order = fgets($fp, 999) fgetss() – Funciona igual al fgets() con la diferencia de que elimina cualquier tag de HTML o de PHP que encuentre en el string. fgetcsv() – Divide las líneas del archivo de acuerdo al delimitador que se especifique. Normalmente se utiliza el tab (\t) y la coma (,). Por ejemplo: $order = fgetcsv($fp,100,”\t”); Aquí el delimitador es el TAB o hasta que lea a 99 caracteres. La variable order se convierte en arreglo ya que esta función devuelve un arreglo con las diferentes líneas. 8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 15 Pag. 71

16 FUNCIONES readfile(), fpassthru(), file() readfile() – Abre el archivo, envía el contenido al standar output (browser) y finalmente cierra el archivo. Ejemplo: readfile(“DOCUMENT_ROOT/../orders/orders.txt”); fpassthru () – Hay que abrir primero el archivo utilizando fopen() y se pasa el pointer del archivo como argumento de esta función. Finalmente se pasa el output al browser y se cierra el archivo automáticamente. Ejemplo: $fp = fopen(“DOCUMENT_ROOT/../orders/orders.txt”); fpassthru($fp); file () – Idéntica a readfile() con la diferencia de que el contenido del archivo no se muestra en el browser, sino que se almacena en un arreglo. Por ejemplo: $filearray = file(“DOCUMENT_ROOT/../orders/orders.txt”); 8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 16 Pag. 72

17 LECTURA DE CARACTERES fgetc() – Permite leer un archivo de carácter en carácter. Ejemplo: while (!feof($fp)) { $char = fgetc($fp); if (!feof($fp)) echo ($char==“\n” ? ‘ ’ : $char); } Aquí se lee carácter por carácter en el archivo y al encontrarse el carácter de newline (\n) se cambia por el que utiliza HTMl ( ). fread () – Lee una cantidad arbitraria de caracteres que indica el programador. Termina la lectura cuando llegue a esa cantidad de caracteres o se encuentre el final de archivo. Ejemplo: fread($fp,100); // Lee 100 caracteres 8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 17 Pag. 73

18 FUNCIONES ADICIONALES file_exists() – Coteja si el archivo indicado existe o no. Ejemplo: if (file_exists(“DOCUMENT_ROOT/../orders/orders.txt”)) echo ‘existen órdenes que tienen que ser procesadas’; else echo ‘No hay ordenes para procesar’; filesize () – Devuelve el tamaño del archivo en bytes, se puede utilizar con la función fread() para leer todo el archivo. Ejemplo: $fp = fopen(“DOCUMENT_ROOT/../orders/orders.txt”); echo n12br(fread($fp,filesize(“DOCUMENT_ROOT/../orders/orders.txt”))); fclose($fp) La función n12br convierte los (\n) a ( ). 8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 18 Pag. 72

19 FUNCIONES ADICIONALES (Cont.) unlink() – Elimina físicamente un archivo. Devuelve falso si no pudo eliminarlo por alguna razón. Ejemplo: unlink(“DOCUMENT_ROOT/../orders/orders.txt”); rewind() – Cambia la posición del cursor al principio del archivo. Ejemplo: rewind($fp) ftell() – Indica cuan lejos a llegado el cursor desde el principio del archivo en términos de bytes. Ejemplo: ftell($fp) fseek() – Posiciona el pointer en la posición que le indique el programador. Ejemplo: fseek($fp,200). Esto mueve el cursor 200 bytes hacia delante. Se puede utilizar en conjunto con la función filesize(). 8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 19 Pag. 74-75

20 HACIENDO LOCKS DE ARCHIVOS Si utilizamos la técnica de almacenar órdenes en archivos secuenciales, nos puede traer muchos problemas. Primero si dos más usuarios a la vez están llenando órdenes, hay un problema ya que una vez que el archivo lo abre un usuario para escribir, el otro o no puede utilizarlo o escribe encima de lo que escribió el cliente anterior. Aunque la mejor solución es utilizar Bases de Datos, para este ejemplo vamos a mostrar técnicas de trancar el archivo (lock). La función que “tranca” un archivo se llama flock(). Al trancar el archivo, los demás usuarios que quieren utilizarlo tienen que esperar hasta que se libere. Ojo – Si son muchos los usuarios que tienen que trabajar el archivo, esta técnica puede poner lento al servidor, sin embargo para ciertas situaciones esta técnica puede ser viable. 8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 20 Pag. 76

21 FUNCIÓN flock() Utiliza dos argumentos, los cuales son: el pointer del archivo y la acción a tomar. A continuación se muestra una tabla de las diferentes acciones: 8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 21 Pag. 76-77 ARGUMENTOSIGNIFICADO LOCK_SHReading log. El archivo puede ser compartido para leer. LOCK_EXWriting lock. Sólo un usuario puede escribir en el archivo a la vez. LOCK_UNQuita el lock al archivo. LOCK_NBSe previene el bloqueo en lo que se adquiere el lock.

22 FUNCIÓN flock() (Cont.) A continuación se muestran dos ejemplos del uso del lock: Lectura: $fp = fopen(“$DOCUMENT_ROOT/../orders/orders.txt”, ‘r’); flock($fp, LOCK_SH); // Hace un lock para leer // Aquí se escriben las instr. para leer del archivo flock($fp, LOCK_UN); // Libera el lock fclose($fp); Escritura: $fp = fopen(“$DOCUMENT_ROOT/../orders/orders.txt”, ‘ab’); flock($fp, LOCK_EX); // Hace un lock para escribir fwrite($fp, $outputstring); flock($fp, LOCK_UN); // Libera el lock fclose($fp); 8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 22 Pag. 76-77

23 USO DE ARCHIVOS SECUENCIALES Problemas al utilizar archivos secuenciales 1.Según crece el archivo, se va poniendo lento el acceso. 2.Buscar un record o grupos de record es difícil. 3.Trabajar con accesos concurrentes es complicado. 4.No se pueden crear niveles para acceder los datos (seguridad). Ventajas de utilizar un RDBMS 1.Rapidez al acceder los datos (MySQL). 2.Se puede extraer fácilmente porciones de los datos. 3.EL RDBMS tiene mecanismos para manejar varios usuarios simultáneamente (no hay que programarlo). 4.Acceso random a la data y manejo de privilegios. 8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 23 Pag. 77-78

24 LABORATORIO - 1 Utilizando el código HTML del laboratorio pasado pero incluyendo la dirección del cliente como se ve a continuación: (se puede bajar de la página) 8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 24 Pag. 67

25 LABORATORIO – 1 – CÓDIGO - A <?php // create short variable names $tireqty = $_POST['tireqty']; $oilqty = $_POST['oilqty']; $sparkqty = $_POST['sparkqty']; $address = $_POST['address']; $DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT']; ?> Bob's Auto Parts - Order Results Bob's Auto Parts Order Results <?php $date = date('H:i, jS F'); echo ' Order processed at '; echo $date; echo ' '; echo ' Your order is as follows: '; $totalqty = 0; $totalqty = $tireqty + $oilqty + $sparkqty; echo 'Items ordered: '.$totalqty.' '; 8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 25 Pag. 67

26 LABORATORIO – 1 – CÓDIGO - B if( $totalqty == 0) { echo 'You did not order anything on the previous page! '; } else { if ( $tireqty>0 ) echo $tireqty.' tires '; if ( $oilqty>0 ) echo $oilqty.' bottles of oil '; if ( $sparkqty>0 ) echo $sparkqty.' spark plugs '; } $totalamount = 0.00; define('TIREPRICE', 100); define('OILPRICE', 10); define('SPARKPRICE', 4); $totalamount = $tireqty * TIREPRICE + $oilqty * OILPRICE + $sparkqty * SPARKPRICE; $totalamount=number_format($totalamount, 2, '.', ' '); echo ' Total of order is '.$totalamount.' '; echo ' Address to ship to is '.$address.' '; 8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 26 Pag. 67

27 LABORATORIO – 1 – CÓDIGO - C $outputstring = $date."\t".$tireqty." tires \t".$oilqty." oil\t".$sparkqty." spark plugs\t\$".$totalamount."\t". $address."\n"; // open file for appending @ $fp = fopen("$DOCUMENT_ROOT/./Ejemplo- 2/orders.txt", 'ab'); flock($fp, LOCK_EX); if (!$fp) { echo ' Your order could not be processed at this time. '.'Please try again later. '; exit; } fwrite($fp, $outputstring, strlen($outputstring)); flock($fp, LOCK_UN); fclose($fp); echo ' Order written. '; ?> 8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 27 Pag. 67 Me corre de esta manera Tiene el path hasta llegar a www

28 LABORATORIO - 2 Antes de seguir con este laboratorio, corra la forma con el código que permite guardar las ordenes de compra y asegúrese de que incluye por lo menos cinco solicitudes (de cinco clientes). Entre direcciones diferentes. Al terminar, se supone que se cree el archivo secuencial con los datos que usted entro en la forma. Ahora se va a crear el código en PHP que se muestra en el siguiente slide que va a leer el archivo creado y lo va a mostrar en la forma: 8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 28 Pag. 67

29 LABORATORIO – 2 – CÓDIGO <?php //create short variable name $DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT']; ?> Bob's Auto Parts - Customer Orders Bob's Auto Parts Customer Orders <?php @ $fp = fopen("$DOCUMENT_ROOT/./Ejemplo- 2/orders.txt", 'rb'); if (!$fp) { echo ' No orders pending.'.'Please try again later. '; exit; } while (!feof($fp)) { $order= fgets($fp, 999); echo $order.' '; } echo 'Final position of the file pointer is '.(ftell($fp)); echo ' '; rewind($fp); echo 'After rewind, the position is '.(ftell($fp)); echo ' '; fclose($fp); ?> 8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 29 Pag. 67 Este directorio fue creado por mi dentro de www.

30 EJEMPLO DE CORRIDA DE LA FORMA 8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 30

31 EJEMPLO DE LA CORRIDA DE PHP 8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 31

32 EJEMPLO DE LA CORRIDA QUE LEE LOS DATOS 8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 32

33 REFERENCIAS PHP and MySQL Web Development, Third Edition, Luke Welling, and Laura Thomson http://www.easyphp.org/ 8/12/2007 © - Derechos Reservados - Prof. Nelliud D. Torres 33


Descargar ppt "ECOM-6030 CAPÍTULO 2 STORING & RETRIEVING DATA Prof. Nelliud D. Torres © - Derechos Reservados."

Presentaciones similares


Anuncios Google