Foros del Web » Programando para Internet » PHP »

Ejecutar función SQL en misma ventana

Estas en el tema de Ejecutar función SQL en misma ventana en el foro de PHP en Foros del Web. Hoola. Ando realizando una especie de concurso de atrapar cosas por la web, pero me encuentro con un problema. Mi intención es que al clickear ...
  #1 (permalink)  
Antiguo 08/04/2012, 14:27
 
Fecha de Ingreso: junio-2011
Mensajes: 92
Antigüedad: 12 años, 10 meses
Puntos: 3
Ejecutar función SQL en misma ventana

Hoola. Ando realizando una especie de concurso de atrapar cosas por la web, pero me encuentro con un problema.
Mi intención es que al clickear una imagen que aparece en la web de vez en cuando, se ejecute una función SQL en la ventana misma, algo así:

Código:
<?php
echo ' <img src="" onclick="suma();" /> ';
function suma() {
mysql_query('UPDATE tabla SET clicks=clicks+1 WHERE user_id=$_SESSION[id]');
}
Pero, por lo que he buscado, no es posible hacer eso en PHP.

Me interesa hacerlo así, porque de ASP, AJAX o JavaScript se poco o nada.

Gracias.
  #2 (permalink)  
Antiguo 08/04/2012, 15:16
 
Fecha de Ingreso: abril-2012
Mensajes: 22
Antigüedad: 12 años
Puntos: 4
Respuesta: Ejecutar función SQL en misma ventana

Hay que recordar que PHP es un server-side scripting por lo cual tu ejemplo no va a funcionar.
Lo mejor seria hacer un nuevo archivo por ejemplo llamado query.php, y otro archivo donde este ubicado tu imagen, y al darle click a la imagen se ejecute un javascript que haga el request al archivo query.php.
Mira, te recomiendo usar jquery.
Te dejo unos ejemplos del archivo php y el otro archivo donde se ubica la imagen usando jquery.
Archivo HTMl:
Código HTML:
<!DOCTYPE html>
<html>
<head>
<title>Ejemplo</title>
<script src="http://code.jquery.com/jquery-1.7.2.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$("#imagen").click(function() {
$.post("query.php",function(res) {
if(res=="yes"){
// Todo salio bien
}else{
// Algo sucedio
}
});
});
});
</script>
</head>
<body>
<img src="linkImagen" style="cursor:pointer;" id="imagen" />
</body>
</html> 
Archivo PHP (query.php):
Código:
<?php
session_start();
mysql_query('UPDATE tabla SET clicks=clicks+1 WHERE user_id=$_SESSION[id]') or exit("no");
echo "yes";
?>
Me avisas como te va ;)
  #3 (permalink)  
Antiguo 08/04/2012, 15:50
 
Fecha de Ingreso: junio-2011
Mensajes: 92
Antigüedad: 12 años, 10 meses
Puntos: 3
Respuesta: Ejecutar función SQL en misma ventana

Gracias. Lo he probado pero no ocurre nada al clickear la imagen.
  #4 (permalink)  
Antiguo 08/04/2012, 16:01
 
Fecha de Ingreso: abril-2012
Mensajes: 22
Antigüedad: 12 años
Puntos: 4
Respuesta: Ejecutar función SQL en misma ventana

Ok dejame ayudarte con eso.
Aparentemente si se activa el post. El problema es en el archivo query.php que hay un error, entonces el $.post no recibe respuesta ni nada por el estilo por lo cual no sucede nada.
He probado el codigo PHP que has posteado y aparentemente no funciona por la razon que te especifique antes.
Te dejo la version modificada del HTML, si salen los alertas es que si paso algo.

