Problema: Comparar dos tablas en PhP (SOLUCIONADO)

Imagen de d4v1d
0 puntos

¿Qué tal amigos?

Aquí vuelvo a la carga con un problema Mysql bajo PhP.

Nunca me había sentido tan patoso con un lenguaje. ¿Estaré perdiendo facultades?

Bueno, ésta no es mi pregunta. Ya he tenido otros problemas con MySQL y han sido por tonterias, talvez estar horas programando nubla la vista :-)

Por lo menos he tenido siempre el detalle de exponer el código tras su resolución para ayudar a otros con problemas similares, como respuesta a la rapidez que me habeís demostrado siempre a la hora de darme soluciones (correctas o no), por ello muchas gracias.

Este problema es más serio, ya que consiste en crear una consulta correcta. Además es la continuación del problema que ya se solucionó ayer en http://www.ubuntu-es.org/index.php?q=node/72574

El código que se encuentra en dicha página (en concreto "titular.php") ha sido complementado para que al final de dicho titular (la página trata de un periódico) se muestre el nombre del autor como un enlace que lleva a otra página ("autor.php") que muestra los títulos en modo enlace y los primeros 34 carácteres de cada texto correspondiente pero unicamente del autor (similar a "index.php" que se encuentra en la página antes citada).

Quedaría tal que así:

CÓDIGO "titular.php":

  1. <html>
  2. <body>
  3. <?
  4. $base="*****";
  5. $usuario="*****";
  6. $pass="*****";
  7. $tabla="ARTICULOS";
  8. $tabla2="AUTORES";
  9. $conexion=mysql_connect("localhost",$usuario,$pass);
  10. mysql_select_db($base,$conexion);
  11. $resultado=mysql_query("SELECT id,titulo,texto FROM $tabla WHERE id=$cod");
  12. while ($salida=mysql_fetch_array($resultado))
  13. {
  14. printf("<h2> %s </h2>",$salida["titulo"]);
  15. printf("<br>");
  16. printf("<p> %s</p>",$salida["texto"]);
  17. }
  18. $resultado2=mysql_query("SELECT id,nombre,apellidos FROM $tabla2 WHERE id=$cod");
  19. while ($salida2=mysql_fetch_array($resultado2))
  20. {
  21. $enlace2="autor.php?nombre=".$salida2["nombre"]."&apellidos=".$salida2["apellidos"];
  22. printf("<br><br><br><br>");
  23. printf("<a href= '%s'> %s %s</a>",$enlace2,$salida2["nombre"],$salida2["apellidos"]);
  24. }
  25. mysql_close();
  26. ?>
  27. </body>
  28. </html>

Hasta hay todo bien, el problema es la página que debe mostrar los titulares del autor.

CÓDIGO "autor.php":

  1. <html>
  2. <body>
  3. <?
  4. $base="*****";
  5. $usuario="*****";
  6. $pass="*****";
  7. $tabla="ARTICULOS";
  8. $tabla2="AUTORES";
  9. $conexion=mysql_connect("localhost",$usuario,$pass);
  10. mysql_select_db($base,$conexion);
  11. $resultado=mysql_query("SELECT A.id, B.id, A.titulo, A.texto FROM $tabla A, $tabla2 B WHERE A.id=B.id IN (SELECT id, nombre, apellidos FROM AUTORES WHERE nombre=$nombre AND apellidos=$apellidos)");
  12. while ($salida=mysql_fetch_array($resultado))
  13. {
  14. $enlace="titular.php?cod=".$salida["A.id"];
  15. printf("<a href= '%s'> %s </a>",$enlace,$salida["A.titulo"]);
  16. printf("<br>");
  17. printf("<p> %s </p>",$salida["A.texto)"]);
  18. }
  19. mysql_close();
  20. ?>
  21. </body>
  22. </html>

ERROR:

"Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /var/www/periodico/autor.php on line 15"

El problema está en la llmada a la base de datos:

BASE DE DATOS:

La logística de la base de datos es la siguiente:

De las tablas que componen la base de datos, 2 son las que nos interesan: ARTICULOS y AUTORES.

  • ARTICULOS: (formado por)
    • id (int con autoincremento)
    • titulo
    • texto
  • AUTORES:(formado por)
    • id (int con autoincremento)
    • nombre
    • apellidos

