Taller de PHP Unidad 2
Taller de PHP Unidad 2
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.
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
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.
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.
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.
[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.
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
?>
[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]
?>
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():
<?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():
<?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():
<?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
?>
[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.
<?php
$miarray = array('Xt3mP','México', '[email protected]');
echo count($miarray); #3
?>
<?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()
<?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]
?>
[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()
<?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 ()
<?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()
<?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 ()
<?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)
?>
[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
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.
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.
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)):
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
[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:
<?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
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/’.
[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
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.
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.
[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:
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/>.
[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:
Imagen 9
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).
[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
<?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.
[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:
[email protected]
http://underc0de.org