• Compra una licencia de Windows 10/11 (10€) u Office (18€) al mejor precio u Office al mejor precio. Entra en este post con las ofertas
  • Conoce los Días Naranjas de PcComponentes: descuentos de hasta un 40% en tecnología. Entra en este post con las ofertas
  • ¡Bienvenid@! Recuerda que para comentar en el foro de El Chapuzas Informático necesitas registrar tu cuenta, tardarás menos de 2 minutos y te dará valiosa información además de ayudarte en lo que necesites o pasar un rato agradable con nosotros.

Sitema de votacion, ajax , php y msql

Tengo duda en esto:

if (! isset($_GET['numero'])) {
die('Falta la variable número.');
}


$n = $_GET['numero'];
 
Última edición:
Si no existe el índice "numero" en el superarray $_GET, muestra el mensaje "Falta la variable numero" y termina la ejecucion del script.

Despues asigna a $n el valor de ese indice en el superarray

Enviado desde mi X5pro mediante Tapatalk
 
oMega_2093, ya he compredido el ejemplo que has puesto, lo que hace es comprobar que lo que te trae el $_GET es el valor "numero" :)
 
ya voy entendiendo el ejemplo :p
 
$_GET es todo lo que tu script recibe mediante la URL. Por ejemplo, si se ejecuta una petición a este fichero de esta forma:

Código:
/script.php?numero=7&prueba=si

El array $_GET será así:

PHP:
<?php

$_GET = [
	'numero' => '7',
	'prueba' => 'si'
];

Para trabajar y hacer tus cosas, accedes a un índice concreto de dicho array, que puede existir... O no. ¿Y si ejecutan el script así?

Código:
/script.php

$_GET estará vacío y si accedes a $_GET['numero'] sin comprobar antes que exista, el código te va a dar un error (revisa lo que hace isset()). Por eso:

1. Compruebo con isset() que exista dicho índice.
2. Si no existe, detengo el script.
3. Si existe, le asigno su valor a $n.

El resto... ¿lo entiendes? La parte de la base de datos especialmente.

PD: la clave cuando veas código es saber qué hacen las funciones. Las funciones siempre van con paréntesis, como por ejemplo strpos(), str_replace(), fopen()... Te recomiendo que cuando veas una función que desconozcas, vayas a la documentación (http://php.net) y busques dicha función.
 
oMega_2093 Gracias, por la ayuda. Mañana haré mi archivo php y os lo muestro para que me digaís los fallos
 
Buenas,

pabs11 o oMega_2093, quisiera saber si voy por buen camino en el archivo php para contabilizar los votos?.
[<?PHP]

include("connect.php");

//Cuando el usuario vota por primera vez.
$ip = $_SERVER['REMOTE_ADDR'];

$cons = mysql_query("SELECT ip FROM `votos`");
$row = mysql_fetch_assoc($cons);

$ips = $row['ip'];
$ips .= ','.$ip; //Se agrega el IP a la lista de IPs que ya votaron

mysql_query("UPDATE `votos` SET ip = '$ips'"); //Se actualiza la tabla


//Comprobar si el usuario ya voto.
$ip = $_SERVER['REMOTE_ADDR'];

if(mysql_query("SELECT ip FROM `votos` WHERE ip LIKE '%$ip%'")){

//USUARIO YA VOTO
}else{

//USUARIO PUEDE VOTAR.
}

# creamos las variables para que funcione.
$voto = null;
if (isset($_GET['voto'])) {
$voto = htmlentities($_GET['voto']);
} else {
exit;
}

$id = int;
if (isset($_GET['id'])) {
$id = htmlentities($_GET['id']);
} else {
exit;
}

$result = $mysqli->query("SELECT id,votos FROM votos WHERE votos='".$votos."'");




[?>]

Espero vuestras respuestas. :)
 
Última edición:
Hombre, te has pasado nuestras recomendaciones sobre Base de Datos y el acceso a ella...

Enviado desde mi X5pro mediante Tapatalk
 
Que no me hecho caso de vuestras recomendaciones?.Entonces... lo voy a intentar de otra forma
 
No nos haces mucho caso, no :p

1. Sigues utilizando la extensión mysql, pero luego pones una línea de mysqli... ¿Tú pruebas tus scripts?
2. Sigues concatenando IPs. Eso es INCORRECTO. Debe ser un voto, un registro. No tienes que concatenar las IPs, tienes que insertar registros nuevos.

Con el ejemplo que yo te puse tienes que modificarlo muy poco para conseguir lo que quieres.
 
oMega_2093 ¿están bien estas tablas? . ¿O tendría que quitar alguna fila?



-- Estructura de tabla para la tabla `paginas`
--

