Hola Gente! Tengo un problema con el Ajax.
El problema es el siguiente. Yo tengo que mandar un formulario a la base de datos, que almacena un asunto y un mensaje.
El objetivo es crear un blog.
Quiero que el usuario pueda dejar una nota,y entonces la nota valla a la db. Pero también quiero que pueda borrarla.
A su vez, quiero que no sobrepase los 10 mensajes una sola persona.
Y también, que no se cometan redundancias como escribir dos veces un mensaje con el mismo asunto(simplificacion de escribir 2 mensajes iguales).
Bueno, os pego los códigos por aqui.
Los scripts funcionan bien pero tienen cosas extrañas:
Lo que sospecho es que cuando pulsas en enviar, ajax envia, pero si rápidamente vuelves a pulsar, vuelve a hacer una segunda peticion, y se me cuela un mensaje javascript con el mismo asunto y mensaje, pero en la db no.
Alguna idea para que no pase eso?
Gracias.
Código de INDEX.PHP
Código:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Blog</title>
<meta name="GENERATOR" content="Quanta Plus">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel="stylesheet" type="text/css" href="blogstyle.css"/>
<script language="javascript" type="text/javascript">
// <!--
MENSAJESPERMITIDOS = 10;
/*El blog tiene varias cosas.
1.Función que crea un nuevo div con el contenido, ademàs de (meterlo en la db).
2.Función que carga todos los comentarios anteriores de la db.
*/
accion='accion';
function AJAX(){
if(window.XMLHttpRequest){
peticion_http = XMLHttpRequest();
}
else if(window.ActiveXObject){
peticion_http = new ActiveXObject("Microsoft.XMLHTTP");
}
//Realizo la petición http
peticion_http.open('GET','procesablog.php?contenido='+contenido+'&asunto='+asunto+'&accion='+accion,true);
peticion_http.send(null);
peticion_http.onreadystatechange = function(){ if(peticion_http.readyState==4){ respuesta=peticion_http.responseText;}}
return respuesta;
}
//Display
function CreaDiv(DivRoot,asunto,contenido){
//identifico el nodo raiz
DivRoot = document.getElementById(DivRoot);
//Creo los elementos hijos de la raiz
Div = document.createElement("div");
Div.setAttribute("id","post");
Asunto = document.createElement("h3");
/*CRUZ PARA CERRAR**************/
Cruz = document.createTextNode("Cerrar");
Cerrar = document.createElement("a");
Cerrar.appendChild(Cruz);
Div.appendChild(Cerrar);
Cerrar.setAttribute("onclick","accion='borrar';borracomentario(this.parentNode);");
//Asignando un id a la cruz.
Cerrar.setAttribute("id","cerrar");
/**********************************************/
//Creo los elementos nietos de la raiz
Texto = document.createTextNode(contenido);
AsuntoTexto = document.createTextNode(asunto);
//Enlazo nieto e hijo, hijo y padre.
Asunto.appendChild(AsuntoTexto);
Div.appendChild(Asunto);
//Enlazo hijo y padre
Div.appendChild(Texto);
//uno el padre con la raíz
DivRoot.appendChild(Div);
}
//Procesando la informacion
function Procesa(){
DivRoot = "blogdisplay";
//Saco el input
asunto= document.getElementById("blogasunto").value;
//Saco el textarea
contenido = document.getElementById("blogmensaje").value;
//Miro cuantos div hay, y si hay que añadir más o no.
if(document.getElementById(DivRoot).childNodes.length<=MENSAJESPERMITIDOS){
//La función procesa también llamarà a AJAX.
respuesta = AJAX();//calcula una respuesta entre otras cosas.
if( respuesta == 1){
//Creo Div
CreaDiv(DivRoot,asunto,contenido);
}
else alert(respuesta);
}
}
function borracomentario (div){
//conseguir el asunto bueno.
asunto=div.childNodes[1].firstChild.nodeValue;
div.parentNode.removeChild(div);
//Esta función hará mas cosas cuando haya que borrar el comentario de la db.
AJAX();
}
// -->
</script>
</head>
<body>
<h1>::El blog del Espía::</h1><br>
<div id="blog" >
<label>Asunto</label><br><input type="text" size="26" id="blogasunto" /><br>
<textarea rows="10" cols="30" id="blogmensaje" ></textarea><br>
<a onclick="accion='insertar';Procesa();" id="button" >Anotar</a>
</div>
<div id="blogdisplay"></div>
</body>
</html>
y ahora el archivo que uso para procesar este blog. PROCESABLOG.PHP
Código:
<?php
#Globales
include_once("/home/zeuslife/public_html/inc/globals.php");
#Función Query
include_once("/home/zeuslife/public_html/inc/query_i.php");
/*
#Funciones
include_once("/home/zeuslife/public_html/inc/functions.php");
#Funciones
include_once("/home/zeuslife/public_html/inc/security.php");
$user = $_SESSION['UTSW'];
$userid = $_SESSION['IDTSW'];
*/
//Cambio las variables que vienen, por las buenas.
$userid = 48;
$mensaje = $_GET['contenido'];
$asunto = $_GET['asunto'];
$accion = $_GET['accion'];
//El ajax se ha enviado por post, por tanto, tengo las variables: $userid, $asunto, $mensaje y $accion
//Pongo el userid mio, para hacer las pruevas.
$ultimolog = date("Y")."-".date("m")."-".date("d")." ".date("h").":".date("i").":".date("s");
if ($accion == "insertar"){
//Condición para insertar.
$que = db_query("SELECT * FROM spy_notebook WHERE userid='$userid' AND asunto='$asunto'");
$cuantas = mysql_num_rows($que);
if($cuantas==0){
$query = db_query("INSERT INTO spy_notebook (userid,ultimoedit,nota,asunto) VALUES('$userid','$ultimolog','$mensaje','$asunto')");
echo 1;
}
else {
echo 0;
}
}
else if ($accion == "borrar"){
$query = db_query("DELETE FROM spy_notebook WHERE userid = '$userid' AND asunto='$asunto'");
echo 1;
}
?>
Supongo que la historia estaria en frenar el javascript, que se esperara a que la petición acabara, pero no se me ocurre como.
Otro problema que tiene, es que misteriosamente, la primera vez que quiero pulsar el boton ANOTAR, no anota, y no se bien bien porqué, y ahi si que no tengo ni sospechas ni nada, no tengo ni idea de porqué.
Muchas grácias, y saludos!!