> Manuales > Taller de PHP

El script PHP que utilizamos para realizar el sorteo de 3 sesiones de #DWResponsive o la mano inocente de los números aleatorios.

En este artículo voy simplemente a publicar un script que hemos utilizado para sortear unas plazas para unas sesiones que vamos a ofrecer de manera gratuita sobre la temática del Responsive Web Design. Para el caso es un poco indiferente qué es lo que teníamos que sortear, el caso es que realicé un script PHP para obtener aleatoriamente los participantes a los que asignar las 100 plazas que estábamos sorteando. Como muestra de transparencia del sorteo y para los interesados en ver cómo realizarlo en PHP, vamos a publicar el script.

Básicamente lo que necesitamos es realizar una selección de registros de una tabla MySQL de manera aleatoria. Serán 100 plazas, luego necesitaremos obtener 100 elementos aleatorios, en este caso personas participantes del sorteo. Realmente es tan básico como obtener un número aleatorio y repetirlo por 100 veces, de modo que tengamos 100 elementos aleatorios. No obstante, hay algunas cosas que tendremos que comprobar, como que los números aleatorios escogidos no estén repetidos, pues a una misma persona no le puede tocar dos veces. Los datos de los afortunados ganadores del sorteo los vamos a almacenar en Arrays y veremos en este ejemplo varios usos de funciones de Array que nos vendrán como anillo al dedo para facilitar nuestra tarea. Además, como resultado quiero obtener dos informaciones:

Tabla de la base de datos MySQL

Antes de comenzar con el script, vamos a echar un vistazo a la tabla donde tenemos la información de los usuarios participantes. Es una tabla bien simple, con únicamente tres campos, un identificador autonumérico, un email y el usuario Twitter del participante.

Esta tabla la generaríamos con este create table.

CREATE TABLE IF NOT EXISTS `participante` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`email` varchar(200) NOT NULL,
`twitter` varchar(200) NOT NULL,
PRIMARY KEY (`id`)
)

Luego, podríamos poblar de participantes de prueba con unos insert como estos.

INSERT INTO participante (email, twitter) VALUES('hola@quetal.es', '@holaquetal');
INSERT INTO participante (email, twitter) VALUES('por@supuesto.ec', '@porsupuestisim0');
INSERT INTO participante (email, twitter) VALUES('yeahhhhhh@gmail.com', '@yeahhhhhhhhh');

Nosotros vamos a sortear 100 plazas, por lo que necesitaríamos muchos más insert. No puedo poner los participantes reales ni proporcionarte todos sus insert por razones obvias de privacidad. En un momento dado, puedes crear solo unos pocos participantes más y modificar el script para que sortee por ejemplo 5 premios en vez de 100.

El script PHP

Nuestro script se tendrá que conectar a la base de datos MySQL y extraer en principio el número de participantes totales que tenemos. Luego generaremos 100 números aleatorios entre 1 y el número de participantes totales. Así tendremos los ID de los registros que han ganado el sorteo. A partir de estos ID, podemos generar una consulta que nos traiga los datos de todos los ganadores. Es así de simple. Logicamente habrá otras maneras de realizar un algoritmo para el sorteo, pero esta es perfectamente válida para nuestro caso.

Veamos el script PHP que realiza todas esas acciones. El código está comentado para que se puedan entender los pasos realizados.

Nota: Gracias a los comentarios de los lectores siempre tenemos colaboraciones que nos ayudan a mejorar lo presente. En este caso, @Urko nos sugiere dejarle a MySQL la responsabilidad de seleccionar los registros aleatorios en la consulta SELECT. Esto se conseguiría con la función RAND() de MySQL con una consulta como esta:

SELECT * FROM participante ORDER BY RAND( ) LIMIT 0 , 100

//Conexion con la base
$conn = mysql_connect("localhost","root","salvame");

//selección de la base de datos con la que vamos a trabajar
mysql_select_db("concurso-rwd", $conn);

//Selecciono el número de participantes con count
$ssql = "select count(*) as num from participante where 1";
if(!$rs = mysql_query($ssql, $conn)){
   //si la sentencia dio error de sql, lo muestro
   echo mysql_error();
   exit;
}

