Inicio

Mostrando entradas con la etiqueta Funciones. Mostrar todas las entradas
Mostrando entradas con la etiqueta Funciones. Mostrar todas las entradas

jueves, 1 de septiembre de 2011

Subiendo ficheros al servidor

Una de las tareas que más pueden presentarse a la hora de programar con PHP es la de subir archivos al servidor. la función que nos va a permitir esta tarea es upload().
Para el correcto aprendizaje utilizaremos un ejemplo, en él que subiremos un archivo. Este solo puede ser de extencion .zip y ocupar menos de 30 kb, definiendo así las opciones del upload con php.

Primero empezaremos con el formulario html, encargado de enviar el archivo al servidor.



action="subir.php" method="post" name="miformulario" enctype="multipart/form-data">




Este formulario tiene un parametro nuevo llamado enctype, con el valor "multipart/form-data", informando que envía datos y archivos, opción indispensable para subir correctamente el fichero.


El fichero al que enviamos el formulario, encargado de procesarlo se llama subir.php.
Cómo vimos en el formulario, el campo de archivo se llama archivo:



De acuerdo a este nombre sera que trabajaremos en el lado del servidor, o sea en el script.
El archivo se guarda en la carpeta temporal del servidor, dato que hay que tenerlo en cuenta ya que no todos los servidores cuentan con esta opción y ponen el tamaño de dicha carpeta a 0, imposibilitando subir archivos.

Para referirnos al archivo en el script lo hacemos por medio de: $archivo

Otras propiedades que tendremos a nuestra disposicion es el tamaño (en bytes) y el nombre del archivo.
$archivo_name - Nombre del archivo (ej: instaladores.zip, miarchivo.zip)
$archivo_size - Tamaño del archivo en bytes (si son 10kb serian 10000 bytes)

Nota: A este punto cuándo nos referimos al archivo lo hacemos siempre con $archivo, debido a que en el formulario lo denominamos de esta forma().

La explicacion la hago suponiendo un conocimiento basico de php por parte del lector.

Primero mostrare el script, luego explicare linea por linea el script:


<?
$extension = explode(".",$archivo_name);
$num = count($extension)-1;
if($extension[$num] == "zip")
{
if($archivo_size < 30000)
{
if(!copy($archivo, "archivos/".$archivo_name))
{
echo "error al copiar el archivo";
}
else
{
echo "archivo subido con exito";
}
}
else
{
echo "el archivo supera los 30kb";
}
}
else
{
echo "el formato de archivo no es valido, solo .zip";
}
?>


Lo primero que haremos sera comprobar que la extencion del archivo es la permitida (.zip).
Para ello utilizamos la funcion de php explode, la cual guardará en un array el nombre del archivo segun el primer parametro (el punto):

$extension = explode(".",$archivo_name);
Para mejor entendimiento, si el archivo se llama ficheros.zip el explode pondria en este caso en la variable $extencion el nombre en dos partes: $extension[0] y $extension[1] los cuales contienen:
$extension[0] --> "ficheros"
$extension[1] --> "zip"
Ahora obtendremos la longitud del array, en este caso seria de 2 (ya que contiene 2 elementos "ficheros" y "zip"), a ese numero le mermamos 1 y lo asignamos a una variable llamada $num:
$num = count($extension)-1;

Nota: Le hemos mermado 1 a la longitud por que cuando queramos llamar al array $extension[$num] debemos de hacerlo teniendo en cuenta que los elementos van desde 0, por lo que aunque contenga 2 elementos no podemos llamar al segundo con $extension[2], si no que tenemos que llamarlo por su posicion $extencion[1].


Ahora haremos el condicional. Si la extencion del archivo es zip continuaremos con el proceso de upload, de lo contrario mostraremos mensaje de error.

if($extension[$num] == "zip")
{
...
}
else
{
echo "el formato de archivo no es valido, solo .zip";
}


Ahora, continuaremos con el upload, suponiendo que el archivo era el correcto.

