martes, 2 de junio de 2015

Modificaciones en Arrays - PHP

var= range(inf,sup)

Crea una nueva matriz (var) escalar en la que los valores de los elementos
serán los números enteros (ordenados) pertenecientes al intervalo comprendido
entre los valores inf y sup, incluidos estos.

Los valores inf y sup deben ser números enteros.

shuffle(array)

Intercambia de modo aleatorio los valores de un array y los reindexa.

Igual que ocurría en caso de los números aleatorios, la función shuffle deberá ir precedida de una semilla del tipo srand.

En el ejemplo hemos usado como semilla la función: srand(time()).

var=
array_flip(
array)

Devuelve un array (var) que contiene como valores los índices de la matriz array y como índices los valores de aquella.

Como quiera que los valores pueden estar repetidos
y no es posible que lo estén los índices, esta función, en caso de valores repetidos, toma cada uno de esos valores una sola vez, lo utiliza como índice del nuevo array y asigna como valor del nuevo elemento el mayor de los índices –del array original– de los elementos que contuvieran ese valor.

Insertando elementos en un arrays
array_unshift(arr,
v1,v2,..
)

Inserta al
principio de la matriz
arr los valores v1, v2, etcétera que pueden ser tantos como se deseen y deben estar separados por
comas.

array_push(array,
v1,v2,..
)

Inserta al
final de la matriz
array los valores v1, v2, etcétera, que igual que en el caso anterior, pueden ser tantos como se deseen y deben estar separados por comas.
Tanto array_unshift como array_push asignan a los nuevos elementos índices numéricos.

array_pad(array, n,
var
)

Inserta nuevos
elementos en array y les asigna el valor contenido en var.
Insertará tantos nuevos elementos como sea necesario para que el array alcance una longitud de n elementos.
Si el valor de n es positivo inserta los elementos al final del array, si fuera negativo los insertaría al comienzo del mismo.

A los nuevos elementos del array se les asignan índices numéricos.

array_merge($a, $b)

Crea un nuevo array escalar en el que se incluyen todos los elementos contenidos en los arrays $a y $b.

Quitar elementos de un array
array_shift($a)

La función array_shift extrae el primer elemento del array
$a.

array_pop($a)

La función array_pop extrae el último elemento del array
$a.

array_slice($a,n)

La función array_slice extrae n elementos del array
$a.

Si el valor de n es positivo extraerá todos los elementos a partir del que ocupa la posición n contando
desde primero hasta el último según el orden de creación de los
elementos.

Si el valor de n es negativo extraerá todos los
elementos a partir del enésimo, esta vez, contando desde el último hasta el primero.

array_slice($a,n, m)

La función array_slice con dos parámetros permite extraer una parte de los valores de una matriz siguiendo estos criterios:

Si n y m son positivos, extraerá m elementos a partir del que ocupa la posición enésima de primero a último.

Cuando n es negativo y m es positivo se extraerán m elementos contados a partir del enésimo, esta vez recorriendo el array de último a primero.

En el caso en que n tenga valor positivo y m sea negativo extraerá los comprendidos entre el enésimo
contado de primero a último y el emési- mo contado desde el
último hasta el primero.

Si n es negativo y m es también negativo extraerá los caracteres comprendidos entre el enésimo contado de último a primero y el emésimo contado en el mismo sentido.

En este caso se requiere que el valor absoluto de n sea mayor que el de m.

En caso de no cumplirse esta condición devolverá un array vacío.

Invertir el orden de un array
array_reverse(array)

Devuelve un nuevo array cuyos elementos están en orden inverso al del array original.

De esta forma el elemento que ocupaba la última posición pasa a ocupar la primera y así sucesivamente.

¡Cuidado!

Recuerda que las posiciones iniciales de los elementos de un array no tienen relación con sus índices sino con la secuencia en la que fueron creados.

Y otra cosa, mucho cuidado con la aplicación de todas estas funciones y con los índices de los arrays resultantes.




Modificación de arrays
<?
$a=array(1,2,3,1,1,2,3,3,4,4,4,0,1);
$b=array("blanco","azul","blanco","blanco","azul","Blanco","Azul");
$c=array(
"b" =>"verde",
"c" =>"rojo",
"e"
=>"verde",
"f" =>"Rojo",
"g"
=>"Verde",
"a"=>"rojo",
"d" =>"rojo")
;
$C=array(
"b" =>"verde",
"c" =>"rojo",
"e"
=>"verde",
"f" =>"Rojo",
"g"
=>"Verde",
"a"=>"rojo",
"d" =>"rojo")
;

