PHP Paranoid

Resulta que estoy trabajando en la integración de un foro, phpBB, en múltiples sitios, uno para todos en vez de todos para uno, y revizando el archivo /phpBB2/includes/usercp_register.php (para los interesados en mirar el código, estoy utilizando la última versión estable: phpBB 2.0.22), me surge la siguiente duda que paso a detallar más o menos así.

Para mantener la compatibilidad entre mi aplicación y phpBB trato de imitar la manera en la que están codeadas las distitnas secciones que cumplen la misma función, caso concreto: el registro de usuarios.

Posicionándome en la linea 614 del archivo en cuestión me encuentro con el siguiente choclo de código que resumo un poco para que sea más browser friendly y que no se extienda tanto el post:


<?php
$sql "SELECT MAX(user_id) AS total FROM " USERS_TABLE;
if (!($result $db->sql_query($sql))){
    message_die(GENERAL_ERROR'Could not obtain next user_id information'''__LINE____FILE__$sql);
}

if (!($row $db->sql_fetchrow($result))){
    message_die(GENERAL_ERROR'Could not obtain next user_id information'''__LINE____FILE__$sql);
}
$user_id $row['total'] + 1;

//
// Get current date
//

/* Acá iría todo el SQL que inserta al nuevo usuario en la tabla users */

if (!($result $db->sql_query($sqlBEGIN_TRANSACTION))){
    message_die(GENERAL_ERROR'Could not insert data into users table'''__LINE____FILE__$sql);
}


/* Más SQL INSERTS */
if (!($result $db->sql_query($sql))){
    message_die(GENERAL_ERROR'Could not insert data into groups table'''__LINE____FILE__$sql);
}

$group_id $db->sql_nextid();
/* Último SQL INSERT */
if(!($result $db->sql_query($sqlEND_TRANSACTION))){
    message_die(GENERAL_ERROR'Could not insert data into user_group table'''__LINE____FILE__$sql);
}
?>

Como podrán observar, se hace un chequeo después de que se ejecuta cada consulta a la base de datos y en caso de fallo se invoca a la función message_die(). Es en base a ésto que surge la siguiente pregunta: ¿No están siendo paranoicos? Es como que cada paso que dan lo hacen creyendo que la aplicación va a morir.

Entiendo que la aplicación funciona en múltiples plataformas, motores de bases de datos y versiones de PHP lo que la hace portable para los distintos planes de hosting, pero, de todas formas, ¿no les parece que son demasiado paranoicos?

Obviamente como imito la manera en que esto fue codeado mi código es como 10 kilómetros mas largo y me resulta realmente molesto.

¿No debería confiarse más en lo que uno está codeando en vez de imitar este comportamiento?. Si de todas maneras en caso de que todo se venga todo abajo tenemos un 90% de probabilidades que la integridad referencial de la base de datos se vaya a Ushuaia igual.

Me surgen un millón de cuestionamientos a favor y en contra de lo que planteo. El tema es que no tengo con quién discutirlo y ya que estamos qué mejor que dejarlo por escrito y ver qué frutos se puede sacar de ésto.

