Foros del Web » Programando para Internet » PHP »

PHP OO Sistema de votaciones

Estas en el tema de Sistema de votaciones en el foro de PHP en Foros del Web. Buenas tardes a todos, No tengo ningún conocimiento de php pero si de programación, y estoy intentando iniciarme un poco con esto. El problema es ...
  #1 (permalink)  
Antiguo 11/06/2015, 12:04
 
Fecha de Ingreso: febrero-2014
Mensajes: 15
Antigüedad: 10 años, 2 meses
Puntos: 0
Exclamación Sistema de votaciones

Buenas tardes a todos,

No tengo ningún conocimiento de php pero si de programación, y estoy intentando iniciarme un poco con esto. El problema es que estoy intentando hacer una especie de sistema de votación de platos de restaurantes, mediante un bucle muestro todos los platos disponibles y al lado de cada uno de ellos agrego un combo con las diferentes calificaciones posibles y un botón que llama a una función que debe calcular la media de los votos y agregar un voto más al total. El problema reside en que en lugar de actualizarme este plato en concreto me está actualizando toda la lista y me está volviendo un poco loca. El código que tengo es el siguiente:

Código PHP:
<?php 

// Incluyo la conexion
include "conexion.php";

$sql "SELECT * FROM c_platos ";
if (!isset(
$_POST['search_box']) or ($_POST['search_box']=="todos")) {
     
$sql .= "ORDER BY puntuacion DESC";
}
elseif (isset(
$_POST['search_box'])) {
    
$search_term mysql_real_escape_string($_POST['search_box']);    
    
$sql .= "WHERE grupo = '{$search_term}'";
    
$sql .= "ORDER BY puntuacion DESC";
}

$query mysql_query($sql) or die(mysql_error());

// Consultar la base de datos
$consulta_mysql="SELECT DISTINCT grupo FROM c_platos";
$resultado_consulta_mysql=mysql_query($consulta_mysql) or die(mysql_error());
  
echo 
"<form method=\"POST\" action=\"lista.php\">" ;
echo 
"<select name='search_box' onchange=\"this.form.submit();\">";
echo 
"<option value=\"todos\"".(($_POST['search_box']=="todos") ? "selected='selected'":"").">Todos</option>";
while(
$fila=mysql_fetch_array($resultado_consulta_mysql)){
   echo 
"<option value='".$fila['grupo']."' ".(($_POST['search_box']==$fila['grupo']) ? "selected='selected'":"").">".$fila['grupo']."</option>";
}
echo 
"</select></form>";


 
     
     function 
hello($idPlato){
     
     
$consul1="SELECT * FROM c_platos WHERE id_plato= '{$idPlato}'";         
     
$cogeVotos=mysql_query($consul1) or die(mysql_error());
     
$puntu_plato=mysql_fetch_assoc($cogeVotos);
         
         
$votos=$puntu_plato['puntuacion']; //puntuación media hasta este momento
         
$numerVotos=$puntu_plato['num_votos']; //votos obtenidos hasta este momento
         
$numerVotos++; //se añade un voto más al numero de votos recibidos
         
$valorVoto=$_POST['voto']; //el voto q le da el usuario
         
echo $_POST['search_box'];

            if(
$_POST['voto']=="Excelente"){
                
$votos=($votos+100)/$numerVotos;
            }
            elseif(
$_POST['voto']=="Muy Bueno"){
                   
$votos=($votos+80)/$numerVotos;
            }
            elseif(
$_POST['voto']=="Bueno"){
                   
$votos=($votos+60)/$numerVotos;
            }
            elseif(
$_POST['voto']=="Regular"){
                   
$votos=($votos+40)/$numerVotos;
            }
            elseif(
$_POST['voto']=="Malo"){
                   
$votos=($votos+20)/$numerVotos;
            }
        
        
$consul3="UPDATE c_platos SET c_platos.num_votos='{$numerVotos}' WHERE c_platos.id_plato='{$idPlato}'";
        
$consul4="UPDATE c_platos SET c_platos.puntuacion='{$votos}' WHERE c_platos.id_plato='{$idPlato}'";
        
mysql_query($consul3) or die(mysql_error());
        
mysql_query($consul4) or die(mysql_error());
     
 }
 
?>


<table width="70%" cellpadding="5" cellspace="5">
    <tr>
        <td>ID</td>
        <td>Nombre</td>
        <td>Precio</td>
        <td>Puntuacion</td>
        <td>Grupo</td>
        <td>Num Votos </td>
        <td>Voto </td>
    </tr>