¿Qué tiene que devolvernos SELECT?:

Yo os lo digo, porque el problema no es el qué, si no el cómo:

  1. Para mostrar los titulares correspondiente al autor, MySQL debe resolver qué ids son de dicho autor.
  2. La id del autor cohinciden con la id del titular, (ARTICULOS.id=AUTORES.id, para que nos entendamos) ya que se incrementan a la vez (En el formulario se introducen el titulo, texto, apellido y nombre al mismo tiempo), comprobado.
  3. Se debe de obtener las ids de AUTORES discriminando los que no cohinciden con $nombre y $apellidos (variables pasadas por "titular.php" en modo enlace, he comprobado que los pasa correctamente :-)).
  4. Una vez MySQL obtiene las ids de la tabla AUTORES que si cohinciden con las variables, debe de obtenerse de la tabla ARTICULOS los campos titulo y texto cuya id sea igual a las ids obtenidas en AUTORES.

Pensaba que la subconsulta que he hecho en la linea 15 del código daria resultado. Primero optiene las id concretada en la subconsulta y después compara las ids, pero está claro que no es correcto. O igual el problema está dentro del While.

¿Álguien me puede ayudar?

He probado muchas maneras y no doy con "la tecla".

Muuuuuuuchas gracias por adelantado.

 

------------------------------------------------------------------------------------------------

Los conocimientos adquiridos, mueren contigo. No los destruyas, difundelos.

Imagen de joseluis
+1
0
-1

¿Realmente necesitas la subselect?
¿No te vale con:?

