0% encontró este documento útil (0 votos)
124 vistas23 páginas

Taller de PHP Unidad 2

El documento presenta información sobre Daniel Reynoso, un joven programador mexicano de 18 años apasionado por la informática y la programación. Reynoso ha colaborado con varios proyectos y comunidades y actualmente tiene un proyecto llamado rootscripts. El documento también introduce un taller sobre PHP, explicando conceptos básicos del lenguaje como arrays y su utilidad para crear sitios web eficientes. El taller recomienda el uso de NotePad++ como editor de código y cubrirá temas como sistemas de visitas y administradores de contenido.

Cargado por

Maria Perez
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
124 vistas23 páginas

Taller de PHP Unidad 2

El documento presenta información sobre Daniel Reynoso, un joven programador mexicano de 18 años apasionado por la informática y la programación. Reynoso ha colaborado con varios proyectos y comunidades y actualmente tiene un proyecto llamado rootscripts. El documento también introduce un taller sobre PHP, explicando conceptos básicos del lenguaje como arrays y su utilidad para crear sitios web eficientes. El taller recomienda el uso de NotePad++ como editor de código y cubrirá temas como sistemas de visitas y administradores de contenido.

Cargado por

Maria Perez
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 23

Xt3mP@h4x0rz.

us
http://underc0de.org
Acerca del autor
Daniel Reynoso (Xt3mP) es un joven autodidacta apasionado por la informática y la programación,
es un invitado especial de la comunidad underc0de la cual es administrada por ANTRAX.

Xt3mP tiene conocimientos no solo en programación web si no a nivel de escritorio acompañado


por una experiencia amateur en el área de diseño sin dejar a un lado su experiencia en la
seguridad. En sus ratos libres le gusta salir de fiesta a tomar y a divertirse. Ha colaborado con
varios proyectos y comunidades como parte de la administración y actualmente tiene un proyecto
que apenas va naciendo (rootscripts) el cual ofrecerá de manera gratuita y sin ningún fin de
lucro la mayoría de sus scripts.

Es de nacionalidad mexicana (a mucho orgullo) y con la pequeña edad de 18 años le gusta ayudar
a los demás siempre y cuando éstos muestren el interés y las ganas de aprender.

Introducción
Bienvenidos al taller de PHP, un taller que te introduce en éste lenguaje de programación. En este
taller se explica principalmente los puntos básicos hasta llegar a puntos más avanzados, también se
explica como crear sistemas que actualmente son muy eficaces a la hora de crear un sitio web.

Este curso esta elaborado por una razón muy clara, PHP se ha convertido en un lenguaje que no
debe faltar en ningún sitio web por su eficacia, flexibilidad y potencial por lo que veo conveniente
introducir a los lectores a que lo estudien ya que a futuro, será (si no es que ya lo es) uno de los
lenguajes más importantes.

El método de trabajo que utiliza este taller permite al usuario que al terminar cada tema pueda
poner en práctica lo que vio en éste, de esta manera no solo reforzamos lo aprendido, si no que
también nos familiarizamos con el lenguaje.

No es necesario que tengas conocimientos en HTML o en algún otro lenguaje; pero si los tienes,
se te facilitará mucho más el aprendizaje de éste lenguaje, esto no quiere decir que si no tienes
conocimientos en otros lenguajes se te vaya a dificultar, simplemente que puedes captar la
información mucho más fácil.

En la sección final (unidad IV – unidad VI) de este taller veremos como crear nuestros sistemas
basándonos en lo que en éste aprendimos, abarcaremos desde un simple sistema de visitas hasta
un administrador de contenidos no dejando a un lado la seguridad de nuestros sistemas.

También se anexaran archivos para que puedas comparar con los que tú posteriormente harás, de
esta manera si tienes alguna duda al ver el archivo se te despejara.

Recuerda que si tienes alguna pregunta o sugerencia tendrás que hacerla a través de la url
http://www.underc0de.org/foro/index.php?board=81.0.

Todos los programas utilizados en este taller son marcas registradas por sus compañías.

[email protected]
http://underc0de.org
¿Cómo trabajaremos?
Una vez que tengamos instalado algún servidor (les facilite dos servidores arriba) crearemos una
carpeta llamada taller que será donde almacenaremos los ejercicios, llevemos acabo las prácticas,
entre otras cosas que se indiquen en el transcurso del taller.

Imagen 1

Para acceder a esta carpeta mediante nuestro navegador iremos a http://localhost/taller/, o bien, a
http://127.0.0.1/taller/.

Imagen 1.1

¿Qué editor utilizaremos?


Les recomiendo NotePad++ por las siguientes razones:

 Es totalmente gratuito.
 Tiene una interfaz gráfica muy agradable.
 Tiene la opción de modificar la sintaxis de color.
 Tiene soporte para varios lenguajes.
 Pesa muy poco.
 Gasta poca memoria RAM.

Lo pueden descargar visitando http://notepad-plus-plus.org.

También existen otros programas como DreamWeaver, Eclipse, NetBeans, etc., pero en lo que a
mi respecta prefiero NotePad++ por los puntos que mencione arriba.

