A ver, no se te muestra el mensaje de error con un echo ya que ajax trabaja de modo asíncrono, es decir, estás enviando peticiones al servidor en segundo plano y un echo lo que hace es imprimirte en pantalla cuando el navegador está cargando la página. No sé si me he explicado bien, pero intentaré ponerte un ejemplo de como yo lo haría:
Código Javascript
:
Ver originalfunction Registrar(idO, accion){
var categoria = document.frmObjetos.categoria.value;
var nombre = document.frmObjetos.nombre.value;
var marca = document.frmObjetos.marca.value;
var modelo = document.frmObjetos.modelo.value;
var serie = document.frmObjetos.serie.value;
var ubicacion = document.frmObjetos.ubicacion.value;
var user = document.frmObjetos.user.value;
/* CREAS OBJETO AJAX */
var xhr = new XMLHttpRequest();
/* DATOS DEL FORMULARIO AL OBJETO AJAX */
var data = new FormData();
data.append("categoria",categoria);
data.append("nombre",nombre);
data.append("marca",marca);
data.append("modelo",modelo);
data.append("serie",serie);
data.append("ubicacion",ubicacion);
data.append("user",user);
/* SI HAY UN ERROR */
xhr.addEventListener("error", function(e){
alert("Hubo un error en la petición");
}, false);
/* REGISTRO TERMINADO */
xhr.addEventListener("load", function(e){
var EVAL = eval;
var r = xhr.responseText;
var o = EVAL("("+r+")");
/* SI TODO ESTÁ OK */
if(o.estado === "OK"){
alert('Los datos de '+o.nombre+' se guardarón exitosamente.');
Limpiar();
}
/* SI HAY QUE MOSTRAR UN ERROR */
if(o.estado === "KO"){
alert(o.alerta);
}
});
/* ENVIAMOS EL FORMULARIO */
if(accion === 'N'){
xhr.open('POST', '/clases/registraObjeto.php');
}else if(accion === 'E'){
xhr.open('POST', '/clases/actualizaObjeto.php');
}
xhr.send(data);
}
Como puedes ver la función de registro la cambio levemente y utilizo un formData para enviar el formulario. La gran diferencia está en la respuesta. Si bien no ibas mal encaminado con lo de usar un echo, el echo no te va a funcionar como cuando cargas una página en el navegador, sino que sera el objeto xhr.responseText lo que te traiga el texto que imprime el script al que estás accediendo por AJAX.
En este caso para tener más control sobre la respuesta, en el script de PHP lo que haré será imprimir con un echo una clase codificada en json que javascript evaluará, de esta manera podemos devolver muchos datos diferentes y podemos controlarlos. Te he cambiado la alerta en caso de éxito para que veas las posibilidades. Por ejemplo:
Código PHP:
Ver original<?php
/* CLASE DE RESPUESTA (TANTAS VARIABLES COMO QUERAMOS) */
class Respuesta {
public $estado;
public $alerta;
public $nombre;
}
/* INSTANCIAMOS LA CLASE */
$OBJ_RESPONSE = new Respuesta();
include ('../Librerias/stdio.inc.php');
$nombre = $_POST["nombre"];
$categoria = $_POST["categoria"];
$marca = $_POST["marca"];
$modelo = $_POST["modelo"];
$serie = $_POST["serie"];
$ubicacion = $_POST["ubicacion"];
$user = $_POST["user"];
$conn = conexion();
$REP="Select * from objeto where(serie=$serie and visible!=0)";
if (!$rre){
/* RESPUESTA AJAX CON ESTADO KO PARA DETERMINAR ERROR */
$OBJ_RESPONSE->estado = "KO";
$OBJ_RESPONSE->alerta = "Error Objeto Repetido".mysqli_errno($conn) ; }
/* RESPUESTA AJAX CON ESTADO KO PARA DETERMINAR ERROR */
$OBJ_RESPONSE->estado = "KO";
$OBJ_RESPONSE->alerta = "Error.php";
}else{
$INS="INSERT INTO objeto values(0,$categoria,0,'$nombre','$marca','$modelo','$serie','$ubicacion',$user,1)";
if (!$rin){
/* RESPUESTA AJAX CON ESTADO KO PARA DETERMINAR ERROR */
$OBJ_RESPONSE->estado = "KO";
$OBJ_RESPONSE->alerta = "Error en la insercion de Objeto Nuevo." . mysqli_errno($conn); }
}
/* RESPUESTA AJAX CON ESTADO OK PARA DETERMINAR QUE TODO ESTÁ CORRECTO Y LE PASAMOS EL NOMBRE PARA PERSONALIZAR LA RESPUESTA COMO EJEMPLO */
$OBJ_RESPONSE->estado = "OK";
$OBJ_RESPONSE->nombre = $nombre;
?>
Como puedes ver lo que queremos devolverle a la peticion ajax en javascript lo hacemos por medio de un echo. No necesariamente tiene que ser una clase PHP, el responseText de javascript, recibirá cualquier cosa que este impresa en la pantalla, ya puede ser un echo en PHP como código HTML, es decir, recibirá cualquier cosa que tu verías en un navegador. En este caso enviamos un objeto PHP codificado para poder evaluarlo en javascript. El objeto puede ser como tu quieras con tantas variables como desees para poder recibir tantos datos separados como quieras. Eso sí, javascript no te evaluará métodos de la clase PHP por si se te ocurre hacerlo.
Como buena práctica, utiliza siempre la palabra VAR para declarar variables dentro de funciones javascript ya que si no lo haces esas variables tendrán caracter global y no estarán solo dentro del contexto de la función y puede ocasionarte problemas. Yo y esto es algo personal aconsejo usar el menor número de variables globales en javascript.
Espero haberte ayudado, un saludo.