echo
"<h3>Crea una matriz de números enteros</h3>";

$r=range(7,11);

foreach($r as
$clave=>$valor){
echo "Clave: ",$clave," Valor:
",$valor,"<br>";
}

echo "<h3>Intercambia
aleatoriamente elementos en una matriz</h3>";

srand (time());
shuffle
($r)
;


foreach($r as $clave=>$valor){
echo "Clave:
",$clave," Valor: ",$valor,"<br>";
}

echo
"<h3>Intercambia valores e indices</h3>";

$p=array_flip($a);

foreach($p as
$clave=>$valor){
echo "Clave: ",$clave," Valor:
",$valor,"<br>";
}
echo "<br>";

$q=array_flip($c);

foreach($q as
$clave=>$valor){
echo "Clave: ",$clave," Valor:
",$valor,"<br>";
}

echo "<h3>Inserta elementos al
principio de una matriz</h3>" ;

array_unshift($a,97,"Pepe",128);

foreach($a as
$clave=>$valor){
echo "Clave: ",$clave," Valor:
",$valor,"<br>";
}
echo "<br>";

array_unshift($c,97,"Pepe",128);

foreach($c as
$clave=>$valor){
echo "Clave: ",$clave," Valor:
",$valor,"<br>";
}

echo "<h3>Inserta elementos al
final de una matriz</h3>";

array_push($a,3.4,"Luis",69);

foreach($a as
$clave=>$valor){
echo "Clave: ",$clave," Valor:
",$valor,"<br>";
}
echo "<br>";

array_push($c,3.4,"Luis",69);

foreach($c as
$clave=>$valor){
echo "Clave: ",$clave," Valor:
",$valor,"<br>";
}

echo "<h3>Inserta elementos
iguales
al principio o al final de una matriz</h3>";

$wz1=array_pad($a,25,"relleno");

foreach($wz1 as
$clave=>$valor){
echo "Clave: ",$clave," Valor:
",$valor,"<br>";
}

echo "<br>";

$wz2=array_pad($c,-17,"relleno");

foreach($wz2 as
$clave=>$valor){
echo "Clave: ",$clave," Valor:
",$valor,"<br>";
}

echo "<h3>Fusiona dos
matrices</h3>";

$wz3=array_merge($a,$b);

foreach($wz3 as
$clave=>$valor){
echo "Clave: ",$clave," Valor:
",$valor,"<br>";
}
echo "<h3>Extrae el primer elemento
de una matriz</h3>";

array_shift
($a)
;

foreach($a as $clave=>$valor){
echo "Clave:
",$clave," Valor: ",$valor,"<br>";
}
echo
"<br>";

array_shift
($c)
;

foreach($c as $clave=>$valor){
echo "Clave:
",$clave," Valor: ",$valor,"<br>";
}
echo "<h3>Extrae el
ultimo elemento de una matriz</h3>";

array_pop($a);

foreach($a as
$clave=>$valor){
echo "Clave: ",$clave," Valor:
",$valor,"<br>";
}
echo "<br>";

array_pop ($c);

foreach($c as
$clave=>$valor){
echo "Clave: ",$clave," Valor:
",$valor,"<br>";
}
echo "<h3>Extrae elementos de una
matriz</h3>";

$zz1=array_slice($a,3);

foreach($zz1 as
$clave=>$valor){
echo "Clave: ",$clave," Valor:
",$valor,"<br>";
}
echo "<br>";

$zz2=array_slice($a,-3);

foreach($zz2 as
$clave=>$valor){
echo "Clave: ",$clave," Valor:
",$valor,"<br>";
}

echo "<br>";

$zz3=array_slice($b,3,4);

foreach($zz3 as
$clave=>$valor){
echo "Clave: ",$clave," Valor:
",$valor,"<br>";
}

echo "<br>";

$zz4=array_slice($b,3,-2);

foreach($zz4 as
$clave=>$valor){
echo "Clave: ",$clave," Valor:
",$valor,"<br>";
}

echo "<br>";

$zz5=array_slice($b,-5,-2);

foreach($zz5 as
$clave=>$valor){
echo "Clave: ",$clave," Valor:
",$valor,"<br>";
}

echo "<h3>Invierte los elementos
de la matriz</h3>";