[email protected]
http://underc0de.org
PHP
PHP es un lenguaje que trabaja del lado del servidor y envía su respuesta en
formato HTML al cliente (navegador web). PHP es el acrónimo de PHP:
Hypertext Preprocessor y fue creado a base de una modificación de Perl
escrita por Rasmus Lerdof a finales de 1994. PHP es de código abierto y
gratuito, lo que quiere decir que se puede modificar o descargar sin pagar
ninguna licencia desde http://php.net.

Con PHP se puede hacer desde un gestor de contenidos, un sistema de usuarios, un foro, hasta
una tienda on-line. También, algo que muchos webmaster buscan es mostrar cierta información
dependiendo del nivel o del rango del usuario/cliente, por lo que PHP es la mejor opción para estos
casos. Por otro lado, PHP permite interactuar con diferentes bases de datos como son MySQL,
Oracle, PosgreSQL, entre otras. (En este taller solo miraremos acerca de MySQL).

Algo de lo más importante de PHP aparte de ser un código abierto y gratuito es que cuenta con una
gran cantidad de programadores que día tras día reportan fallos y arreglan todos estos ‘bugs’ que
hacen que PHP siempre este atendido y actualizado para prevenir ataques.

Es sumamente fácil a la hora de instalar, les recomiendo dos servidores:

Para Windows (appserv): www.appservnetwork.com/

Para Windows y otras plataformas (xampp): www.apachefriends.org/es/xampp.html

MySQL
MySQL (MySequal) es un gestor de base de datos muy rápido y eficaz el cual
utiliza SQL (Structured Query Language), éste es un gestor estandarte para las
consultas de base de datos utilizado en todo el mundo y en todo tipo de aplicación
en donde se manipule información.

MySQL es muy utilizado actualmente en aplicaciones importantes, una de ellas es Drupal (un gestor
de contenidos). Este gestor de base de datos se ha ganado a pulso que sea un estandarte por su
resultado a la hora de modificar o agregar simultáneamente.

Su página oficial es http://www.mysql.com/.

[email protected]
http://underc0de.org
Arrays ó Matrices
Un array (o matriz como también es conocido) es un mapa ordenado (es un tipo de datos que
asocia valores con claves), o como mejor se le define; es un tipo de variable que guarda un
conjunto de valores que comúnmente son almacenados por un índice o clave. A diferencia de las
variables comunes ($var) el array permite almacenar no solo un valor si no varios.

Existen tres tipos de array:

 Numéricos o escalares
 Asociativos
 Multidimensionales

Numéricos o escalares:

Se identifican principalmente por tener un índice tipo numérico (predeterminadamente comienza por
0):

<?php
$miarray = array('Xt3mP', 'México', '[email protected]'); #Creamos el array
echo $miarray[0]; #Xt3mP
echo '<br />';
echo $miarray[1]; #México
echo '<br />';
echo $miarray[2]; #[email protected]
?>

Como se puede observar en el ejemplo utilizamos el constructor array() para crear dicho array
(válgame la redundancia), en este caso el valor inicial predeterminado del índice es de 0 por lo que
dependiendo de los valores o “ítems” que le indiquemos será el número final de éste (en este caso
es de 0 a 2).

<?php
$miarray = array('Taller', 'underc0de'); #Creamos el array
echo $miarray[0]; #Taller
echo '<br />';
echo $miarray[1]; #underc0de
?>

En este ejemplo el índice numérico solo llega a 2 ya que solo se le asignan dos ítems. El índice
numérico también puede iniciar por un número que nosotros asignemos previamente; es decir, si no
queremos que sea 0 tanto por estética o por otras cuestiones podemos indicarlo de la siguiente
manera:

<?php
$miarray = array(6 =>'Taller', 'underc0de'); #Creamos el array
echo $miarray[6]; #Taller
echo '<br />';
echo $miarray[7]; #underc0de
?>

En el ejemplo anterior le asignamos el 6 como índice numérico primario. No es necesario asignarle


el índice numérico a todos los ítems del array puesto que con ingresárselo a uno éste va en
aumento (de uno en uno) a menos que nosotros se lo asignemos directamente como en el primer
ítem.

[email protected]
http://underc0de.org
Asociativos:

Estos son idénticos a los numéricos o escalares con la simple diferencia de que su índice es de tipo
string; es decir, en vez de asignarles un índice con un número lo haremos con una cadena de
caracteres (texto) los cuales nos permitirán identificar mucho más fácil el ítem que requerimos en
ese momento:

<?php
$miarray = array('nick' =>'Xt3mP', 'msn' => '[email protected]'); #Creamos el array
echo $miarray['nick']; #Xt3mP
echo '<br />';
echo $miarray['msn']; #[email protected]
?>

Como se puede observar es exactamente igual que asignar un índice numérico con la única contraria
que en éstos se asignan ‘cadenas de caracteres (texto)’, en este caso al valor Xt3mP le asigne el
índice nick y al valor [email protected] le asigne msn.

Esto en lo personal es algo de lo más útil ya que cuando comiences a utilizar los arrays necesitaras
identificar fácilmente los ítems/elementos que manipularas.

Multidimensionales:

Estos tienen dos o más arrays dentro de si mismo; es decir, es un array que tiene como ítems otros
arrays (pueden ser numéricos/escalares, asociativos o ambos):