Comentarios:

  1. definitivamente necesario, ya que así queda documentado (tanto en el output como en el log) en que tabla concretamente falló el insert, y por qué (ya que calculo registra el último sql).

    Enviado por IgnacioMarcos el 23/02/2007 10:23:59 (#).

  2. Epa!! Como es eso de que no tenes con quien discutirlo??

    Enviado por Babblo el 23/02/2007 02:23:17 (#).

  3. Re IgnacioMarcos: hasta donde vi el log sólo queda registrado en el browser, por ende no queda ni rastro del error. Yo hice una función similar pero que me envía un mail en caso de error y en el código trato de hacer que pase lo más desapercibido posible para el usuario a menos que sea crítico, pero en cualquiera de los casos la aplicación me notifica del fallo.

    Se supone que una aplicación de este tipo tiene sus requerimientos, por ejemplo, que el server tenga instalado algún cliente SMTP para que envíe los mensajes de error, o que de alguna manera se genere un log o volcado en algún archivo.

    En el caso del ejemplo del volcado a un archivo estos tipos son capaces de fijarse si el disco está lleno antes de hacer el dump!

    Para qué chequear, re-chequear y recontra-chequear? No sería más conveniente instalar, testear y producir? Obviamente que no es cuestión de soplar y hacer botella y los condicionales van a estar siempre que se los necesite, pero es un hecho que si te querés poner a validar todo te volvés loco porque lo cierto es que se puede hacer.

    La parte que más me llama la atención de ese código es esta línea:

    $group_id = $db->sql_nextid();

    Con $group_id se establece la relación entre usuario X al nuevo grupo creado en la tabla phpbb_user_group

    En todo el bloque de código es la única que no validan. Qué pasaría si a su clase o a MySQL se les canta no devolver el dato? La integridad de los datos en la DB se perdería sin remedio.

    No digo que no haya que hacerlo, sino que no hay que hacerlo en exceso.

    Re Babblo: shh, que vos chateás mejor por comments que por IM, no te salgas del tema :P

    Enviado por Juan el 23/02/2007 03:23:35 (#).

  4. phpBB es muy bonito pero no pensaron en performance, esos checks los podrían meter en la función del query directamente y ahorrar lineas y lineas de código.

    Yo soy paranoico, limpio mi teclado para que nadie sepa mis claves por medio de mis huellas dactilares ^^

    Saludos...

    Enviado por Alberto Ferrer el 23/02/2007 08:23:27 (#).

  5. Re Alberto: Yo la verdad que lo detesto :P y de momento estoy esperando que me sorprendan con la nueva versión.

    Acerca de tu paranoia: sólo tipeás una contraseña en tu teclado o tenés uno aparte para hacer eso? Digo esto porque por lo general uno presiona casi todas las teclas :P

    Enviado por Juan Francisco Giordana el 23/02/2007 08:23:36 (#).

  6. Re Juan: Falta un link para hacer reply en comentarios che!!!

    Tengo varios teclados y para claves solo uso las pcs que creo confiables, en los cybers x ejemplo examino que corren y demas, paranoico mal !

    Enviado por Alberto Ferrer el 24/02/2007 04:24:15 (#).

  7. PhpBB es una peste, mas allá de la paranoia. el código (a mi parecer) es realmente feo.

    El código si bien es paranóico lo es sin sentido, porque... en caso de que alguno de los insert fallen no tiene función de "emergencia" o vuelta atrás... de todas formas los datos quedarían sin las referencias necesarias...
    No tiene ninguna función que elimine las referencias perdidas o que intente acomodar lo que acaba de fallar... simplemente lo corta ahí.

    Paranoicos y ensima encochinan todo...

    Alberto, trabajaste en dattatec... nadie es mas desprecoupado que un admin de ellos

    Saludos!

    Enviado por Lio el 24/02/2007 05:24:33 (#).

  8. Re Leo: phpBB existe desde antes que yo programe en PHP y no sé si existían las transacciones en esa época como para poder volver atrás, pero estoy seguro que, de igual manera, sí se pueden hacer los rollback que vos planteás con puro PHP.

    Y acerca de lo de Alberto, casualmente ayer le mandaba un mail comentándole que esta historia (Dattatec, Rosario y la actualidad, es mi Historia) la había leído hace más de dos años. Me acuerdo que me lo había pasado Guille porque los nombres de los personajes se asemejaban a una historia que él vivió.

    El artículo que Alberto escribió fue citado en nada menos que barrapunto: La explotación de los administradores linuxeros

    Enviado por Juan el 24/02/2007 05:24:54 (#).

  9. Yo no dije que "no se podía hacer" sino que no se está haciendo, y mas allá de que seguro se puede hacer, hay que tener en cuenta que, salvo que sea un error en la sentencia SQL, de poco sirve un rollback en el momento ya que si la consulta no se realizó es por un problema en el motor de la DB (no sirve un roll back porque es poco probable que se solucione un milisegundo despues de detectado el problema) o en la tabla (que aquí si sirve).

    No se que entendiste o bien no entendí tu comentario :P

    Saludos

    Enviado por Lio el 25/02/2007 02:25:20 (#).

  10. Re Lio: Opinamos lo mismo, phpBB corta la ejecución, avisa al user que estaba navegando el sitio en ese momento que se produjo el error X, pero no toma ninguna medida al respecto... qué es lo que no entendiste?

    Enviado por Juan el 26/02/2007 01:26:25 (#).