Lo siguiente a hacer es comprobar el tamaño del archivo; para ello utilizaremos la variable antes mencionada $archivo_size. Si el tamaño es menor a los 30kb (recuerde, debe especificarlo en bytes, por lo que serian 30000) continuaremos con el upload, de lo contrario mostraremos un mensaje de error:

if($archivo_size < 30000)
{
...
}
else
{
echo "el archivo supera los 30kb";
}


Ahora, continuaremos con el upload, suponiendo que el tamaño del archivo es correcto.
Utilizaremos la función copy() de php, la cual copiara el archivo a la carpeta que especifiquemos.

Nota: El archivo que hemos subido por medio del formulario se guarda en la carpeta temporal del servidor y se accede a él por medio de la variable $archivo, este archivo será borrado de la carpeta temporal cuando el script finalize su ejecución, este proceso es automatico y lo realiza el servidor, usted no tiene que preocuparse por este aspecto.


En este caso copiaremos el archivo a una carpeta del servidor llamada archivos. Notese que la ruta de copiado debe de ser relativa, no absoluta, y es relativa al script.
Osea, si el script se ejecuta en:
http://www.servidor.net/cuenta/carpeta/subir.php

La funcion en este caso intentara copiarlo a:
http://www.servidor.net/cuenta/carpeta/archivos/

Lo hemos puesto en un if y con signo de negación(!), para que en caso de no poder copiar el archivo nos salga mensaje de error:

if(!copy($archivo, "archivos/".$archivo_name))
{
echo "error al copiar el archivo";
}
else
{
echo "archivo subido con exito";
}


En este caso el archivo ha sido copiado a la carpeta archivos y con el mismo nombre que tenía, osea, si el archivo se llamaba "ficheros.zip", el archivo ha quedado en la carpeta con el mismo nombre "archivos/ficheros.zip".

Notese que esto no es obligatorio, y podemos ponerle el nombre que queramos, si hubieramos querido que el archivo se llamara "jlmm.zip", simplemente pondriamos en el copy() lo siguiente:
copy($archivo, "archivos/jlmm.zip")

MANEJO DE FICHEROS

PHP ofrece una extensa gama de funciones para acceso a ficheros:
fopen(): se utiliza para abrir ficheros.
fclose():para cerrar ficheros.
La primera además cuenta con una serie de argumentos:
modo Descripción
'r' Apertura para sólo lectura; ubica el apuntador de archivo al comienzo del mismo.
'r+' Apertura para lectura y escritura; ubica el apuntador de archivo al comienzo del mismo.
'w' Apertura para sólo escritura; ubica el apuntador de archivo al comienzo de éste y lo trunca a una longitud de cero. Si el archivo no existe, intenta crearlo.
'w+' Apertura para lectura y escritura; ubica el apuntador de archivo al comienzo de éste y lo trunca a una longitud cero. Si el archivo no existe, intenta crearlo.
'a' Apertura para sólo escritura; ubica el apuntador de archivo al final del mismo. Si el archivo no existe, intenta crearlo.
'a+' Apertura para lectura y escritura; ubica el apuntador de archivo al final del mismo. Si el archivo no existe, intenta crearlo.
'x' Creación y apertura para sólo escritura; ubica el apuntador de archivo al comienzo de éste. Si el archivo ya existe, la llamada a fopen() fallará devolviendo FALSE y generando un error de nivel E_WARNING. Si el archivo no existe, intenta crearlo. Esto es equivalente a especificar las banderas O_EXCL|O_CREAT en la llamada de sistema open(2) interna.
'x+' Creación y apertura para lectura y escritura; ubica el apuntador de archivo al comienzo de éste. Si el archivo ya existe, la llamada a fopen() fallará devolviendo FALSE y generando un error de nivel E_WARNING. Si el archivo no existe, intenta crearlo. Esto es equivalente a especificar las banderas O_EXCL|O_CREAT en la llamada de sistema open(2) interna.

Ejemplo:
<?php
$gestor 
fopen("/home/rasmus/archivo.txt""r");$gestor fopen("/home/rasmus/archivo.gif""wb");$gestor fopen("http://www.example.com/""r");$gestor fopen("ftp://usuario:contrasenya@example.com/un_archivo.txt""w");?>