<?php
$miarray = array(
'numericos' => array(
'Xt3mP',
'[email protected]'
),
'asociativos' => array(
'nick' =>'Xt3mP',
'msn' => '[email protected]'
)
); #Creamos el array multidimensional
echo $miarray['numericos']['0']; #Xt3mP
echo '<br />';
echo $miarray['asociativos']['msn']; #[email protected]
?>

Generalmente estos se utilizan cuando la información a procesar es bastante ya que al momento de


manipular ésta podremos acceder más fácil a ella ($data['user']['msn']).

Utilizar el constructor array() no es la única manera de crear un array, podemos utilizar $var[]:

<?php
$miarray[] = 0;
$miarray[] = 1;
echo $miarray[1]; #1
?>

En donde dentro de los corchetes ([]) puede indicarse un índice numérico ([1]), asociativo
(['nick']) o en este caso, dejarlos vacíos; significa numérico el cual comienza por el 0.
Recomendación: Practicar los distintos tipos de arrays.

[email protected]
http://underc0de.org
Manipular arrays
Existen varias funciones que nos permitirán ordenar un array (sin importar el índice) dependiendo
del valor que éstos tengan, para ello existen funciones que nos facilitara el orden dependiendo de
cómo lo queramos; es decir, de mayor a menor tanto alfabéticamente como numéricamente:

 sort()
 rsort()
 ksort()
 krsort()
 asort()
 arsort()
 natsort()

sort():

Ordena los elementos de menor a mayor dependiendo del valor del ítem:

<?php
$miarray = array('Xt3mP', 'México', '[email protected]');
sort($miarray);
foreach($miarray as $indice => $valor){
echo 'miarray['.$indice .']: '.$valor.'<br/>';
}
#miarray[0]: México
#miarray[1]: Xt3mP
#miarray[2]: [email protected]
?>

rsort():

Ordena los elementos de mayor a menor dependiendo del valor del ítem:

<?php
$miarray = array('Xt3mP', 'México', '[email protected]');
rsort($miarray);
foreach($miarray as $indice => $valor){
echo 'miarray['.$indice .']: '.$valor.'<br/>';
}
#miarray[0]: [email protected]
#miarray[1]: Xt3mP
#miarray[2]: México
?>

ksort():

Ordena los elementos de menor a mayor dependiendo del índice del ítem:

<?php
$miarray = array('a' =>'Xt3mP', 'b' =>'México', 'c' => '[email protected]');
ksort($miarray);
foreach($miarray as $indice => $valor){
echo 'miarray['.$indice .']: '.$valor.'<br/>';
}
#miarray[a]: Xt3mP
#miarray[b]: México
#miarray[c]: [email protected]
?>

[email protected]
http://underc0de.org
krsort():

Es lo mismo que ksort() con la diferencia de que los ordena inversamente.

<?php
$miarray = array('a' =>'Xt3mP', 'b' =>'México', 'c' => '[email protected]');
krsort($miarray);
foreach($miarray as $indice => $valor){
echo 'miarray['.$indice .']: '.$valor.'<br/>';
}
#miarray[c]: [email protected]
#miarray[b]: México
#miarray[a]: Xt3mP
?>

asort():

Ordena los elementos de menor a mayor dependiendo del valor del ítem (a diferencia de sort(),
éste respeta el índice que tenga establecido):

<?php
$miarray = array('Xt3mP','México', '[email protected]');
asort($miarray);
foreach($miarray as $indice => $valor){
echo 'miarray['.$indice .']: '.$valor.'<br/>';
}
#miarray[1]: México
#miarray[0]: Xt3mP
#miarray[2]: [email protected]
?>

arsort():

Es lo mismo que asort() con la diferencia de que los ordena inversamente.

<?php
$miarray = array('Xt3mP','México', '[email protected]');
arsort($miarray);
foreach($miarray as $indice => $valor){
echo 'miarray['.$indice .']: '.$valor.'<br/>';
}
#miarray[2]: [email protected]
#miarray[0]: Xt3mP
#miarray[1]: México
?>

natsort():

Ordena los elementos naturalmente respetando el índice establecido:

<?php
$miarray = array('Xt3mP 1', 'Xt3mP 7', 'Xt3mP 3', 'Xt3mP 28');
natsort($miarray);
foreach($miarray as $indice => $valor){
echo 'miarray['.$indice .']: '.$valor.'<br/>';
}
#miarray[0]: Xt3mP 1
#miarray[2]: Xt3mP 3
#miarray[1]: Xt3mP 7
#miarray[3]: Xt3mP 28
?>

Recomendación: Practicar los distintos tipos de ordenamiento de arrays.

[email protected]
http://underc0de.org
Contar ítems de un array

Contar un array (independientemente del tipo que sea) en estos tiempos es sumamente fácil; esto
se lo debemos a la función count() la cual nos regresa el número total de ítems de un array, ya no
es necesario utilizar bucles para saber cuantos ítems tiene un array multidimensional ya que con
esta función también nos regresa el total.

Array numérico o asociativo/escalar

<?php
$miarray = array('Xt3mP','México', '[email protected]');
echo count($miarray); #3
?>

Array multidimensional (resultado inesperado)

<?php
$miarray = array(
'numericos' => array(
'Xt3mP',
'[email protected]'
),
'asociativos' => array(
'nick' =>'Xt3mP',
'msn' => '[email protected]'
)
);
echo count($miarray); #2
?>