Código HTML:
<!DOCTYPE html>
<html>
<head>
<title>Ejemplo</title>
<script src="http://code.jquery.com/jquery-1.7.2.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$("#imagen").click(function() {
$.post("query.php",function(res) {
if(res=="yes"){
alert("Gracias");
}else{
alert("Error: " + res);
}
});
});
});
</script>
</head>
<body>
<img src="linkImagen" style="cursor:pointer;" id="imagen" />
</body>
</html> 
En el archivo query.php no te olvides de hacer el mysql_connect y toda la historia:
Código:
<?php
session_start();
$conn=mysql_connect("ip","usuario","password");
mysql_select_db("schema",$conn);
mysql_query('UPDATE tabla SET clicks=clicks+1 WHERE user_id=' . $_SESSION['id']) or exit(mysql_error());
echo "yes";
?>
No te olvides reemplazar eso del "ip", "usuario", "password", "schema" por tus datos ;)
  #5 (permalink)  
Antiguo 08/04/2012, 16:25
 
Fecha de Ingreso: junio-2011
Mensajes: 92
Antigüedad: 12 años, 10 meses
Puntos: 3
Respuesta: Ejecutar función SQL en misma ventana

Muchísimas gracias, me ha funcionado.

Una cosa mas. Alguna forma de en el momento de clickear la imagen, recargar un div que muestra los clicks hechos en total sin recargar la página?
  #6 (permalink)  
Antiguo 08/04/2012, 16:46
 
Fecha de Ingreso: junio-2011
Mensajes: 92
Antigüedad: 12 años, 10 meses
Puntos: 3
Respuesta: Ejecutar función SQL en misma ventana

Lo he conseguido, gracias por todo.
  #7 (permalink)  
Antiguo 08/04/2012, 16:47
 
Fecha de Ingreso: abril-2012
Mensajes: 22
Antigüedad: 12 años
Puntos: 4
Respuesta: Ejecutar función SQL en misma ventana

De nada ;)
  #8 (permalink)  
Antiguo 08/04/2012, 17:25
 
Fecha de Ingreso: junio-2011
Mensajes: 92
Antigüedad: 12 años, 10 meses
Puntos: 3
Respuesta: Ejecutar función SQL en misma ventana

Tengo una dudilla más, por si no es molestar mucho.

¿Alguna forma de que cuando alguien hace click, se active algo como fadeIn que muestre un mensaje global a TODOS los que estén en la web en ese momento?

Algo como:
<div id="mensaje">'.$_SESSION['usuario'].' ha hecho un click</div>
  #9 (permalink)  
Antiguo 08/04/2012, 19:52
 
Fecha de Ingreso: abril-2012
Mensajes: 22
Antigüedad: 12 años
Puntos: 4
Respuesta: Ejecutar función SQL en misma ventana

Actualizacion:
Para lo de fadein, puedes usar jquery tambien, ves como jquery hace mucho? jeje
http://api.jquery.com/fadeIn/
----------------------------------------------------------
Eso seria un poco tedioso, pero si se puede.
Pero asi de sencillo no...
Podrias almacenar el click en una base de datos en el mismo supuesto "query.php" y con javascript, con la misma tecnica que te enseñe pero con otro archivo php, consultar a un archivo por los clicks hechos. Te dejo un ejemplo largo:
Simulemos que hemos creado una tabla llamada 'lastClicks' y que sus filas son: idclick, fromwho
donde idclick es el index key y fromwho el nombre de usuario quien ha clickeado.