<?php while ($row mysql_fetch_array($query)) { 
        
?>
        <tr>
        <td id='id' value='<?php echo $row['id_plato']; ?>'><?php echo $row['id_plato']; ?></td>
        <td><?php echo $row['nombre']; ?></td>
        <td><?php echo $row['precio']; ?></td>
        <td><?php echo $row['puntuacion']; ?></td>
        <td><?php echo $row['grupo']; ?></td>
        <td><?php echo $row['num_votos']; ?></td>


        <td>
            <form method="POST" action="lista.php">
            <select id='<?php echo $row['id_plato'];?>' name='voto'>
                <option value="Excelente">Excelente</option>
                <option value="Muy Bueno">Muy Bueno</option>
                <option value="Bueno">Bueno</option>
                <option value="Regular">Regular</option>
                <option value="Malo">Malo</option>
                <input type="submit" name='<?php echo $row['id_plato']; ?>' value="Votar" onclick='<?php hello($row['id_plato']); ?>'/>
            </select>
        </td>
    </tr>    
    <?php ?>
Gracias de antemano por vuestra ayuda :)

Última edición por asf_il; 11/06/2015 a las 13:47
  #2 (permalink)  
Antiguo 11/06/2015, 13:47
Avatar de enlinea777  
Fecha de Ingreso: mayo-2008
Ubicación: frente al pc
Mensajes: 1.830
Antigüedad: 16 años
Puntos: 127
Respuesta: Sistema de votaciones

ve que pasa con esto.
Código PHP:
<?
include "conexion.php";

$sql "SELECT * FROM c_platos ";
if (!isset(
$_POST['search_box']) or ($_POST['search_box']=="todos")) {
     
$sql .= "ORDER BY puntuacion DESC";
}
elseif (isset(
$_POST['search_box'])) {
    
$search_term mysql_real_escape_string($_POST['search_box']);    
    
$sql .= "WHERE grupo = '{$search_term}'";
    
$sql .= "ORDER BY puntuacion DESC";
}

$query mysql_query($sql) or die(mysql_error());

// Consultar la base de datos
$consulta_mysql="SELECT DISTINCT grupo FROM c_platos";
$resultado_consulta_mysql=mysql_query($consulta_mysql) or die(mysql_error());
  
echo 
"<form method=\"POST\" action=\"lista.php\">" ;
echo 
"<select name='search_box' onchange=\"this.form.submit();\">";
echo 
"<option value=\"todos\"".(($_POST['search_box']=="todos") ? "selected='selected'":"").">Todos</option>";
while(
$fila=mysql_fetch_array($resultado_consulta_mysql)){
   echo 
"<option value='".$fila['grupo']."' ".(($_POST['search_box']==$fila['grupo']) ? "selected='selected'":"").">".$fila['grupo']."</option>";
}
echo 
"</select></form>";


 
     
     function 
hello($idPlato){
     
$id=$idPlato;
     
     
$consul1="SELECT * FROM c_platos WHERE id_plato= '{$id}'";     
        
     
$cogeVotos=mysql_query($consul1) or die(mysql_error());
     
$puntu_plato=mysql_fetch_assoc($cogeVotos);
     
     
         
$votos=$puntu_plato['puntuacion']; //puntuación media hasta este momento
         
$numerVotos=$puntu_plato['num_votos']; //votos obtenidos hasta este momento
         
$numerVotos++; //se añade un voto más al numero de votos recibidos
         
$valorVoto=$_POST['voto']; //el voto q le da el usuario
        
        

            
if($_POST['search_box']=="Excelente"){
            echo 
$votos;
                
$votos=($votos+100)/$numerVotos;
            }
            elseif(
$_POST['search_box']=="Muy Bueno"){
                   
$votos=($votos+80)/$numerVotos;
            }
            elseif(
$_POST['search_box']=="Bueno"){
                   
$votos=($votos+60)/$numerVotos;
            }
            elseif(
$_POST['search_box']=="Regular"){
                   
$votos=($votos+40)/$numerVotos;
            }
            elseif(
$_POST['search_box']=="Malo"){
                   
$votos=($votos+20)/$numerVotos;
            }
        
        
$consul3="UPDATE c_platos SET c_platos.num_votos='{$numerVotos}' WHERE c_platos.id_plato='{$idPlato}'";
        
$consul4="UPDATE c_platos SET c_platos.puntuacion='{$votos}' WHERE c_platos.id_plato='{$idPlato}'";
        
mysql_query($consul3) or die(mysql_error());
        
mysql_query($consul4) or die(mysql_error());
     
 }
 
?>
<script>
    function enviar(id){
        var formulario="form_"+id;
        document.formulario.submit();
        }
    </script>

<table width="70%" cellpadding="5" cellspace="5">
    <tr>
        <td>ID</td>
        <td>Nombre</td>
        <td>Precio</td>
        <td>Puntuacion</td>
        <td>Grupo</td>
        <td>Num Votos </td>
    </tr>
    <tr>
        <td>Voto </td>
    </tr>
