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:
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.
Veamos el script PHP que realiza todas esas acciones. El código está comentado para que se puedan entender los pasos realizados.
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.
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.
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.