Con jQuery como siempre la cosa es la mar de sencilla! Puedes usar $.ajax que puedes personalizarlo bien, algo así
<form name="hola" onsubmit="comentar(this);">
...
</form>
El form muy sencillo, ahora el JS
function comentar(form) {
var params = ''; // inicializo la variable params (= parametros)
$(form).find('input, select').each(function() { // usando el objeto del form, BUSCO cada input o select y uso each para recorrerlos
params += '&' + $(this).attr('name') + '=' + encodeURIComponent($(this).val()); // añado a params el parametro correspondiente al elemento, this hace referencia al input, select etc. val() obtiene el valor ya sea un input, un select,un checkbox...
});
params = params.substring(1); //elimino el primer caracter de params que es "&" porque no debe empezar como tal.
// AJAX :D
$.ajax({
url: '/ajax/comentar.php',
method: 'GET/POST',
data: params,
dataType: 'html', // esto indica el dato que devolverá el archivo; html, xml o json
cache: false, // esto añade a la url ?_=TIME() que evita que el navegador cachee la web y devuelva siempre lo mismo
beforeSend: function() {
// en esta funcion puedes hacer algo como bloquear los input para que no haya leches, se ejecuta antes de enviar el ajax, en este caso bloqueare los input y select del form.
$(form).find('input, select').attr('disabled', 'disabled'); // añado un atributo disabled con valor disabled a cada elemento, no se si se puede hacer directamente al form, pruebalo y me haces el favor de sacarme la duda. xd
},
success: function(t) { // esta funcion se ejecuta al completarse exitosamente la peticion, el primer parametro (t en este caso) devuelve el texto del archivo, hay más pero no nos interesan.
if(t.charAt(0) == '0') { // si el primer caracter es un 0... (esto lo entenderemos al ver el PHP)
alert(t.substring(1)); // mostramos el error quitando el 0
} else {
$('#bloquedecomentarios').append(t); // añadimos el texto a un div que contiene los comentarios
}
}
});
Cabe decir que esta hecho un poco a mi manera, pero espero que lo principal lo hayas entendido...
*: El encodeURIComponent codifica caracteres para que no fastidien la url, ya explicaré por qué si eso.
Ahora el PHP, es sencillo, como si procesaramos un form normal.
<?php
// imagina que ussamos post
if(!esta_logeado) { die('0Logeate'); }
if(!mysql_query("INSERT...")) { die('0Error'); } else {
echo '<div id="comentario">'.$textocomentario.'</div>...';
}
?>
Como ves para identificar errores usamos un 0 y die, que para la ejecución del script. Si todo va bien mostramos el html del comentario que se insertará mas tarde. Por supuesto hay muchas más opciones pero esta es para mí la más aconsejable.
Si no has entendido algo no dudes en decirlo, xd