<?php while ($row mysql_fetch_array($query)) { 
        
?>
        <tr>
        <td id='id' value='<?php echo $row['id_plato']; ?>'><?php echo $row['id_plato']; ?></td>
        <td><?php echo $row['nombre']; ?></td>
        <td><?php echo $row['precio']; ?></td>
        <td><?php echo $row['puntuacion']; ?></td>
        <td><?php echo $row['grupo']; ?></td>
        <td><?php echo $row['num_votos']; ?></td>


        <td>
            <form id="form_<?php echo $row['id_plato'];?>" name="form_<?php echo $row['id_plato'];?>" method="POST" action="lista.php">
            <select id='<?php echo $row['id_plato'];?>' name='voto'>
                <option value="Excelente">Excelente</option>
                <option value="Muy Bueno">Muy Bueno</option>
                <option value="Bueno">Bueno</option>
                <option value="Regular">Regular</option>
                <option value="Malo">Malo</option>
                </select>
                <input type="button" name="<?php echo $row['id_plato']; ?>" value="Votar" onClick="enviar('<?php $row['id_plato']); ?>')" />
        </td>
    </tr>    
    <?php ?>
  #3 (permalink)  
Antiguo 11/06/2015, 14:41
 
Fecha de Ingreso: febrero-2014
Mensajes: 15
Antigüedad: 10 años, 2 meses
Puntos: 0
Respuesta: Sistema de votaciones

Nada, no funciona

500 (Internal Server Error)

Voy a hacer una pregunta dentro de mi total ignorancia en la materia, pero en qué momento se estaría llamando a la función 'hello'?

Gracias por tu respuesta :)
  #4 (permalink)  
Antiguo 11/06/2015, 15:19
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 3 meses
Puntos: 206
Respuesta: Sistema de votaciones

No tienes demasiado claro el ciclo de ejecución.

PHP sólo se ejecuta en el servidor; jamás puedes ejecutar funciones PHP en eventos de javascript como estás haciendo, que van en el lado del cliente (navegador).

Tu formulario de votos tiene un action y un method, que su submit utilizará para enviar sus campos a la página php que le digas en el action. Esa página de PHP será la que lea los $_GET o $_POST enviados por el formulario, para realizar alguna acción, y luego dibujar HTML como respuesta, o hacer una redirección a otro PHP que se encargue de dibujar la respuesta, que suele ser lo mejor en tu caso para evitar que tus PHP sean horribles de mantener.

Hay tropecientos mil tutoriales con ejemplos de formularios y insercciones básicas con mysl (que por cierto, está obsoleto, en favor de mysqli o PDO).

Parte tu PHP en dos trozos: lista.php que se encargue de hacer el select de los platos, teniendo en cuenta el buscador, y que los dibuja en HTML con tu tabla y los formularios de votaciones para cada plato.

Y un supuesto "nuevo_voto.php", que meterás en el action de los ya nombrados formularios de lista.php que se encargará únicamente de hacer el update de los votos del plato. En esa página escribe un mensaje tipo "Voto sumado con éxito" y añade un enlace "volver" para regresar a lista.php.

Hay un montón de cosas a mejorar, pero éste es un comienzo básico.

Última edición por marlanga; 11/06/2015 a las 15:24
  #5 (permalink)  
Antiguo 11/06/2015, 15:26
 
Fecha de Ingreso: febrero-2014
Mensajes: 15
Antigüedad: 10 años, 2 meses
Puntos: 0
Respuesta: Sistema de votaciones

Ante todo muchas gracias por tu respuesta.

Lo que me comentas me aclara bastantes cosas y si que buscando por tutoriales había visto esa posible solución, mi problema es que lo que quiero es que simplemente me agregue el voto al darle al botón sin cambiar de página..

Me imagino que el código es un autentico desastre, jeje :$
  #6 (permalink)  
Antiguo 11/06/2015, 15:30
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 3 meses
Puntos: 206
Respuesta: Sistema de votaciones

El formulario debería tener ésta pinta:

<form method="POST" action="nuevo_voto.php">
<select name='voto'>
<option value="Excelente">Excelente</option>
<option value="Muy Bueno">Muy Bueno</option>
<option value="Bueno">Bueno</option>
<option value="Regular">Regular</option>
<option value="Malo">Malo</option>
</select>
<input type="hidden" name="id_plato" value="<?php echo $row['id_plato']; ?>" />
<input type="submit" value="votar" />
</form>

Y en tu nuevo_voto.php tendrás $_POST['id_plato'] y $_POST['voto'].

Si no quieres hacer redirección, necesitarás llamadas AJAX de javascript.
Si tienes ésta forma, es fácil hacer que javascript capture el evento submit del formulario, y hacer que lo reenvíe con ajax sin refrescar la página. jQuery por ejemplo hace aún más fácil ese trabajo.

Por cierto, al meter en el input hidden del formulario el id_plato, presenta un problema de seguridad. ¿Qué pasa si alguien me cambia a mano el value de ese campo, y me manda un ID que no debería? Para resolver ese problema, se suele crear otro hidden justo debajo del de id_plato, y se guarda en él el id_plato "codificado" usando alguna contraseña secreta que sólo el servidor sabe. Luego, en la página nuevo_voto.php, el servidor coge el id del plato, la codifica usando la misma contraseña, y compara esa cadena con la que le llega en ese campo hidden nuevo. Si son iguales, es que el ID no ha sido modificado a mano por el cliente y se puede realizar el voto. Si son distintos, entonces no haces nada porque te han manipulado los datos del formulario.

Última edición por marlanga; 11/06/2015 a las 15:36

Etiquetas: combo, votacion
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:26.