Ver Mensaje Individual
  #9 (permalink)  
Antiguo 08/10/2011, 13:34
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Provocar un update con dos filas de la misma tabla

Vamos a aclarar algunos detalles:
- PHP es un lenguaje del lado del servidor, las operaciones no se realizan en el cliente (como el JavaScript), de modo que realizar ciertas operaciones dentro de un script PHP es bastante más seguro de lo que piensas. Ten en cuenta que para llegar a tus scripts (y a tu ejecución) primero tienen que hackearte el host y la base... con lo que el que capturen el proceso es el menor de tus problemas. A esa altura es probable que ya no te quede ni website, ni base...
- Los SP son mucho más seguros que usar consultas directas, fundamentalmente porque son invulnerables al sql-injection, ya que como sólo pueden recibir parámetros, y los parámetros operan dentro del SP, no pueden incrustar una sentencia ilegal dentro de ellos.
- Por otro lado, los SP permiten hacer un conjunto de operaciones mucho más extensas que simples consultas, lo que los vuelve ideales para procesos más o menos complejos.
- El uso de diferentes usuarios que certifiquen contra el servidor de MySQL es una forma ideal de seguridad por muchas razones, como: 1) El sistema de encriptación de las claves en MySQL no es desencriptable; 2) Permite no recargar conexiones a usuarios y restringir la cantidad de conexiones que un usuario puede hacer; 3) Permite definir una buena granularidad de permisos para los roles de los usuarios, lo que se puede llevar al extremo de que ciertos usuarios sólo puedan acceder a consultas por medio de SP... imagínate.

Respecto a tu "trigger", sigues cayendo en el problema de que quieres invocar valores que no se pueden reconocer porque no son parte de la tabla disparadora del mismo TRIGGER, aunque ahora queda un poco más claro lo que quieres hacer.
El problema es que no puedes invocar una tabla simplemente llamando a esto:
Código MySQL:
Ver original
  1. envios.c_mess
Eso no es nada para el SQL. No hay ningún indicativo de cómo recuperar eso o qué es lo que quieres hacer o de dónde lo obtiene. De hecho, con esa sintaxis parece que te refirieras a la base de datos "envíos" y que busque una tabla denominada "c_mess".

Empecemos desde el principio: La única forma en que un DBMS opere con datos en tablas es usando alguna de las sentencias DML (Data Management Language), las cuales son sólo cuatro: SELECT, INSERT, DELETE o UPDATE. Y tu no estás usando ninguna para esta comparación. Ninguna.
¿Cómo quieres que el SQL sepa de dónde o cómo obtener ese dato? No se lo estás diciendo.

En definitiva, si quieres comparar uno o más valores con algún registro de una tabla, debes realizar un SELECT que te permita definir si existe algún registro que cumpla con la condición dada.
A diferencia de un lenguaje de programación, "envios" no es un objeto contenedor o una Collection de algún tipo a la que puedas acceder por alguna propiedad o método. Es una tabla de datos en disco que sólo se puede leer con SELECT.

Bien, yendo a tu problema, la cosa tiene solución:

Con TRIGGER sería más o menos así:
Código MySQL:
Ver original
  1. DELIMITER $$
  2. DROP TRIGGER IF EXISTS `base5`.`enviados`$$
  3. CREATE TRIGGER `base5`.`enviados`
  4. BEFORE INSERT ON `base5`.`enviados`
  5.     IF (SELECT id_user FROM envios WHERE envios.c_mess = NEW.c_mess AND id_user = NEW.m_to  AND envios.m_to  = NEW.id_user) IS NOT NULL THEN
  6.         -- este update lo tengo por que es fácil de comprobar si funciona lo anterior
  7.         UPDATE `base5`.`usuarios` SET `acces`= CURRENT_TIMESTAMP WHERE `id_user`=NEW.id_user;
  8.     END IF;
  9. END$$
  10. DELIMITER ;

Mas o menos por allí.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)