Este último ejemplo es un resultado inesperado muy común ya que se cuentan los ítems como tal
sin importar que tenga otro array dentro, para solucionar esto utilizaremos la misma función
count() agregándole el parámetro COUNT_RECURSIVE la cual forzará la función a diferenciar el
array dentro del array para que también los cuente como ítems:

Array multidimensional

<?php
$miarray = array(
'numericos' => array(
'Xt3mP',
'[email protected]'
),
'asociativos' => array(
'nick' =>'Xt3mP',
'msn' => '[email protected]'
)
);
echo count($miarray, COUNT_RECURSIVE); #6
?>

Recomendación: Practicar la forma de contar un array para los dos diferentes casos.

[email protected]
http://underc0de.org
Mover el puntero de un array

A veces nos encontramos en situaciones en donde es necesario mover el puntero del array hacia
adelante, atrás, inicio y/o final de éste; inclusive mostrar en donde se encuentra actualmente, para
ello existen 4 funciones principales:

 next()
 prev()
 reset()
 end()

next()

Esta función mueve el puntero al siguiente ítem:

<?php
$miarray = array('Xt3mP','México', '[email protected]');
echo next($miarray); #México
?>

prev()

Esta función mueve el puntero al anterior ítem (en el siguiente ejemplo adelante dos ítems para
demostrar como se utiliza):

<?php
$miarray = array('Xt3mP','México', '[email protected]');
next($miarray); #México
next($miarray); #[email protected]
echo prev($miarray); #México
?>

reset()

Esta función mueve el puntero al inicio del array; es decir, al primer ítem:

<?php
$miarray = array('Xt3mP','México', '[email protected]');
next($miarray); #México
next($miarray); #[email protected]
echo reset($miarray); #Xt3mP
?>

end()

Esta función mueve el puntero al final del array; es decir, al último ítem:

<?php
$miarray = array('Xt3mP','México', '[email protected]');
echo end($miarray); #[email protected]
?>

Recomendación: Practicar la forma de mover el puntero dentro de un array.

[email protected]
http://underc0de.org
Modificar un array

Así como existen funciones para moverse dentro de un array también existen otras para reducir o
aumentar un array; inclusive hasta ‘fusionar’. Algunas de las más comunes son:

 unset()
 array_slice()
 array_push()
 array_merge()
 array_shift()
 array_pop()

unset()

Esta función nos permitirá eliminar un elemento/ítem de un array (no solo sirve para arrays, si no
para sesiones y otras cosas que veremos más adelante):
<?php
$miarray = array('Xt3mP','México', '[email protected]');
$arr = count($miarray);
echo 'Antes de utilizar unset son '.$arr.' Ítems.<br/>';
unset($miarray[1]); #Quitamos México
$arr = count($miarray);
echo 'Ahora son '.$arr.' Ítems.<br/>';
#Antes de utilizar unset son 3 Ítems.
#Ahora son 2 Ítems.
?>

array_slice()

Esta función nos permitirá dividir el array (por decirlo de alguna manera) utilizando primordialmente
dos parámetros; el array y el índice (se puede agregar otro parámetro más indicando cuantos ítems
recorrerá después del primer recorte):

<?php
$miarray = array('Xt3mP','México', '[email protected]', '18', '20');
$miarray1 = array_slice($miarray, 1);
print_r($miarray1);
$miarray2 = array_slice($miarray, 2, 2);
echo '<br/>';
print_r($miarray2);
?>

En el primer ‘slice’ nos mostraría desde México hasta 20 ya que indicamos que comience desde el
índice 1 y en el segundo ‘slice’ nos mostraría [email protected], 18 y 20 puesto que indicamos que
empiece desde el índice 2 y recorra 2 ítems después de esa posición.

[email protected]
http://underc0de.org
array_push()

Esta función nos permitirá agregar un elemento/ítem al final de un array:

<?php
$miarray = array('Xt3mP','México', '[email protected]');
$arr = count($miarray);
echo 'Antes de utilizar array_push son '.$arr.' Ítems.<br/>';
array_push($miarray,'18'); #Agregamos 18
$arr = count($miarray);
echo 'Ahora son '.$arr.' Ítems.<br/>';
#Antes de utilizar unset son 3 Ítems.
#Ahora son 2 Ítems.
#Xt3mP, México, [email protected] y 18 (este último lo agregamos con array_push).
?>

array_merge ()

Esta función nos permitirá agregar un elemento/ítem al final de un array:

<?php
$miarray = array('Xt3mP','México', '[email protected]');
$miarray2 = array('18', '22');
$miarray3 = array_merge($miarray, $miarray2);
echo 'mirray: '.count($miarray).'<br/>'; #3
echo 'mirray2: '.count($miarray2).'<br/>'; #2
echo 'mirray3: '.count($miarray3).'<br/>'; #5
?>

array_shift()

Esta función nos permitirá quitar el primer elemento de un array:

<?php
$miarray = array('Xt3mP','México', '[email protected]');
echo $miarray[0].'<br/>'; #Xt3mP
array_shift($miarray); #Quitamos Xt3mP
echo $miarray[0].'<br/>'; #México
?>

array_pop ()

Esta función nos permitirá quitar el último elemento de un array:

<?php
$miarray = array('Xt3mP','México', '[email protected]');
echo $miarray[2].'<br/>'; #[email protected]
array_pop ($miarray); #Quitamos [email protected]
echo $miarray[2].'<br/>';
#No mostraría nada porque en este caso ya no existe el índice 2 (lo removimos con
#array_pop)
?>

Existen otras funciones como lo son:

 is_array($array): Comprueba que se trate de un array.


 in_array($key, $array): Comprueba que el parámetro existe en el array.

Recomendación: Practicar la forma de manipular un array.

[email protected]
http://underc0de.org
Ficheros
Por fin hemos llegado a una de las partes un tanto importantes de PHP; los ficheros. Al oír hablar de
ficheros muchos creen que cuesta demasiado trabajo manejarlos pero no es así. En esta sección del
taller aprenderemos a como manipularlos; es decir, copiar, borrar, crear, subir, entre otras cosas.

También aprenderemos a como incluir archivos y varios métodos para hacer esto; no solo nos
enfocaremos a un uploader si no a todo tipo de manipulación como mencione anteriormente.

El siguiente formulario en HTML será el que utilicemos para subir un archivo en esta unidad:

formulario.html

<form action='procesar.php' method='POST' enctype='multipart/form-data'>


Seleccione archivo: <input type='file' name='file' /><br />
<input type='submit' name='upload' value='Subir' />
</form><!-- Nota: procesr.php ira variando conforme vaya escribiendo un nuevo nombre -->

Subir un archivo por HTTP

Para poder manipular la información que enviemos por HTTP haremos uso del array $_FILES el
cual almacenara toda la información del archivo en cuestión, este array fue implementado en la
versión 4.1.0 de PHP haciendo así obsoleto al array $HTTP_POST_FILES.

$_FILES tiene varios ítems pero los más importantes son:

 $_FILES['fichero'][ 'tmp_name']: Este ítem almacena el nombre temporal del archivo.


 $_FILES['fichero'][ 'name']: Este ítem almacena el nombre de archivo.
 $_FILES['fichero'][ 'type']: Este ítem almacena el tipo de archivo.
 $_FILES['fichero'][ 'size']: Este ítem almacena el tamaño del archivo en bytes.
 $_FILES['fichero'][ 'error']: Este ítem almacena el tipo de error de archivo:
o 0: No existe ningún error; es decir, el archivo se subió con éxito.
 UPLOAD_ERR_OK
o 1: El archivo sobrepasa el peso máximo indicado en php.ini.
 UPLOAD_ERR_INI_SIZE
o 2: El archivo sobrepasa el peso máximo indicado en el formulario HTML.
 UPLOAD_ERR_FORM_SIZE
o 3: El archivo se subió incompletamente.
 UPLOAD_ERR_PARTIAL
o 4: El archivo no se subió.
 UPLOAD_ERR_NO_FILE
o 6: Imposible de encontrar la carpeta temporal (comúnmente llamada tmp).
 UPLOAD_ERR_NO_TMP_DIR
o 7: El archivo no se pudo escribir en el disco.
 UPLOAD_ERR_CANT_WRITE
o 8: La extensión indicada en la configuración de PHP no coincide con la del archivo.
 UPLOAD_ERR_EXTENSION

Fueron asignadas como constantes desde PHP 4.3.0 (el nombre de la constante se encuentra debajo de la descripción).

[email protected]
http://underc0de.org
Una vez aclarado los diferentes ítems comenzaremos a ponerlos en marcha (tomaremos de
referencia el formulario anterior y un archivo de texto llamado taller.txt):

procesar.php

<?php
echo 'Nombre temporal: '.$_FILES['file']['tmp_name'].'<br/>';
echo 'Nombre: '.$_FILES['file']['name'].'<br/>';
echo 'Tamaño (en bytes): '.$_FILES['file']['size'].'<br/>';
echo 'Tipo: '.$_FILES['file']['type'].'<br/>';
echo 'Número de error: '.$_FILES['file']['error'].'<br/>';
#Nombre temporal: C:\WINDOWS\Temp\php1C.tmp
#Nombre: taller.txt
#Tamaño (en bytes): 0
#Tipo: text/plain
#Número de error: 0
?>

Como se puede observar nos regresa la información del archivo en cuestión (en este caso
taller.txt) más sin embargo este no lo sube a un directorio en específico si no a la carpeta temporal
(tmp en la mayoría de los casos). Para subirlo a una ubicación exacta utilizaremos la función
move_uploaded_file() la cual si tienen un poco de noción sobre ingles sabrán que significa
‘Mover el archivo subido’; esta función es sumamente fácil de utilizar:

procesar2.php

<?php
$dir = 'uploads/';
if(move_uploaded_file($_FILES['file']['tmp_name'], $dir.$_FILES['file']['name']))
{
echo 'Nombre temporal: '.$_FILES['file']['tmp_name'].'<br/>';
echo 'Nombre: '.$_FILES['file']['name'].'<br/>';
echo 'Tamaño (en bytes): '.$_FILES['file']['size'].'<br/>';
echo 'Tipo: '.$_FILES['file']['type'].'<br/>';
echo 'Número de error: '.$_FILES['file']['error'].'<br/>';
}else{
echo 'Error: '.$_FILES['file']['error'].', no se pudo subir el archivo';
}
?>