CREATE TABLE IF NOT EXISTS `paginas` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`nombre` varchar(32) NOT NULL DEFAULT '',
`fecha` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`num_votos` int(20) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `nombre` (`nombre`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;



--
-- Estructura de tabla para la tabla `votos`
--

CREATE TABLE IF NOT EXISTS `votos` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`ip` int(10) unsigned NOT NULL DEFAULT '0',
`id_encuesta` int(10) unsigned NOT NULL DEFAULT '0',
`votos` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `votos` (`ip`,`votos`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
 
ENCUESTA (id, nombre, fecha)
VOTO (id, ip, id_encuesta)

Esas podrían ser tus tablas. Ah, utiliza InnoDB en general mejor que MyISAM.

No necesitas el num_votos en principio: puedes hacer COUNT() sobre la tabla de votos. Sé que alguien dirá que es más rápido si tienes el campo num_votos, y es verdad, pero a tu nivel no debes preocuparte por si es más rápido o no, mejor céntrate en normalización ;)
 
oMega_2093 Una pregunta yo puedo poner esta variable cuántas veces yo quiera?. Con los campos de las tablas está claro :) if (! isset($_GET['numero'])) {
die('Falta la variable número.');
}
 
Intenta utilizar la etiqueta
PHP:
 para meter el código dentro, please. Se hace difícil leer en texto plano.

No entiendo muy bien tu duda. En programación puedes hacer lo que quieras mientras sea sintácticamente correcto (tu ejemplo lo es), haga lo que quieres (esto es lo que no sé) y sea eficiente (en este caso, irrelevante). Ante tu duda, sí "puedes" hacerlo. La pregunta sería: ¿sería lo que quieres hacer? Si no hay más código o explicas algo más, no sé darte una respuesta más concreta.
 
oMega_2093, una pregunta ¿como hago un select por PDO?.
 
oMega_2093, ya está hecho , yo creo que no falta nada... pero si tengo algún fallo lo corregiré :)


<?php

if (! isset($_GET['votos'])) {
die('Gracias por votar.');
}

$voto = $_GET['votos']; //voto del usuario


//obtenemos la IP del usuario
if ($_SERVER) {
if ( $_SERVER[HTTP_X_FORWARDED_FOR] ) {
$realip = $_SERVER["HTTP_X_FORWARDED_FOR"];
} elseif ( $_SERVER["HTTP_CLIENT_IP"] ) {
$realip = $_SERVER["HTTP_CLIENT_IP"];
} else {
$realip = $_SERVER["REMOTE_ADDR"];
}
} else {
if ( getenv( "HTTP_X_FORWARDED_FOR" ) ) {
$realip = getenv( "HTTP_X_FORWARDED_FOR" );
} elseif ( getenv( "HTTP_CLIENT_IP" ) ) {
$realip = getenv( "HTTP_CLIENT_IP" );
} else {
$realip = getenv( "REMOTE_ADDR" );
}
}

//comprobamos que este usuario haya realizado el voto (identificacion por IP)
$stm = $pdo->prepare("SELECT *FROM votos WHERE ip = '".$realip."' and id = $id",$link);
$stm->bindParam(':ip', 'id');
$stm->execute();

//insertamos el voto
if($row[0]==""){

$stm = $pdo->prepare("SELECT votos,nombre FROM encuesta WHERE id =$id",$link);
$stm->bindParam(':votos', 'nombre');
$stm->bindValue(':votos', $votos, PDO::pARAM_INT);
$stm->bindValue(':nombre', $nombre, PDO::pARAM_INT);
$stm->execute();

$stm->execute();

//insertamos la ip y la fecha del voto

$stm = $pdo->prepare("INSERT INTO votos(id,ip,fecha)VALUES($id,'".$realip."','".$fecha."')",$link);
$stm->bindValue(':ip', $ip, ':fecha', $fecha, PDO::pARAM_INT);

$stm->execute();


// actualizamos el voto

$stm = $con->prepare("UPDATE encuesta SET votos= votos, nombre= nombre");
$stm->bindParam(':nombre', $nombre);
$stm->bindParam(':votos', $votos);
$stm->execute();


}



?>
 
pabs11, esto me sirve para pulsar el botón y que me devuelva la repuesta?

$('#boton').click(function () {
$.ajax({
url:'contador.php',
type: 'GET',
success: function (response) {
$("#contador").html(response);
}
});
});
 
Si. Eso si, la respuesta es lo que se "escribe" en el php. Es decir, lo de los echo, si no recuerdo mal.

Enviado desde mi X5pro mediante Tapatalk
 
pabs11, gracias. Otra duda, yo tengo mi página web en 1&1 por lo que no puedo utilizar PDO.Yo tengo todo puesto con mysql ,¿ O puedo usar PDO?.

Gracias, por ayudarme en esto :)
 
Que version de PHP tienen en 1&1 que no puedes usar PDO? Si, podrias usar mysqli, por supuesto, pero es raro eso de tener una version antigua...

Enviado desde mi X5pro mediante Tapatalk
 
Arriba