Ver Mensaje Individual
  #9 (permalink)  
Antiguo 08/12/2010, 21:35
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: ayuda con registro

Cita:
si ya lo intente manual mente pero en la pagina no aparece el registro del jugador
ai te pase algo de mis datos si me podes ayudar
Genial, pero ¿qué fue lo que intentaste?
¿Con qué datos lo intentaste?
¿Con qué interfase hiciste la prueba manual?
¿Verificaste las cosas que te pasé por MP?
¿Comprobaste que realmente la sentencia de INSERT esté bien construida?
¿Programaste los métodos para que te devuelvan el error de MySQL que pueda producirse?


Te reitero un detalle: No existe en tu estructura de tablas ninguna razón para el comportamiento que comentas que tienes en el sistema, por lo que si hay un error no es estructural sino procedimental. Lo que hay que determinar es si es procedimental de PHP o de MySQL.

MP:
Cita:
Aclaremos que no soy experto en PHP, pero como manejo varios lenguajes, y he programado bastante en ellos, puedo seguir la lógica del PHP.
Leí parte de tu código para comprender cómo construyes las sentencias de SQL, y hay ciertas cosas que me causan dudas.
SQL tiene formas estrictas de manejar la sintaxis de los datos y que en esencia es fácil de descibir:
- Todo dato numérico se escribe solamente con su valor,
- todo dato de cadena de caracteres va entre apóstrofes, y su contenido escapado.
- toda fecha se deben encerrar entre caracteres determinados (apóstrofes en el caso de MySQL),
- todo dato de hora se coloca entre apostrofes,
- todo valor que exista como función de SQL debe ir con su nombre de función sin apostrofado.

En tu caso tu construyes el conjunto de datos así:
Código PHP:
Ver original
  1. if (count ($res2) == 0)
  2.       {
  3.           $tmp=array (
  4.               "nick" => addslashes (strip_tags ($jugador["nick"])),
  5.               "nombre" => addslashes (strip_tags ($jugador["nombre"])),
  6.               "dni" => strtoupper ($jugador["dni"]),
  7.               "id_juego" => $_SESSION['id_juego'],
  8.               "localizacion" => addslashes (strip_tags ($jugador["localizacion"]))
  9.               );
  10.           $id_jug = $BD->putTabla ("jugadores", $tmp);
  11.           $tmp=array (        
  12.               "nombre_clan" => addslashes (strip_tags ($jugador["nick"])),
  13.               "id_juego" => $_SESSION['id_juego'],
  14.               "id_jugadores" => $id_jug,
  15.               "ip_registro" => realip (),
  16.               );
  17.           $BD->putTabla ("equipos", $tmp);
  18.           $error = false;
  19.       }
y en este código creas y ejecutas la sentencia:
Código PHP:
Ver original
  1. function putTabla ($tabla, $array)
  2. {        
  3.     $valores= implode ("','", $array);
  4.     $campos= implode (",", array_keys ($array));
  5.  
  6.     $query = "INSERT INTO $tabla ($campos) VALUES ('$valores')";                            
  7.     mysql_query ($query ,$this->link);
  8.     return (mysql_insert_id ($this->link));
  9. }
En principio pareciera estar bien, pero no estoy seguro de que el valor tomado por $query esté correctamente escrito. Digo esto porque implode() crea una cadena desde un array, agregándole un separador. Pero tu estás poniendo en el separador los apóstrofes sin considerar los iniciales y finales, por lo que algún dato puede estar entrando mal.

Otro defecto que le veo a la función, es que tu estás dando por sentado que el resultado ha sido correcto, por lo que no tienes resuelto qué hacer si devuelve un error (control de errores), ni tampoco recuperas mensaje de error alguno, por lo que si falló la sentencia, no sabemos por qué.

La primera sugerencia que te daría es que recuperes el valor de $query para ver qué es lo que realmente estás mandando.
La segunda y muy importante, es que captures los errores que puedan darse en la ejecución. SI no se está insertando el segundo registro, debe ser forzosamente porque está devolviendo un error o un warning, y en ese caso mysql_insert_id() devuelve cero (0), por lo que jamás leerá otro registro.
En cualquier caso hay que ver qué es lo que MySQL dice.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 08/12/2010 a las 21:43