Ver Mensaje Individual
  #1 (permalink)  
Antiguo 06/04/2015, 22:56
Avatar de omar_gutierrez
omar_gutierrez
 
Fecha de Ingreso: febrero-2011
Mensajes: 144
Antigüedad: 13 años, 6 meses
Puntos: 2
Pregunta Validar elemento repetido XML con PHP

Hola gente, tengo como misión un apartado para unas encuestas, no se debe utilizar base de datos (mysql) por razones de seguridad.

Tengo lo siguiente:

res.php
Código PHP:
<?php

if(isset($_POST['select']) != ''){

    if(
file_exists($_SERVER['DOCUMENT_ROOT']."/encuestas/sondeo1.xml")){
        
        
$xml_verificar simplexml_load_file($_SERVER['DOCUMENT_ROOT']."/encuestas/sondeo1.xml");
        if(
$xml_verificar->xpath('/datos/voto[ip_address="'.$_SERVER['REMOTE_ADDR'].'"]')) { echo 'Usted ya ha votado.'; exit(); } else {
            
            
$sxe = new SimpleXMLElement($xml_verificar->asXML());
            
$newItem $sxe->addChild("voto");
            
$newItem->addChild("respuesta"$_POST['select']);
            
$newItem->addChild("ip_address"$_SERVER['REMOTE_ADDR']);
            
            if (!
$sxe->asXML($_SERVER['DOCUMENT_ROOT']."/encuestas/sondeo1.xml")){
                echo 
"Hubo un error al guardar su voto, por favor intentelo nuevamente.";
            }
            else { echo 
"Su voto por <strong>".$_POST['select']."</strong> ha sido guardado satisfactoriamente."; } 
                 
            }
        
    } else {
    
        
$xml_sondeo "<?xml version='1.0' encoding='UTF-8'?>
        "
;
        
$xml_sondeo .= "<datos>
        <voto>"
;
        
$xml_sondeo .= "<respuesta>".$_POST['select']."</respuesta>
        <ip_address>
        "
.$_SERVER['REMOTE_ADDR']."
        </ip_address>
        "
;
        
        
$xml_sondeo .= "</voto>
        </datos>
        "
;
        
        
$archivillo $_SERVER['DOCUMENT_ROOT']."/encuestas/sondeo1.xml";
        
        if(
$fh fopen($archivillo'w+')) {
        
        if(
fwrite($fh$xml_sondeo)){
            echo 
"Su voto por <strong>".$_POST['select']."</strong> ha sido guardado satisfactoriamente.";
        } else { 
            echo 
"Hubo un error al guardar su voto, por favor intentelo nuevamente.";
        }
            
fclose($fh);
        }
    
    }
 
} else {
    
    echo 
'Debe seleccionar una opción';
    
?>
y test.php:

Cita:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Sondeos</title>

</head>
<body>
<div style="width:300px; background-color:#CCC; margin: 0 auto;">
<div style=" width:300px;">
<div>
<label>¿Que opina de los burritos?</label><br>
<input class="boton" type="radio" name="group2" value="BUENOS"> Estan buenos<br>
<input class="boton" type="radio" name="group2" value="NOBUENOS"> No me gustan<br>
<input class="boton" type="radio" name="group2" value="abstener"> Abstengo mi comentario<br>
<input id="elBoton" type="button" value="Enviar">
</div>
<br><br>
<div id="resultado">

</div>
</div>
</div>

<script src="//code.jquery.com/jquery-1.11.2.min.js"></script>

<script>
$('#elBoton').click(function(){
$( "#resultado" ).load( "res.php", {
elBoton : $('#elBoton').val(),
select : $('.boton:checked').val()
} );
})
</script>

</body>
</html>
en test.php se encuentra el formulario, y res.php es el backend.

El detalle es el siguiente:

Supongamos que no existe el xml aun, un individuo entra, realiza la votacion y listo, se crea el XML con un registro, si ese mismo usuario intenta votar INMEDIATAMENTE despues de hacer su primera votacion y que nadie mas haya votado aun, el podra votar, la validacion que hago con xpath y la IP no funciona cuando hay solo un registro y el mismo usuario intenta votar inmediatamente despues.

Si yo siendo el primero, realizo la votacion, despues otro usuario vota (despues de este punto ya hay 2 registros), despues intento votar yo de nuevo, ahora si funcionara la validacion.

La pregunta es, ¿porque no funciona esa validacion si el primer usuario intenta votar 2 veces, de que otra forma pudiera hacer esa validacion?

Lo intente con un foreach y un if, pero tuve el mismo resultado.

Gracias de antemano.
======================
Una correccion...

Error. El detalle es, que el primer usuario, siempre, sin importar que, puede votar 2 veces
==========================

Última edición por omar_gutierrez; 07/04/2015 a las 00:08