$resultado=mysql_query("SELECT A.id, B.id, A.titulo, A.texto FROM $tabla A, $tabla2 B
WHERE A.id=B.id AND B.nombre=$nombre AND B.apellidos=$apellidos");

O bien si tiene que ser una subselect ¿no debería ser así:?

$resultado=mysql_query("SELECT A.id, B.id, A.titulo, A.texto FROM $tabla A, $tabla2 B
WHERE A.id=B.id AND B.id IN (SELECT id FROM AUTORES WHERE nombre=$nombre AND apellidos=$apellidos)");

Fdo. El forense asesino alias Censor fundamentalista.

+1
0
-1

Fdo. Forense asesino, Censor fundamentalista, Fustigador de novatos y Patético maleducado

Imagen de d4v1d
+1
0
-1

 Veras la primera opción ya la probé y no funcionó.

Pero la segunda no.

Te lo digo enseguida. 

 

-------------------------------------------------------------------------------------------

Los conocimientos adquiridos, mueren contigo. No los destruyas, difundelos.

+1
0
-1

 

 

------------------------------------------------------------------------------------------- 

Los conocimientos adquiridos, mueren contigo. No los destruyas, difundelos.

Imagen de d4v1d
+1
0
-1

 Pues va a ser que no.

La segunda opción no funciona.

Pero gracias. 

 

-------------------------------------------------------------------------------------------

Los conocimientos adquiridos, mueren contigo. No los destruyas, difundelos.

+1
0
-1

 

 

------------------------------------------------------------------------------------------- 

Los conocimientos adquiridos, mueren contigo. No los destruyas, difundelos.

Imagen de joseluis
+1
0
-1

Prueba a utilizar alias para las columnas ya que no se que tal se comportara mysql_fetch_array con dos columnas del mismo nombre (sino me equivoco el A. y el B. no los utiliza para el array que genera).
Tambien puedes probar a poner una sola columna (al fin y al cabo B.id no la estas mostrando).

Por ejemplo:

$resultado=mysql_query("SELECT A.id AS id_articulo, B.id AS id_autor, A.titulo, A.texto 
FROM $tabla A, $tabla2 B WHERE A.id=B.id AND B.id IN 
(SELECT id, nombre, apellidos FROM AUTORES WHERE nombre=$nombre AND apellidos=$apellidos)");

while ($salida=mysql_fetch_array($resultado))
{
 $enlace="titulo.php?cod=".$salida["id_articulo"];

 printf("<a href= '%s'> %s </a>",$enlace,$salida["titulo"]);
 printf("<br>");
 printf("<p> %s </p>",$salida["texto)"]);
}

o en la opcion sin subselect

$resultado=mysql_query("SELECT A.id AS id_articulo, B.id AS id_autor, A.titulo, A.texto 
FROM $tabla A, $tabla2 B WHERE A.id=B.id AND B.nombre=$nombre AND B.apellidos=$apellidos");

while ($salida=mysql_fetch_array($resultado))
{

 $enlace="titulo.php?cod=".$salida["id_articulo"];

 printf("<a href= '%s'> %s </a>",$enlace,$salida["titulo"]);
 printf("<br>");
 printf("<p> %s </p>",$salida["texto)"]);
}

Edito por un problemilla con los <


Fdo. El forense asesino alias Censor fundamentalista.

+1
0
-1

Fdo. Forense asesino, Censor fundamentalista, Fustigador de novatos y Patético maleducado

Imagen de d4v1d
+1
0
-1

 Que va, dan ambos códigos error al nivel del While.

 ¿Alguna otra idea?

Voy a probar el or die(mysql_error());  que me propuso Maveras con tu código, a ver que tal.

-------------------------------------------------------------------------------------------

Los conocimientos adquiridos, mueren contigo. No los destruyas, difundelos.

+1
0
-1

 

 

------------------------------------------------------------------------------------------- 

Los conocimientos adquiridos, mueren contigo. No los destruyas, difundelos.

Imagen de joseluis
+1
0
-1

Tanto nombre como apellidos son campos de texto por lo que el valor debe ir entrecomillado pero puesto que estas utilizando la comilla doble (") para la cadena php donde escribes la query tendras que usar la comilla simple (') para encerrar el valor de nombre y apellidos -> '$nombre' '$apellidos'


Fdo. El forense asesino alias Censor fundamentalista.

+1
0
-1

Fdo. Forense asesino, Censor fundamentalista, Fustigador de novatos y Patético maleducado

Imagen de d4v1d
+1
0
-1

 No da error pero no muestra nada. La página queda en blanco.

$resultado=mysql_query("SELECT A.id, B.id, A.titulo, A.texto FROM $tabla A, $tabla2 B WHERE A.id=B.id AND B.id IN (SELECT id FROM AUTORES WHERE nombre='$nombre' AND apellidos='$apellidos')") or die(mysql_error());
            while ($salida=mysql_fetch_array($resultado))
            {
                $enlace="titulo.php?cod=".$salida["A.id"];

                printf("<a href= '%s'> %s </a>",$enlace,$salida["A.titulo"]);
                printf("<br>");
                printf("<p> %s </p>",$salida["A.texto)"]);
            }
 

 

-------------------------------------------------------------------------------------------

Los conocimientos adquiridos, mueren contigo. No los destruyas, difundelos.

+1
0
-1

 

 

------------------------------------------------------------------------------------------- 

Los conocimientos adquiridos, mueren contigo. No los destruyas, difundelos.

Imagen de Madveras
+1
0
-1

Puede que sea un error en la query (no la he mirado en detalle), yo lo que hago en estos casos es añadir al final de la consulta: or die(mysql_error());

Muchas veces el ver el error del mysql me ha ayudado a entcontrar que estaba fallando

 

la linea 13 quedaria así:

$resultado=mysql_query("SELECT A.id, B.id, A.titulo, A.texto FROM $tabla A, $tabla2 B WHERE A.id=B.id IN (SELECT id, nombre, apellidos FROM AUTORES WHERE nombre=$nombre AND apellidos=$apellidos)") or die(mysql_error());

 

Quiza sea por la tabla anidada, ... hasta hace no mucho mysql no aceptaba.. no se que version tendras del mysql... y muchas veces dan más probelmas que otra cosa (sobretodo de rendimiento del servidor),... prueba la opcion que te da joseluis

Saludos 

 

---

Madveras.- Ubuntu user #16060 - Linux user #450226
http://www.madveras.com

 

+1
0
-1

 

---

Madveras.- Ubuntu user #16060 - Linux user #450226
http://www.madveras.com

 

Imagen de d4v1d
+1
0
-1

 

Pues ésto:

  1. Ubuntu Gutsy
  2. apache2
  3. mysql-server (lo instale hace un mes por los repositorios, así que debe de ser la última)
  4. php5
  5. libapache2-mod-php5
  6. php5-gd
  7. php5-dom
  8. php5-pgsql
  9. php5-mysql
  10. phpmyadmin

Probare la comprobación de errores y si no me arroja luz sobre el asunto te informo.

Gracias.

 

-------------------------------------------------------------------------------------------

Los conocimientos adquiridos, mueren contigo. No los destruyas, difundelos.

+1
0
-1

 

 

------------------------------------------------------------------------------------------- 

Los conocimientos adquiridos, mueren contigo. No los destruyas, difundelos.

Imagen de Madveras
+1
0
-1

 sips, acepta tablas anidadas...

ya me diras a ver que sale.... ;)

---

Madveras.- Ubuntu user #16060 - Linux user #450226
http://www.madveras.com

 

+1
0
-1

 

---

Madveras.- Ubuntu user #16060 - Linux user #450226
http://www.madveras.com

 

Imagen de d4v1d
+1
0
-1

ERROR: 

" Unknown column 'David' in 'where clause'

Parece ser que cree que $nombre y supongo que $apellido es una columna.

si lo pongo:

$resultado=mysql_query("SELECT A.id, B.id, A.titulo, A.texto FROM $tabla A, $tabla2 B WHERE A.id=B.id AND B.id IN (SELECT id FROM AUTORES WHERE nombre="$nombre" AND apellidos="$apellidos")") or die(mysql_error());

 me muestra...

ERROR ("$nombre" "$apellidos"):

Parse error: syntax error, unexpected T_VARIABLE in /var/www/periodico/autor.php on line 13

Pasa se se un problema en el While a ser de $resultado .

-------------------------------------------------------------------------------------------

Los conocimientos adquiridos, mueren contigo. No los destruyas, difundelos.

+1
0
-1

 

 

------------------------------------------------------------------------------------------- 

Los conocimientos adquiridos, mueren contigo. No los destruyas, difundelos.

Imagen de joseluis
+1
0
-1

Prueba a encerrar $nombre y $apellidos entre comillas simples (dentro de la cadena).

$resultado=mysql_query("SELECT A.id, B.id, A.titulo, A.texto FROM $tabla A, $tabla2 B 
WHERE A.id=B.id AND B.id IN 
(SELECT id FROM AUTORES WHERE nombre='$nombre' AND apellidos='$apellidos')") or die(mysql_error());

Fdo. El forense asesino alias Censor fundamentalista.

+1
0
-1

Fdo. Forense asesino, Censor fundamentalista, Fustigador de novatos y Patético maleducado

Imagen de d4v1d
+1
0
-1

 Al poner las comillas simples no da error , pero no muestra nada. Se queda en blanco.

$resultado=mysql_query("SELECT A.id, B.id, A.titulo, A.texto FROM $tabla A, $tabla2 B WHERE A.id=B.id AND B.id IN (SELECT id FROM AUTORES WHERE nombre='$nombre' AND apellidos='$apellidos')") or die(mysql_error());
            while ($salida=mysql_fetch_array($resultado))
            {
                $enlace="titulo.php?cod=".$salida["A.id"];

                printf("<a href= '%s'> %s </a>",$enlace,$salida["A.titulo"]);
                printf("<br>");
                printf("<p> %s </p>",$salida["A.texto)"]);
            }
 

 

-------------------------------------------------------------------------------------------

Los conocimientos adquiridos, mueren contigo. No los destruyas, difundelos.

+1
0
-1

 

 

------------------------------------------------------------------------------------------- 

Los conocimientos adquiridos, mueren contigo. No los destruyas, difundelos.

Imagen de joseluis
+1
0
-1

Echa un vistazo a lo que te he puesto en otro comentario sobre los alias
Yo creo que en lugar de $salida["A.titulo"] deberias poner $salida["titulo"] (y asi con el resto) y para diferencias el id de la tabla A del de la B utiliza en la SELECT los alias de columnas ( A.id AS id_articulo, B.id AS id_autor) para luego referenciarlo como $salida["id_articulo"] en lugar de $salida["A.id"]


Fdo. El forense asesino alias Censor fundamentalista.

+1
0
-1

Fdo. Forense asesino, Censor fundamentalista, Fustigador de novatos y Patético maleducado

Imagen de d4v1d
+1
0
-1

         $resultado=mysql_query("SELECT A.id, B.id, A.titulo, A.texto FROM $tabla A, $tabla2 B WHERE A.id=B.id AND B.id IN (SELECT id FROM $tabla2 WHERE nombre='$nombre' AND apellidos='$apellidos')");
            while ($salida=mysql_fetch_array($resultado))
            {
                $enlace="titulo.php?cod=".$salida["id"];

                printf("<a href= '%s'> %s </a>",$enlace,$salida["titulo"]);
                printf("<br>");
                printf("<p> %s </p>",$salida["texto)"]);
            }

Lo he puesto así y:

  1. Muestra el titulo. OK
  2. Al pulsar en el enlace pasa la variable. OK
  3. No muestra el texto. :-( 

-------------------------------------------------------------------------------------------

Los conocimientos adquiridos, mueren contigo. No los destruyas, difundelos.

+1
0
-1

 

 

------------------------------------------------------------------------------------------- 

Los conocimientos adquiridos, mueren contigo. No los destruyas, difundelos.

Imagen de joseluis
+1
0
-1

No se si ha sido al escribirlo o en el foro o es que lo tienes mal pero has escrito $salida["texto)"]); cuando deberia ser $salida["texto"]); (sobra un parentesis dentro de las comillas).


Fdo. El forense asesino alias Censor fundamentalista.

+1
0
-1

Fdo. Forense asesino, Censor fundamentalista, Fustigador de novatos y Patético maleducado

Imagen de d4v1d
+1
0
-1

Menuda estupidez!!!

Era eso!!!

Si es que la desesperación no me dejaba ver ese detalle.

¡¡¡FUNCIONA!!!

joseluis, ¡eres el puto amo!, me as salvado el pellejo.

¡Te voy a poner una estatua en la plaza de mi pueblo!

Muuuuuuuuuuuuuuuuuuchas gracias ¡CAMPEON! :-)

 

-------------------------------------------------------------------------------------------

Los conocimientos adquiridos, mueren contigo. No los destruyas, difundelos.

+1
0
-1

 

 

------------------------------------------------------------------------------------------- 

Los conocimientos adquiridos, mueren contigo. No los destruyas, difundelos.

Imagen de Goyo
+1
0
-1

Ésta sí me la sé. Lo que has puesto como argumento de mysql_query no es una expresión válida. No puedes poner comillas dentro de una expresión entre comillas, no hay forma de que el analizador sintáctico entienda eso.

+1
0
-1
Imagen de d4v1d
+1
0
-1

CÓDIGO CORRECTO:

  1. <html>
  2. <body>
  3. <?
  4. $base="*****";
  5. $usuario="*****";
  6. $pass="*****";
  7. $tabla="ARTICULOS";
  8. $tabla2="AUTORES";
  9. $conexion=mysql_connect("localhost",$usuario,$pass);
  10. mysql_select_db($base,$conexion);
  11. $resultado=mysql_query("SELECT A.id, B.id, A.titulo, LPAD('',34,texto) FROM $tabla A, $tabla2 B WHERE A.id=B.id AND B.id IN (SELECT id FROM $tabla2 WHERE nombre='$nombre' AND apellidos='$apellidos')");
  12. while ($salida=mysql_fetch_array($resultado))
  13. {
  14. $enlace="titular.php?cod=".$salida["id"];
  15. printf("<a href= '%s'> %s </a>",$enlace,$salida["titulo"]);
  16. printf("<br>");
  17. printf("<p> %s </p>",$salida["LPAD('',34,texto)"]);
  18. }
  19. mysql_close();
  20. ?>
  21. </body>
  22. </html>

-------------------------------------------------------------------------------------------

Los conocimientos adquiridos, mueren contigo. No los destruyas, difundelos.

+1
0
-1

 

 

------------------------------------------------------------------------------------------- 

Los conocimientos adquiridos, mueren contigo. No los destruyas, difundelos.