Imagen 1

Como se puede observar el archivo se sube correctamente, es muy importante que la carpeta que le
asignemos exista (en este caso uploads) ya que de caso contrario dará un error:
Warning: move_uploaded_file(uploads2/taller.txt) [function.move-uploaded-file]: failed to open
stream: No such file or directory in C:\AppServ\www\Taller\Unidad II\procesar2.php on line 3
Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move
'C:\WINDOWS\Temp\php28.tmp' to 'uploads2/taller.txt' in C:\AppServ\www\Taller\Unidad
II\procesar2.php on line 3
Error: 0, no se pudo subir el archive

[email protected]
http://underc0de.org
Restringir extensiones de archivos cargados por HTTP

A veces es muy importante controlar los tipos de archivos que suben los visitantes/usuarios en
nuestro sitio web para evitar alguna intrusión (shells, etc). Antes era muy difícil hacer esto porque
las funciones para controlar esto eran muy escasas, pero en estos tiempos ya existen funciones que
nos facilitan esta tarea.

Una de ellas es pathinfo() la cual nos regresa información acerca un archivo.

Tenemos dos opciones para manipular esta función. La primera es asignando ésta a una variable
($var = pathinfo($file)) la cual nos regresaría un array asociativo ($var['extension']) con
cuatro (4) ítems. La segunda es utilizando la misma función con las constantes que vienen
predeterminadamente (pathinfo($file, PATHINFO_EXTENSION)):

 Con variable ($var = pathinfo($file)):


o $var['dirname']: Regresa la dirección de un archivo.
o $var['basename']: Regresa el nombre de archivo con todo y extensión.
o $var['extension']: Regresa la extensión de un archivo.
o $var['filename']: Regresa el nombre de archivo sin extensión.
 Con constante (pathinfo($file, PATHINFO_X)) en donde X es:
o DIRNAME: Regresa la dirección de un archivo.
o BASENAME: Regresa el nombre de archivo con todo y extensión.
o EXTENSION: Regresa la extensión de un archivo.
o FILENAME: Regresa el nombre de archivo sin extensión.

procesar3.php

<?php
$ext_permitidas = array('txt','html');
$tmp = $_FILES['file']['tmp_name'];
$name = $_FILES['file']['name'];
$ext = pathinfo($name, PATHINFO_EXTENSION);
$dir = 'uploads/';
if(in_array($ext, $ext_permitidas))
{
if(move_uploaded_file($tmp, $dir.$name))
{
echo 'Archivo subido correctamente.';
}else{
echo 'Hubo un error al subir el archivo.';
}
}else{
echo 'Archivos con la extension '.$ext.' no son permitidos';
}
?>

Como se puede observar asignamos las extensiones permitidas en un array para posteriormente
hacer uso de la función in_array() y comprobar que la verdadera extensión del archivo se
encuentra en el array, así controlamos que extensiones permitimos que se suban al sitio. En este
caso utilizamos el archivo taller.txt el cual fue subido perfectamente pero si usamos testing.php
nos daría el error ya que la extensión php no se encuentra en el array $ext_permitidas:
Archivos con la extension php no son permitidos

Recomendación: Practicar la forma de subir un archivo y restringir su extensión.

[email protected]
http://underc0de.org
Copiar un archivo

Algunas veces nos vemos en la necesidad de copiar algún archivo para renombrarlo o bien;
manipularlo a nuestro antojo. Para eso existe la función copy() la cual recibe dos parámetros:

 Dirección del archivo original.


 Dirección del archivo nueva.

<?php
$dir = 'uploads/';
if(copy($dir.'taller.txt', $dir.'tallercopia.txt'))
{
echo 'Archivo copiado correctamente';
}else{
echo 'Error al copiar el archivo';
}
#Archivo copiado correctamente
?>

Imagen 2

Comprobar la existencia de un archivo o fichero

En algunos casos es muy importante saber si un archivo o directorio existe ya que a veces para
nuestros scripts será necesario abrir el archivo o subir algún archivo en una carpeta, y si ésta no
existe nos dará un error. Para eso existe la función file_exists() la cual su único parámetro es el
archivo o el directorio a comprobar:

<?php
$dir = './uploads/';
if(file_exists($dir.'taller.txt'))
{
echo 'Archivo taller.txt existente <br/>';
}else{
echo 'Archivo taller.txt inexistente <br/>';
}
if(file_exists($dir2))
{
echo 'Carpeta existente <br/>';
}else{
echo 'Archivo inexistente <br/>';
}
#Archivo taller.txt existente
#Archivo existente
?>

Existe un punto y diagonal (./) en la variable $dir lo que indica que se trata de la misma carpeta en
donde esta alojado el archivo, por caso contrario al poner nosotros dos puntos y diagonal (../)
indicamos que se trata de una carpeta atrás de donde esta el archivo actual. Es decir, .. sirve para
retroceder un directorio y . para buscar en el directorio actual. En este caso podemos referirnos al
directorio como ‘./uploads/’ o ‘uploads/’.

Recomendación: Practicar la forma de subir copiar un archivo y comprobar su existencia.

[email protected]
http://underc0de.org
Crear, eliminar y contar un directorio