Para crear un nuevo directorio usaremos la función mkdir():

<?
$nuevodir="x";
mkdir($nuevodir);
?>
   

jueves, 25 de agosto de 2011

PHP include() Function

Podemos incluir el contenido de un fichero PHP dentro de otro, antes de que el servidor lo ejecute con las funciones include() o require(). Ambas tienen la misma manera de actuar salvo en lo referente al tratamiento de errores.
  • include() genera una llamada de atención pero el script continúa ejecutándose.
  • require() genera un error crítico que hace que el script se detenga.
Las dos funciones se utilizan para la ejecución y generación de funciones, cabeceras, pies que pueden ejecutarse y reutilizarse en otros ficheros.
Esto comporta un importante ahorro de carga al servidor: podemos crear una página estándar o un menú de ficheros para nuestras páginas web.
Ejemplo:

Primero creo el fichero header.php que va a contener las etiquetas de cabecera simples de html.
<html>
<head>
<title>Ejemplo de include()</title>
</head>
<body>

El fichero footer.php
Todos los derechos reservados
</body>
</html>

El cuerpo del documentoal que le llamo cuerpo.php
<?php include("header.php");
echo"Como puede ver hemos incluido el fichero header y footer ";
echo"<br>";
include("footer.php");
?>








Funciones de calendario

Como ya les comenté son muy extensas las bibliotecas de funciones predefinidas que tiene PHP. En este post y muy resumidamente les expongo las funciones de calendario, que nos permite obtener múltiples configuraciones al respecto:

Función Descripción PHP
cal_days_in_month() Devuelve el número de días en un mes para un determinado año 4
cal_from_jd() Convierte a Julian un día de determinada fecha del calendario 4
cal_info() Devuelve información sobre un calendario 4
cal_to_jd() Convierte una fecha en díasJulian 4
easter_date() Devuelve el timestamp de Unix para la medianoche del día de Pascua de un año específico 3
easter_days() Devuelve el número de días a partir de 21 de marzo de Semana Santa de un año específico 3
FrenchToJD() Convierte una fecha calendario republicano francés a la fecha de Julian 3
GregorianToJD() Convierte una fecha gregoriana a una fecha Julian 3
JDDayOfWeek() Devuelve el día de una semana 3
JDMonthName() Devuelve un nombre del mes 3
JDToFrench() Convierte dia Julian en día republicano francés 3
JDToGregorian() Convierte fecha Julian a fecha Gregoriana 3
jdtojewish() Convierte un día Julian a un dia judío 3
JDToJulian() Convierte un dia Julian a una fecha del calendario juliano 3
jdtounix() Convierte un dia Julian a un timestamp de Unix 4
JewishToJD() Convierte una fecha judío a una fecha Julian 3
JulianToJD() Convierte una fecha del calendario juliano a una Julian 3
unixtojd() Convierte un timestamp de Unix a un día Julian 4

Ejemplo:
<?php
$dias=unixtojd(mktime(0,0,0,9,11,2001));
print_r(cal_from_jd($dias,CAL_GREGORIAN));
echo"<br>";
print_r(cal_from_jd($dias,CAL_JULIAN));
echo"<br>";
print_r(cal_from_jd($dias,CAL_JEWISH));
echo"<br>";
print_r(cal_from_jd($dias,CAL_FRENCH));
?>
El resultado sería:

Array ( [date] => 9/11/2001 [month] => 9 [day] => 11 [year] => 2001 [dow] => 2 [abbrevdayname] => Tue [dayname] => Tuesday [abbrevmonth] => Sep [monthname] => September )
Array ( [date] => 8/29/2001 [month] => 8 [day] => 29 [year] => 2001 [dow] => 2 [abbrevdayname] => Tue [dayname] => Tuesday [abbrevmonth] => Aug [monthname] => August )
Array ( [date] => 13/23/5761 [month] => 13 [day] => 23 [year] => 5761 [dow] => 2 [abbrevdayname] => Tue [dayname] => Tuesday [abbrevmonth] => Elul [monthname] => Elul )
Array ( [date] => 0/0/0 [month] => 0 [day] => 0 [year] => 0 [dow] => 2 [abbrevdayname] => Tue [dayname] => Tuesday [abbrevmonth] => [monthname] => )