$inv=array_reverse($C);

foreach($inv as
$clave=>$valor){
echo "Clave: ",$clave," Valor:
",$valor,"<br>";
}
?>


Exportar Mysql a CSV (Archivo de Excel)

function creaCSV()


{
$bd_base = "bdd";
$con = mysql_connect("localhost", "root", "contrasena");
mysql_select_db($bd_base, $con);

$consulta = "SELECT * FROM tblDatos";
$datosLinia=mysql_query($consulta,$con);


$nomFitchero = "c:\fichero.csv";

while($row =
mysql_fetch_array($datosLinia))
{

$linia = $row[1];
$linia .= ";".$row[2];
$linia .= ";".$row[3];
$linia .= ";".$row[4];
$linia .= ";".$row[5];
$linia .= ";".$row[6]."rn";

$p = fopen($nomFitchero,a);

if($p)fputs($p,$linia);
}
fclose($p);
// Ojo ! fitchero separado por ';'
// Si no te funciona prueba con ',' debido a las versiones de Excel.
}

lunes, 4 de mayo de 2015

Sistemas de Usuarios en PHP y MYSQL

1.- Creando la tabla en MySQL

Bien, necesitamos una tabla con los datos de nuestros usuarios, así que la vamos a crear. Ésta tabla contiene los siguientes campos:


Código

FIELD     | Type        | KEY | Extra        
----------+-------------+-----+----------------
 id        | tinyint(4)  | PRI | AUTO_INCREMENT 
 nombre    | text        |     |                
 apellidos | text        |     |                
 login     | varchar(40) |     |                
 password  | varchar(20) |     |                
 email     | text        |     |                 
 

Bien, pues la sentencia SQL que utilizaremos será algo así:


Código
CREATE TABLE usuarios (
id TINYINT(4) AUTO_INCREMENT,
nombre TEXT,
apellidos TEXT,
login VARCHAR(40),
password VARCHAR(20),
email TEXT,
UNIQUE (id) )

2.-Creando un script para introducir usuarios
Necesitamos el formulario, con los campos siguientes:

Código
<form action="crea_user.php" method="POST">
Login: <input type="text" name="login"><br>
Password: <input type="password" name="pass1"><br>
Repite Password: <input type="password" name="pass2"><br>
Nombre: <input type="text" name="nombre"><br>
Apellidos: <input type="text" name="apellidos"><br>
E-mail: <input type="text" name="email"><br>
<input type="submit" name="Crear">
</form>

Y también el script crea_user.php, que sería algo así:
crea_user.php


Código
<?
$server="localhost"; /* Nuestro server mysql */
$database="bd"; /* Nuestra base de datos */
$dbpass="password"; /*Nuestro password mysql */
$dbuser="user"; /* Nuestro user mysql */
/* Primero comprovamos que no existe un usuario con el mismo login ya registrado */
 
$query="SELECT * FROM usuarios WHERE login='$login'";
$link=mysql_connect($server,$dbuser,$dbpass);
$result=mysql_db_query($database,$query,$link);
if(mysql_num_rows($result)){
echo "El usuario ya existe en la BD";
} else {
mysql_free_result($result);
/* Ahora comprovamos que los dos pass coinciden */
if($pass1!=$pass2) {
echo "Los passwords deben coincidir<br>";
echo 'Clica <a href="form.php">aquí</a> para volver al formulario';
} else {
$pass1=crypt($pass2, "semilla"); 
 
/* Encripatmos el password, con la clave "semilla" que debeis sustituirpor la que mas os guste. Hay otros metodos de encriptacion, mirad en php.net si quereis conocerlos. */
 
$query="INSERT INTO usuarios (login, nombre, apellidos, password, email) VALUES ('$login','$nombre','$apellidos','$pass1','$email')";
 
$result=mysql_db_query($database,$query,$link);
if(mysql_affected_rows($link)){
echo "Usuario introducido correctamente";
} else {
echo "Error introduciendo el usuario";
} /* Cierre del else */
} /* Cierre del else que corresponde a if(mysql_affected_rows.....) */
} /* Cierre del else que corresponde a if(mysql_num_rows...) */
?>

Pues como veis, este script es muy simple. Si no lo entendeis, es porque no conoceis PHP o su método de acceso a bases de datos mysql. Leeros el prólogo antes de continuar ;-) Aquí deberíamos comprobar que quien está creando los usuarios está identificado (en caso de que el registro no sea público).