Esto es algo de lo más sencillo refiriéndonos a ficheros en PHP. Para crear un directorio utilizaremos
la función mkdir() y para eliminarlo utilizaremos la función rmdir().

<?php
if(mkdir('testing/'))
{
echo 'Carpeta testing creada correctamente <br/>';
}else{
echo 'Carpeta testing no fue creada <br/>';
}
#Carpeta testing creada correctamente
?>

Imagen 3

Por caso contrario, para eliminar un directorio es:


<?php
if(rmdir('testing/'))
{
echo 'Carpeta testing borrada correctamente <br/>';
}else{
echo 'Carpeta testing no fue borrada <br/>';
}
#Carpeta testing borrada correctamente
?>

Tenemos que tener en cuenta que si intentamos borrar una carpeta que no existe nos dará un error
como el siguiente:
Warning: rmdir(testing2/) [function.rmdir]: No such file or directory in
C:\AppServ\www\Taller\Unidad II\rmdir.php on line 2
Carpeta testing no fue borrada

Para evitar los errores de este tipo (no solo para estas funciones si no para todas) agregamos un @
al inicio de la función (@rmdir); de esta manera todo tipo de error que pueda causar no será
mostrado en pantalla. Si hacemos un buen uso de esto inclusive podemos hacer un manejador de
errores para personalizar los errores ocasionados en el transcurso de nuestros scripts:

Imagen 4

[email protected]
http://underc0de.org
Para contar un directorio; es decir, para contar los archivos que tenemos dentro de éste existe la
función scandir() la cual recibe dos parámetros:

 Directorio a escanear.
 Orden en el cual se escaneara:
o 0: Orden en ascenso.
o 1: Orden en descenso.

Tomando de ejemplo (el directorio se llama testing):

Imagen 5

<?php
$dirasc = scandir('testing/');
$dirdes = scandir('testing/', 1);
echo '<pre>';
print_r($dirasc);
print_r($dirdes);
echo '</pre>';
#print_r nos muestra información de modo legible sobre alguna variable
#<pre> y </pre> son etiquetas HTML que formatean el texto a ‘maquina de escribir’
?>

Imagen 6

Si notamos el primer array es ascendente y el segundo descendente. También podemos notar que
viene . y .. los cuales (como mencione anteriormente) permitirán retroceder o estar en el mismo
directorio.

[email protected]
http://underc0de.org
Es muy importante saber que si la carpeta en cuestión que queremos borrar tiene algún archivo
dentro nos dará el siguiente error (quite el @ del inicio para mostrar el error):
Warning: rmdir(testing/) [function.rmdir]: Directory not empty in C:\AppServ\www\Taller\Unidad
II\rmdir.php on line 2
Carpeta testing no fue borrada

Para ‘forzar´ la eliminación de la carpeta haremos uso de la función anteriormente vista (scandir())
la cual nos permitirá saber la cantidad de archivos de un directorio para posteriormente proceder a
eliminar uno por uno mediante un bucle (for):

<?php
$dir = scandir('testing/');
$numfiles = count($dir);
for($i = 0; $i<$numfiles; $i++)
{
if(@unlink('testing/'.$dir[$i]))
{
echo 'El archivo '.$dir[$i].' fue borrado correctamente.<br/>';
}
}
rmdir('testing/');
#unlink es una función para eliminar un archivo.
?>

Imagen 7

¿Qué hacemos?, primero eliminamos los archivos dentro de la carpeta (en este caso son los de la
imagen 5). Utilice la condicional if para así solo eliminar los verdaderos archivos (recordemos que
nos muestra también . y .. como en la imagen 6), después procedí a mostrar que archivo elimine
para finalizar eliminando el directorio.

En algunos casos ocuparas de alguna clase o función ya que si intentamos eliminar un directorio que
contenga otro dentro nos dará error (funciones y clases las veremos más adelante), entonces
utilizando éstas podemos hacer un bucle el cual nos permitirá forzar la eliminación de un directorio
completo sin importar cuantos directorios o archivos se encuentren dentro de éste.

Recomendación: Practicar con los directorios.

[email protected]
http://underc0de.org
Archivos

Los archivos son algo de lo más buscado en lo que respecta a PHP. Estos nos permiten no solo abrir
archivos si no crearlos o manipularnos a nuestro antojo. Cabe mencionar que no solo podemos crear
o manipular archivos de texto (txt), si no también archivos php, html, entre otros.

Algo que tenemos que tener muy en cuenta a la hora de crear un archivo por PHP son los permisos
de éste:

 r: Solo lectura, ubicara el puntero al inicio del archivo.


 r+: Solo lectura y escritura, ubicara el puntero al inicio del archivo.
 w: Solo escritura, si no existe el archivo lo crea y si existe lo reemplaza, ubicara el puntero
al inicio del archivo.
 w+: Solo lectura y escritura, si no existe el archivo lo crea y si existe lo reemplaza, ubicara
el puntero al inicio del archivo.
 a: Solo escritura, ubicara el puntero al final del archivo y si no existe lo crea.
 a+: Solo lectura y escritura, ubicara el puntero al final del archivo y si no existe lo crea.
 x: Solo escritura, si el archivo existe devolverá FALSE, si no existe lo crea.
 x+: Solo lectura y escritura, si el archivo existe devolverá FALSE, si no existe lo crea.