viernes, 19 de agosto de 2011

Funciones de cadenas

La función substr() permite leer parte de una cadena de texto y toma como mínimo dos parámetros: la cadena a analizar y el punto desde donde queremos que comienze a leer.
Sintáxis: substr ( string $string , int $start [, int $length ] )
Ejemplo:
<?php
$rest1 = substr("Enrique", -1);    // devuelve "e"
$rest2 = substr("Enrique", -2);    // devuelve "ue"
$rest3 = substr("Enrique", -3, 1); // devuelve "q"

echo $rest1 ."<br>";
echo $rest2 ."<br>";
echo $rest3;
?>





La función chr() toma una función ASCII y devuelve el carácter equivalente. La función ord() hace exactamente lo contrario.
Ejemplo:
<?php
echo (chr(69));
?>
 

La función strlen() devuelve la longitud de la cadena que se ha utilizado como argumento:
<?php
 echo "Enrique tiene ". strlen(Enrique)." letras.";
?>

 

Función Rand()

Para generar números aleatorios se puede usar esta función que lleva como argumentos opcionales el número más bajo y el más alto. Así si desea generar números entre el 1 y el 49 podría ejecutar el siguiente código:
<?php
echo "Combinación para apuesta: <br>";
echo rand(1,49) . "\n";
echo rand(1,49) . "\n";
echo rand(1,49) . "\n";
echo rand(1,49) . "\n";
echo rand(1,49) . "\n";
echo rand(1,49) . "\n";
?>

Si no le damos argumentos a la función esta generará números entre el 0  y el por defecto: getrandmax() que es el 32768.
Otra función opcional a la descrita es mt_rand ( int $min , int $max ), que genera números aleatorios de una forma más rápida y fiable.

FUNCIONES II (Parámetros)

Como ya comenté en un anterior post, las librerías de funciones en PHP son unos de los mejores recursos que tenemos en este lenguaje.
Hemos definido cómo es la sintáxis de una función, y hemos hecho mención a los parámetros. Los parámetros (o argumentos) son variables y/o constantes que establecen una "comunicación" entre partes del código, y que se tratarán como variables locales dentro de la función. Es posible que la lista de parámetros de una función esté vacía, es decir, que no aparezca ningún parámetro dentro de los paréntesis ().

PHP admite pasar valores por valor o por referencia. Esto que quiere decir:

Cuando creás una variable y le asignámos un valor tenemos dos cosas:

- el valor asignado
- la dirección de memoria en la que se almacena dicho valor.

La variable en realidad no contiene datos, sino que "sabe" la dirección de memoria en la que esos datos están almacenados.

Así, cuando se pasa por valor se copian los datos: se toman de la memoria y se almacenan en otro lugar, luego se asigna a la variable la referencia a esos nuevos datos.

Y cuando se pasa por referencia se copia, justamente, la referencia a la posición de memoria. Así, como la variable de la función apunta a la misma memoria, apunta a los mismos datos y por lo tanto puede modificar la variable original.

Supongamos que tenés la variable

$x = 5;

y la pasás a una función

mi_funcion($x);

Si el paso es por valor, la función tendrá una firma como la siguiente

function mi_funcion($parametro)

Y al momento de ejecutarse se creará la variable $parametro, a la que se asignará el valor de $x. Es decir, los datos almacenados en la dirección de memoria a la que apunta $x serán copiados a otra posición de memoria, y a esa nueva posición apuntará $parametro.

Si el paso es por referencia, la función tiene una firma como esta:

function mi_funcion(&$parametro)

Esto implica que al momento de ejecutarse la función, tanto $x como $parametro terminan apuntando a los mismos datos (claro está, $parametro solamente existe mientras la función se ejecuta). Normalmente la función no puede modificar la variable original, pero sí puede hacerlo si el paso es por referencia.