Código HTML:
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="http://code.jquery.com/jquery-1.7.2.min.js"></script>
<script type="text/javascript">
// Creamos una variable con el ultimo idclick obtenido para evitar la seleccion de todos los clicks.
var lastidclick=0;
// Hacemos una llamada a un archivo php para obtener el ultimo id y no empezar desde el indice 0
$.post("lastclick.php",{ action : 'last' },function(res){
if(res!=""){
lastidclick=res;
}
});
// Explico, la variable res es el response (lo que imprime) el archivo lastclick.php
// Eso de action last, es un POST de key action con el value 'last'
// Creamos la funcion que obtendra los ultimos keys.
function getLastClick(){
$.post("lastclick.php",{ action : 'click', lastid : lastidclick },function(res){
if(res=="ERROR"){
alert("ERROR");
}else if(res!="NONE"){
lastidclick=res.lastid;
document.getElementById("lastClick").innerHTML=res.who + " dio click a la imagen.";
}
});
// Creamos un interval para que cada segundo y medio haga la consulta.
setInterval("getLastClick()",1500);
</script>
<body>

<!-- El contenedor con id 'lastClick' respeta las mayusculas -->
<div id="lastClick"></div>

</body>
</head>

</html> 
Ahora, crearemos un archivo, como en el $.post() definimos llamado lastclick.php
lastclick.php:

Código PHP:
<?php
if($_POST["action"]=="last"){

$query=sprintf("SELECT * FROM lastClicks ORDER BY idclick DESC");
$query2=mysql_query($query) or exit("ERROR");
$fetch=mysql_fetch_array($query2) or exit("ERROR");
echo 
$fetch["lastClicks"];

}elseif(
$_POST["action"]=="click"){


$lastId=0;
if(isset(
$_POST["lastid"]) && is_numeric($_POST["lastid"])){
$lastId=$_POST["lastid"] +1;
}

$query=sprintf("SELECT * FROM lastClicks WHERE idclick='%s'",$lastId);
$query2=mysql_query($query) or exit("ERROR");

$numRows=mysql_num_rows($query2) or exit("ERROR");
if(
$numRows!=0){
$fetched=mysql_fetch_array($query2) or exit("ERROR")
$arrayJson = array("who"=>$fetched["fromwho"],"lastid"=>$lastId);
echo 
json_encode($arrayJson);
}else{
echo 
"NONE";
}
}
?>
Inspirandonos en la base de datos que cite antes de todo ese codigo.
Si hay algun error de syntax o algo asi avisame ;)
Y si no funciona me avisas y te lo corrijo.
Practicamente implemente algo asi en un sistema de votacion en mi pagina web.
Puede ser un poco complicado y con sessions dudo que funcione ya que los sessions se almacenan en tu compu no en el de los demas...
Suerte!

Última edición por winwok; 08/04/2012 a las 19:55 Razón: Lo de fadein
  #10 (permalink)  
Antiguo 09/04/2012, 04:34
 
Fecha de Ingreso: junio-2011
Mensajes: 92
Antigüedad: 12 años, 10 meses
Puntos: 3
Respuesta: Ejecutar función SQL en misma ventana

Gracias.

[hr]

Si alguien me puede ayudar, es urgente.
Los usuarios descubrieron el query.php y lo están recargando a cada momento para sumarse clicks.

¿Alguna forma de protejerlo pero que funcione si es llamado por el javascript?
  #11 (permalink)  
Antiguo 09/04/2012, 06:03
Avatar de JaimeMSE  
Fecha de Ingreso: diciembre-2010
Ubicación: Isla Cristina (Huelva)
Mensajes: 164
Antigüedad: 13 años, 4 meses
Puntos: 7
Respuesta: Ejecutar función SQL en misma ventana

Pues podrías hacer un isset en el JQuery. No te puedo especificar ya que no tengo mucha idea de JQuery, pero podrías hacer un campo en JQuery y en el query.php poner:

Código PHP:
Ver original
  1. if(isset($enviado)) {
  2. echo "No me seas tramposo xD";
  3. }
__________________
@JaimeMSE - ¡Sígueme!
  #12 (permalink)  
Antiguo 09/04/2012, 06:28
 
Fecha de Ingreso: junio-2011
Mensajes: 92
Antigüedad: 12 años, 10 meses
Puntos: 3
Respuesta: Ejecutar función SQL en misma ventana

esque si el jquery fuese un form pues si, pero así no tengo ni idea. He probado poner dentro dej jquery:
var mostrar="si";