3.- Creando la página y scripts de login
Ésta parte consiste en dos páginas, la de login, y el script que comprueba los datos. Aquí va la página de login:

login.php

Código
<?
session_start();
if(isset($SESSION)){
header("location: user.php"); /* Si ha iniciado la sesion, vamos a user.php */
} else { 
/* Cerramos la parte de codigo PHP porque vamos a escribir bastante HTML y nos será mas cómodo así que metiendo echo's */
?>
<html><head><title>Necesita identificación! </title></head>
<body>
<center><h1>Identificate! :D </h1></center>
<form action="comprueba.php" method="POST">
Login: <input type="text" name="login"><br>
Password: <input type="password" name="pass"><br>
<input type="submit" value="Entrar">
</form>
</body></html>
<?
} /* Y cerramos el else */ 
?>
 

Y el que sigue es el script de comprobación, que comprobará los datos y si son correctos nos manda a user.php tras iniciar la sesión. Si no, nos dará un mensajito avisandonos de que no hemos dado el login correcto. Primero os explicaré las funciones que usaremos.

session_start() se debe usar al principio de cada script en el que vayamos a hacer uso de variables de sesión.

session_register("nombre_variable") se usará para crear una variable de sesión, que luego podremos usar con
el nombre $nombre_variable. Lo que haremos aquí será primero inicializar las variables como un array, y luego registrarlas en la sesión.

Ahora el código:

comprueba.php

Código
<?
session_start();
$server="localhost"; /* Nuestro server mysql */
$database="bd"; /* Nuestra base de datos */
$dbpass="password"; /*Nuestro password mysql */
$dbuser="user"; /* Nuestro user mysql */
$query="SELECT * FROM usuarios WHERE login='$login'";
$link=mysql_connect($server,$dbuser,$dbpass);
$result=mysql_db_query($database,$query,$link);
if(mysql_num_rows($result)==0){
echo "No existe el login introducido";
} else {
$array=mysql_fetch_array($result);
if($array["password"]==crypt($pass,"semilla") ){
/* Comprobamos que el password encriptado en la BD coincide con el password que nos han dado al encriptarlo. Recuerda usar la misma semilla para encriptar los dos passwords. */
$SESSION["login"]=$login;
$SESSION["nombre"]=$array["nombre"];
$SESSION["apellidos"]=$array["apellidos"];
session_register("SESSION");
header("location: user.php");
 
} else {
echo "Password incorrecto!";
} /* Cerramos este ultimo else */
} /* Cerramos el else que corresponde a la comprobación de que el login existe */
 
?>

4.- Creación de la página de los usuarios
Bien, ésta página la voy a dejar bastante vacía, solo va a comprobar si el usuario ya se ha identificado. Si es así, le daremos la bienvenida simplemente, y pondremos el botón para logout. Si no, le mandaremos a login.php. Ahí va el código:
user.php

Código
<?
session_start();
if(!isset($SESSION)){
header("location: login.php");
} else {
echo "<html><body>";
echo "Bienvenido ";
echo $SESSION["nombre"];
echo $SESSION["apellidos"]." ";
echo "<br>Has entrado con el nombre de usuario ";
echo $SESSION["login"];
echo "<br>Para cerrar la sesión, pulsa: <a href='logout.php'>logout</a>";
echo "</body></html>";
}
?>
 

5.- Cerrando la sesión
En el script logout.php simplemente cerraremos la sesión y mostraremos un mensaje indicando que ha
sido cerrada correctamente. Antes de ésto, comprovaremos que ha sido iniciada la sesión. Si no lo ha sido, mandaremos al usuario a login.php. Aquí usaremos dos funciones nuevas:

session_unset() destruye todas las variables de sesión que hemos creado. Debemos llamarla antes de llamar a
session_destroy.
session_destroy() destruye la sesión en sí, pero no destruye las variables.

Ahora sí, aquí os dejo el código:

Código
<?
session_start();
if(!isset($SESSION)){
header("location: login.php");
} else {
session_unset();
session_destroy();
echo "Las variables de sesión han sido eliminadas, y la sesión se ha dado por finalizada correctamente ;-)";
}
?>

Simple verdad? Pues ya tenemos nuestro sistema de usuarios completo!