Este procedimiento para pasar parámetros por referencia desde la llamada de la función ha quedado en desuso y provocará Warnings en las configuraciones por defecto de PHP. 

martes, 16 de agosto de 2011

Funciones

Podría decirse que las funciones son el aspecto más atractivo y poderoso de PHP. De hecho existen más de 700 funciones predefinidas que se pueden agrupar en las siguientes categorías:

Para crear una función en PHP emplearemos la sintáxis siguiente:
function functionName()
{
código a ejecutar;
}


Es aconsejable nombrar la función con una palabra que identifique adecuadamente lo que hace. Podemos emplear con una letra incluso con guión bajo, pero no con números. En el siguiente ejemplo definimos una función que escribe mi nombre cuando la invoco:

html>
<body>
<?php
//defino la función
function minombre()
{
echo "Enrique Manuel Cabello Portero";
}
//llamada a la función
echo "Hola me llamo ";
minombre();
?>
</body>
</html>

Adicionalmente y, al objeto de darle más funcionalida ,podemos añadirle parámetros a nuestras funciones. 
Veamos otro ejemplo en el que calculamos el factorial de 4.
<?php
function factorial($n) {

if ($n<0) {
return "Sólo se puede calcular con números positivos";
}
else if ($n==0)
return 1;
else {
$a=1;
for($i=2 ;$i<=$n;$i++) {
$a=$a*$i;
}
return $a;
}
}
echo " El factorial de 4 se escribe 4! y es igual a ".factorial(4)
?>
En principio evaluamos la posibilidad que se intoduzca como parámetros el 0 o un número negativo. Posteriormente y, valiendonos de un bucle for realizamos la operación matemática.  Observe que cuando la función ha de devolver una cadena debe hacerlo con la expresión return.


miércoles, 10 de agosto de 2011

PHP dinámico

Hasta ahora hemos visto una serie de scripts pero sin entrar a fondo en el aspecto dinámico como tal de PHP.
Cuando se trata de páginas estáticas la comunicación está muy restringida. El cliente hace una petición (escribe el nombre de una página en la barra de direcciones del navegador) y el servidor se limita a devolver los contenidos de esa página. Un primer paso para mejorar es esa comunicación será que el cliente especifique algo más en su petición y que el servidor interprete esa información complementaria.
Para poder profundizar en lo expuesto, previamente abordaremos algunos conceptos.
La función isset
isset() es una función de PHP que nos permite comprobar si una variable está definida, devolviendo true si lo estuviese. Esta función es muy común cuando deseamos comprobar que los campos de un formulario hayan sido rellenados, o incluso para mostrar un formulario completo y una vez que sea presionado el botón enviar, nos muestre otra cosa y el formulario sea enviado.
Su sintaxis es la siguiente: isset($variable)
 Veamos un ejemplo:
Escriba el siguiente código y guárdelo como formulario.html
<html xmlns="http://www.w3.org/1999/xhtml">


<body>
<form action="formulario.php" method="post" name="form" id="form">
<input type="text" name="nombre" />
<input type="submit" name="enviar" />
</form>

</body>
</html>

Escriba ahora este otro y guárdelo como formulario.php
<?php
if (isset($nombre) && $nombre!="") {
echo "Hola $nombre, bienvenido a PHP";}
else {
            echo "No has escrito nada"; }


?>

isset verifica si la variable está o no definida, literalmente se puede leer tras la etiqueta php si la variable nombre está definida (existe) y su valor no está vacío saca el mensaje "Hola lo que sea, etc" si no "No has escrito nada"

La función unsset
unset() destruye las variables especificadas.Modifique para probarlo el código anterior de la siguiente forma:

<?php


    unset($nombre);


if (isset($nombre) && $nombre!="") {
echo "Hola $nombre, bienvenido a PHP";}
else {
            echo "No has escrito nada"; }


?>

Como comprobará aunque escriba lo que sea en la caja de texto, el servidor siempre le responderá lo mismo "No has escrito nada", y ello porque unset ha eliminado la variable y por tanto su contenido.