Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Validar elemento repetido XML con PHP

Estas en el tema de Validar elemento repetido XML con PHP en el foro de PHP en Foros del Web. 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: ...
  #1 (permalink)  
Antiguo 06/04/2015, 22:56
Avatar de omar_gutierrez  
Fecha de Ingreso: febrero-2011
Mensajes: 144
Antigüedad: 13 años, 2 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
  #2 (permalink)  
Antiguo 07/04/2015, 08:09
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 10 meses
Puntos: 379
Respuesta: Validar elemento repetido XML con PHP

Cita:
Hola gente, tengo como misión un apartado para unas encuestas, no se debe utilizar base de datos (mysql) por razones de seguridad.
Vaya esto si es nuevo, y con xml es mas seguro ? si es así por que ? ya pensaste en otro gestor de base de datos si mysql te parece inseguro ?
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #3 (permalink)  
Antiguo 07/04/2015, 10:43
Avatar de omar_gutierrez  
Fecha de Ingreso: febrero-2011
Mensajes: 144
Antigüedad: 13 años, 2 meses
Puntos: 2
Respuesta: Validar elemento repetido XML con PHP

Donde estoy, mi superior nunca ha querido tener conexiones a la base de datos en la parte publica del sitio. Siempre argumentando la seguridad y el performance del mismo. El performance si entiendo, se tiene mucho trafico en el sitio y seria un caos tener tantas conexiones MySQL, pero en seguridad, pues como dicen aca en México "Ganale al PRI".

Es un hecho que se lo tengo que hacer con XML, y la unica falla que tiene, y almenos yo no le encuentro logica, es que el primer usuario en votar siempre, sin importar que, puede votar 2 veces, esa validacion funciona perfecto con todos, a excepción del primer usuario.
  #4 (permalink)  
Antiguo 07/04/2015, 14:28
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 10 meses
Puntos: 379
Respuesta: Validar elemento repetido XML con PHP

Cita:
Donde estoy, mi superior nunca ha querido tener conexiones a la base de datos en la parte publica del sitio. Siempre argumentando la seguridad y el performance del mismo. El performance si entiendo, se tiene mucho trafico en el sitio y seria un caos tener tantas conexiones MySQL, pero en seguridad, pues como dicen aca en México "Ganale al PRI".
Sera un caos tener un archivo xml creciendo con multiples peticiones de E/S. Creo que una mejor solución seria que utilizaran SQLite
Cita:
Es un hecho que se lo tengo que hacer con XML, y la unica falla que tiene, y almenos yo no le encuentro logica, es que el primer usuario en votar siempre, sin importar que, puede votar 2 veces, esa validacion funciona perfecto con todos, a excepción del primer usuario.
Tienes que depurar la cóndición
Código PHP:
Ver original
  1. if($xml_verificar->xpath('/datos/voto[ip_address="'.$_SERVER['REMOTE_ADDR'].'"]'))
No estas pasando lo que tu esperas en ella cuando existe un usuario
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #5 (permalink)  
Antiguo 07/04/2015, 16:43
Avatar de omar_gutierrez  
Fecha de Ingreso: febrero-2011
Mensajes: 144
Antigüedad: 13 años, 2 meses
Puntos: 2
Respuesta: Validar elemento repetido XML con PHP

Super fail, creo que estaba mas dormido que despierto...

El error esta al momento de crear el xml, no se porque le puse saltos de linea.

Cita:
$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>
";
Me di cuenta al hacer un echo del primer y segundo registro, me aparecia un espacio extra al inicio de la primera IP.

Cita:
$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>
";
La condicion esta bien hecha.

Con respecto a xml o bases de datos, es un dilema que siempre se ha tenido aqui. Que porque no quieren que los "hackeen", que porque se crearan muchas conexiones a la BD y afectara el performance del servidor. Prefiero no meterme en broncas laborales.

Etiquetas: encuesta, sistema, validacion
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 16:02.