ALERTA!: En éstos scripts hay algunas cosillas que tendremos que mejorar.
Por ejemplo, hay que mejorar el manejo de errores de la base de datos. Además, deberíamos incluir redirecciones hacia login.php tras mostrar los mensajes de logout, de error al identificarse (tanto de login incorrecto como de password incorrecto), que lo podríamos hacer con un refresh simple en HTML.

Además de todo ésto, tendríamos que crear un filtro para los datos introducidos en el login para evitar la inyección SQL en nuestras páginas. Para el password no sería necesario, puesto que hemos encriptado la entrada del usuario antes de pasarsela al MySQL, pero tampoco pasaría nada si, una vez implementado el filtro, se lo pasamos al password introducido por el usuario.

Upload (Subir) de archivos con php a la Web

Muchas veces necesitamos hacer uploads de archivos en nuestros proyectos para muchos es algo sencillo pero para los que recién empiezan les explicare como se realiza el proceso. Este upload lo haremos utilizando php.
upload-php.gif
El primer paso es crear un formulario en el cual se seleccione el archivo a subir, para ello utilizaremos el tag input del tipo file, además hay que tener en cuenta que hay que seleccionar el tipo de encoding para el formulario el cual es: multipart/form-data.
HTML:

  1. <form action="upload.php" method="post" enctype="multipart/form-data">


  2. <input name="archivo" type="file"
    size="35" />



  3. <input name="enviar" type="submit" value="Upload
    File"
    />



  4. <input name="action" type="hidden" value="upload" />   


  5. </form>

Luego en la página upload.php que es que se encarga de recibir los datos del formulario (Lo definimos en la propiedad action del formulario). El archivo seleccionado es subido temporalmente a una carpeta, entonces tenemos que copiar el archivo a la carpeta final, en caso contrario este archivo se eliminará automáticamente.
Para acceder a las propiedades del archivo php nos brinda el array $_FILES con las siguientes propiedades, en donde archivo es el nombre del campo con el cual se envió el archivo desde el formulario:
  • $_FILES['archivo']['size']: tamaño en bytes del archivo recibido
  • $_FILES['archivo']['type']: tipo mime del archivo, por ejemplo image/gif
  • $_FILES['archivo']['name']: nombre original del archivo
  • $_FILES['archivo']['tmp_name']: nombre del archivo temporal que se utiliza para almacenar en el servidor el archivo recibido
Algo que hago siempre es anteponer 6 caracteres aleatorios antes del nombre del archivo, esto para evitar duplicidad de nombres de los archivos.
PHP:

  1. $status = "";


  2. if ($_POST["action"] == "upload") {



  3.   // obtenemos los datos del archivo



  4.   $tamano = $_FILES["archivo"]['size'];



  5.   $tipo = $_FILES["archivo"]['type'];


  6.   $archivo = $_FILES["archivo"]['name'];



  7.   $prefijo = substr(md5(uniqid(rand())),0,6);





  8.   if ($archivo != "") {


  9.      // guardamos el archivo a la carpeta files



  10.       $destino = "files/".$prefijo."_".$archivo;



  11.       if (copy($_FILES['archivo']['tmp_name'],$destino)) {



  12.           $status= "Archivo subido: <b>".$archivo."</b>";


  13.         }else {



  14.           $status= "Error al subir el archivo";



  15.       }



  16.   } else {



  17.       $status = "Error al subir archivo";


  18.   }


  19. }
Todos los archivos se copiarán a la carpeta /files por que así lo definimos a la hora de copiar el archivo. Hay que tener en cuenta que la carpeta a donde se copiarán los archivos deben tener permisos de escritura en caso contrario se devolverá un error.
Ahora si tienes un hosting deberás cambiar los permisos, esto se hace comúnmente con un cliente de FTP que utilizas para subir tus archivos al hosting. Por ejemplo yo utilizo el FlashFXP como cliente de FTP y hay una opción llamada Atributes (CHMOD) para cambiar los permisos como se muestra en la siguiente imagen.
chmod-hosting.gif
En nuestro ejemplo no hemos utilizado las propiedades size y type, pero ustedes la pueden usar para restringir a un máximo de tamaño de archivo o restringir a cierto tipo de archivos por ejemplo solo permitir subir imágenes. Para finalizar, hemos agregado estilos a nuestra página creada y además hemos listado los archivos subidos a la carpeta files. Pueden ver el resultado final del ejemplo además de ellos les dejo los archivo fuente para que lo descarguen.

Manejo de Fechas en PHP