//extraigo el número de participantes
$num_participantes = mysql_fetch_object($rs)->num;

//alimento con la semilla la generación de aleatorios
srand (time());

//creo un array donde voy a colocar los ID de los participantes que han sido premiados.
$array_id_ganadores = array();

//mientras el número de ganadores sea menor que 100 (100 premios que se otorgan)
while(count($array_id_ganadores) < 100){
   //generamos un número aleatorio
   $numero_aleatorio = rand(1,$num_participantes);
   //compruebo si ya estaba ese ID ganador en el array
   if(!in_array($numero_aleatorio, $array_id_ganadores)){
      //si el participante no estaba en el array, entonces lo meto dentro de los ganadores.
      array_push($array_id_ganadores, $numero_aleatorio);
   }
}

//ahora tengo los 100 diferentes ganadores en un array
//voy a seleccionar los datos de los participantes cuyos ID se seleccionaron como ganadores
$ssql = "select * from participante where id in (" . implode(",", $array_id_ganadores) . ")";

//ejecutamos la sentencia
$rs = mysql_query($ssql, $conn);

Después de esta línea tendremos un recordset con los datos de todos los participantes que han salido ganadores. Podremos hacer un recorrido al $rs para procesar esos ganadores y hacer con ellos lo que necesitemos.

Nota: Este script nos sirve perfectamente, porque todos los participantes tienen IDs consecutivos, es decir, no falta ningún ID entre medias y por tanto el ID del último participante es igual al número de participantes totales. Si en la tabla de participantes hubiese huecos de IDs que no existieran, habría de tomarse la molestia de hacer una de estas dos posibilidades:

1) En la tabla MySQL eliminar el campo "id" y luego volverlo a crear autonumérico, de modo que esos ID se vuelvan a asignar y estén consecutivos. Pero atención a esta chapucilla, que no siempre será aconsejable. Si tenemos esa tabla de participantes relacionada por el id con otra tabla de la base de datos, cargarnos el campo identificador y volverlo a generar rompería la consistencia de la base de datos.

2) La otra opción que siempre funcionaría sería modificar el script PHP en un par de sitios. Para empezar, habría que buscar el ID de participante máximo, en vez de contar el número de participantes que hay en la tabla. Además, tendríamos que buscar en la tabla MySQL si el ID aleatorio existe, antes de meterlo en el array de IDs ganadores.

Generar una salida útil para obtener los mails y Twitters de los ganadores por separado

La otra parte del script PHP que hemos utilizado para implementar este concurso es procesar el conjunto de registros ganadores obtenido para obtener una salida que contuviera dos informaciones útiles para nosotros.

Estas dos informaciones las extraemos por medio del siguiente código PHP.

//genero un array para los emails de los ganadores
$emails_ganadores = array();
//genero un array para los Twitters de los ganadores
$twitters_ganadores = array();

//para cada ganador seleccionado en la consulta
while($fila = mysql_fetch_object($rs)){
   //meto los emails de los ganadores y los twitter en los correspondientes arrays
   array_push($emails_ganadores, $fila->email);
   array_push($twitters_ganadores, $fila->twitter);
}

//voy a escribir los emails de los ganadores, con un salto de línea entre cada uno
echo implode("n", $emails_ganadores);
echo "n";

//ordeno los twitters de los ganadores para que puedan buscarse en la lista alfabéticamente.
natcasesort($twitters_ganadores);

//hago un bucle para mostrar todos los twitter de los ganadores
//con un enlace hacia su cuenta de Twitter, y separados por comas.
foreach($twitters_ganadores as $valor){
   echo '<a href="https://twitter.com/' . substr($valor, 1) . '">' . $valor . '</a>, ';
}

El resultado que obtendremos se imprime en la página directamente, luego veré el código fuente para extraerlo en el formato que deseo. Los emails un por línea y el código HTML de todos los Twitter convertidos en enlaces a sus cuentas de Twitter.

Eso es todo! Espero que este código sirva de ayuda a aquel que quiera implementar un sorteo simple por medio de un script PHP y por supuesto, para que las personas vean que el sorteo realizado por nosotros en DesarrolloWeb.com ha tenido una mano inocente, en un proceso digital completamente transparente.

Miguel Angel Alvarez

Fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Com...

Manual