Después en el php
if($_GET['mostrar] == "si") {

}

Pero no consigo nada.
  #13 (permalink)  
Antiguo 09/04/2012, 06:34
 
Fecha de Ingreso: abril-2012
Mensajes: 22
Antigüedad: 12 años
Puntos: 4
Respuesta: Ejecutar función SQL en misma ventana

Eso es algo con que se lucha mucho. Pues no lo hagas con gets. Mira en el jquery que te di has esto:
Código HTML:
$(document).ready(function() {
$("#imagen").click(function() {
$.post("query.php",{ mostrar : 'si' },function(res) {
if(res=="yes"){
alert("Gracias");
}else{
alert("Error: " + res);
}
});
});
Nota el {mostrar:'si'} que puse demas en la linea del $.post
Eso es declarar el $_POST["mostrar"] con valor de 'si'
en php valida igual como tu comentastes pero en vez de $_GET, $_POST
Puedes hacer que el usuario solo pueda hacer un click a la imagen, cuando le de click a la uimagen crear un cookie con javascript, y cada vez que le de click a dicha imagen validar que el cooki exista, si existe, no hacer nada, si no existe sumar el click con el query.php y crear el cookie.

Otra forma también seria cambiar los permisos.
Si ocupas otra cosa me avisas ;)
  #14 (permalink)  
Antiguo 09/04/2012, 06:58
 
Fecha de Ingreso: junio-2011
Mensajes: 92
Antigüedad: 12 años, 10 meses
Puntos: 3
Respuesta: Ejecutar función SQL en misma ventana

Gracias, pero no funciona :(
Puse:
index.php (parte del script)
Código:
<script type="text/javascript">
$(document).ready(function() {
$("#imagen").click(function() {
$.post("funcion.php",{ mostrar : "si" },function(res) {
if(res=="yes"){
// Funcional
}else{
// No funcional
}
});
});
</script>
funcion.php
Código:
<?
include('SSI.php');
if($_POST['mostrar'] == "si") {
obj_act();
}
?>
  #15 (permalink)  
Antiguo 09/04/2012, 07:19
 
Fecha de Ingreso: junio-2011
Mensajes: 92
Antigüedad: 12 años, 10 meses
Puntos: 3
Respuesta: Ejecutar función SQL en misma ventana

Faltaba }); al final del javascript, muchas gracias.
  #16 (permalink)  
Antiguo 09/04/2012, 09:35
 
Fecha de Ingreso: junio-2011
Mensajes: 92
Antigüedad: 12 años, 10 meses
Puntos: 3
Respuesta: Ejecutar función SQL en misma ventana

Dios, ahora se suben clicks con "Inspeccionar elemento" de chrome, borran el javascript que cierra la imagen que se clickea.

¿alguien sabe bloquearlo?
  #17 (permalink)  
Antiguo 09/04/2012, 15:43
 
Fecha de Ingreso: abril-2012
Mensajes: 22
Antigüedad: 12 años
Puntos: 4
Respuesta: Ejecutar función SQL en misma ventana

No te entendi esa pregunta.
Mira, para la seguridad, setea los cookies mejor con el mismo PHP y has la revision del post en el mismo PHP.
Has lo siguiente:
En query.php

Código PHP:
if(!isset($_COOKIE["clicked"])){

// Codigo actual de tu query.php pegalo aqui

setcookie("clicked","clicked",time() + 84600);

}else{

echo 
"clicked";


Asi, por parte del servidor se valida si ya se ha clickeado mediante cookies, tendrias que vaciar las cookies para poder hacer otro click.
Y si quieres que al clickear la imagen te muestre si ya has clickeado o no, eso en el javascript haslo asi, lo hare segun el codigo que tienes actualmente y ese impreso que da el archivo query.php de "clicked" en el ejemplo anterior.

Código:
<script type="text/javascript">
$(document).ready(function() {
$("#imagen").click(function() {
$.post("funcion.php",{ mostrar : "si" },function(res) {
if(res=="yes"){
// Funcional
}else if(res=="clicked"){
alert("Ya has clickeado la imagem");
}else{
// No funciona
}
});
});
</script>
Te dejo ese tip ya que si borran algun javascript o algo por el estilo, podran afectar a su cliente pero a la parte del servidor no sucedera nada, nunca valides con javascript o scripts de parte cliente a contrario de PHP que es parte del servidor.

Etiquetas: mysql, sql, tabla, ventanas
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 13:36.