Para llevar acabo esto utilizaremos las siguientes tres (3) funciones:

 fopen(x, y): En donde X es el archivo a crear y Y son los permisos del archivo.
 fwrite(x, y): En donde X es el manejador del archivo y Y es el contenido del archivo.
 fclose(x): En donde X es el manejador del archivo.

<?php
$file = fopen('testing.txt', 'w+');
fwrite($file, 'Texto despúes');
fclose($file);
?>

Imagen 8

En este caso hicimos referencia a w+, en este caso el archivo ya existía por lo que al momento de
correr el script lo elimino y le implemento el nuevo contenido (Texto después). La función fwrite()
puede reemplazarse por fputs() la cual es más rápida. Si quieres salto de línea en archivos de texto
debes utilizar \n, en cambio, en archivos como php o html debes utilizar <br> o <br/>.

Recomendación: Practicar como crear un archivo con diferentes permisos.

[email protected]
http://underc0de.org
Renombrar un archivo o directorio

Es muy común que en determinadas situaciones estemos en casos en donde ocupemos renombrar
tanto un archivo como un directorio. Para ello existe la función rename() la cual recibe dos
parámetros:

 Nombre de archivo original


 Nombre nuevo archivo
<?php
rename('testing.txt', 'testing_renamed.txt');
?>

Imagen 9

Inclusive en el nuevo nombre de archivo podemos cambiarle la extensión.


<?php
rename('testing.txt', 'testing_renamed.html');
?>

Imagen 10

Es muy importante que el archive a renombrar exista ya que de caso contrario mostrara un error,
para comprobar que exista utilizaremos la función antes explicada (file_exists()):

<?php
if(file_exists('testing.txt'))
{
@rename('testing.txt', 'testing_renamed.html');
echo 'Archivo testing.txt renombrado a testing_renamed.html <br/>';
}else{
echo 'Archivo testing.txt inexistente <br/>';
}
?>

En este caso imprimirá ‘Archivo testing.txt inexistente <br/>’ ya que si recordamos el archivo
testing.txt fue renombrado a testing_renamed.html en el ejemplo anterior (imagen 10).

Recomendación: Practicar renombrando un archivo y cambiarle su extensión.

[email protected]
http://underc0de.org
Incluir archivos

Prácticamente nuestros scripts están basados en incluir y/o requerir archivos. ¿Por qué?, ya que de
esta manera nuestros proyectos están mas organizados y a la hora de editar éstos serán mucho mas
legibles y estéticos. Para ello podemos utilizar include() o bien; require(). La diferencia de estas
dos funciones es mínima:

 include(): Si no encuentra el archivo genera una advertencia sin detener la ejecución del
script.
 include_once(): Se ejecuta solo una vez, genera el mismo error que include() en caso de
no encontrar el archivo.
 require(): Si no encuentra el archivo genera un error fatal deteniendo la ejecución del
archivo.
 require_once(): Se ejecuta solo una vez, genera el mismo error que require() en caso de
no encontrar el archivo.

¿Para qué nos sirve esto?, a veces por cuestiones X nos vemos en la necesidad de separar varios
scripts PHP para entenderle mejor a éstos.

config.php

<?php
$variable = 'Mi Variable';
?>

principal.php

<?php
require_once('config.php');
echo $variable; #Mi Variable
?>

Imagen 11

También podemos obtener el contenido de un archivo o de una página mediante la función


file_get_contents() :

<?php
echo file_get_contents('http://www.c-intrud3rs.com/comunidad/index.php');
?>

De esta manera en vez de indicar un sitio web podríamos indicar un archivo y actuaria de la misma
forma.

Recomendación: Practicar incluyendo algún archivo o pagina web.

[email protected]
http://underc0de.org
Ejercicios
Los ejercicios que a continuación se dejaran para practicar deberán ser enviados por un mensaje
personal (a mi [Xt3mP]) mediante el foro http://underc0de.org/foro/. Recuerda que la base del
conocimiento es poner en práctica lo aprendido.

I. Hacer un script con un formulario que te pida tres nombres, después los
almacene en un array y los imprima en pantalla en orden descendente.
II. Hacer un script que suba un archivo, lo copie y posteriormente renombre el
archivo original a ‘archivonuevo.ext’ en donde ext es la extensión original del
archivo.
III. Hacer un script que cree un directorio en donde adentro se generen 3 archivos
de texto (uno, dos y tres) para posteriormente forzar la eliminación del mismo
directorio.
IV. Hacer dos scripts, uno que tenga nombre, país y ciudad en un array y el otro en
donde requiera el primero para posteriormente imprimirlo en pantalla en orden
descendente.
V. Hacer un script que utilice todos los temas empleados en esta unidad.

Recomendaciones:

 Utiliza nombre de variables que te permitan identificar fácilmente, es decir, si


manipularas algún valor que tenga que ver con un nombre, nómbrala $nombre.
 Comenta las partes importantes del script con pequeños comentarios, es decir, si se
trata de alguna condicional para manipular un nombre puedes emplear algo como
‘Manipulando nombre’.
 Trata de usar tabulación, es decir, tabula lo que este dentro de condicionales o bucles
para una mayor limpieza del código y que éste sea más legible.

[email protected]
http://underc0de.org

También podría gustarte