Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Error en comentarios

Estas en el tema de Error en comentarios en el foro de PHP en Foros del Web. Hola a todos, les comento que estoy haciendo una lista de comentarios y creo que estoy haciendo algo mal. Tengo una tabla llamada notas, y ...
  #1 (permalink)  
Antiguo 15/01/2014, 14:54
Avatar de zreep  
Fecha de Ingreso: octubre-2009
Ubicación: Argentina
Mensajes: 534
Antigüedad: 14 años, 6 meses
Puntos: 12
Exclamación Error en comentarios

Hola a todos, les comento que estoy haciendo una lista de comentarios y creo que estoy haciendo algo mal.

Tengo una tabla llamada notas, y otra llamada comentarios. La tabla notas tiene un id (pr_id) y comentarios el id de las notas (id_notas). Pero me pide que defina comentario y se me ocurrio hacer una sola consulta, pero nose como... ahi el script

Código PHP:
$sql  = "SELECT * FROM notas ORDER BY pr_id DESC";
foreach ($con->query($sql) as $fila) {

$sqlc = "SELECT * FROM comentarios WHERE id_nota='pr_id'";
$cc = $fila['comentario'];

<?php echo $fila['notta']; ?><br />
<?php echo $cc ?>

}
Espero me ayuden y gracias
__________________
Zreep
  #2 (permalink)  
Antiguo 15/01/2014, 15:18
Avatar de Lecquio  
Fecha de Ingreso: mayo-2004
Ubicación: Asturias, España
Mensajes: 948
Antigüedad: 20 años
Puntos: 34
Respuesta: Error en comentarios

Con una sola consulta sería así:

Código:
SELECT * FROM notas n, comentarios c WHERE c.id_nota=n.pr_id
Te da fallo porque estas buscando un campo comentario en la tabla de notas y no lo hay en esa tabla.
  #3 (permalink)  
Antiguo 15/01/2014, 15:18
Avatar de zreep  
Fecha de Ingreso: octubre-2009
Ubicación: Argentina
Mensajes: 534
Antigüedad: 14 años, 6 meses
Puntos: 12
Respuesta: Error en comentarios

Bueno hice algo que pensaba y me salio bien. Consulto dos tablas a la vez...

Código PHP:
$sql  "SELECT * FROM notas,comentarios ORDER BY pr_id DESC"
Pero tengo otro problema, los comentatios se listan hasta en las notas que no tienen comentarios... Como puedo resolver esto?
__________________
Zreep
  #4 (permalink)  
Antiguo 15/01/2014, 15:19
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Error en comentarios

Puedes hacer ambas consultas en una sola, además, $con->query($sql) devuelve un conjunto de resultados, no un array para que intentes iterarlo. Podrías hacer la consulta de esta manera:

Código MySQL:
Ver original
  1.         notas A
  2.         comentarios B
  3.         A.pr_id = B.id_nota
  4.         A.pr_id DESC

Luego, creas un array asociativo con el conjunto de resultados de la consulta, lo iteras e imprimes los datos:

Código PHP:
Ver original
  1. $consulta = $con->query("SELECT * FROM notas A INNER JOIN comentarios B ON A.pr_id = B.id_nota ORDER BY A.pr_id DESC");
  2.  
  3. //Siempre comprueba que la consulta haya encontrado datos
  4. if ($consulta->num_rows) {
  5.     //Aquí creas el array asociativo y lo iteras
  6.     while ($datos = $consulta->fetch_array()) {
  7.         echo "Comentario: " . $datos["comentario"] . "<br />";
  8.         echo "Nota: " . $datos["nota"] . "<br /><br />";
  9.     }
  10.  
  11.     //Tampoco olvides liberar a la memoria de los resultados de la consulta
  12.     $consulta->free();
  13. }
  14. else
  15.     echo "No se obtuvieron datos de la consulta";
  16.  
  17. //Cuando ya no necesites hacer consultas a la BD, cierra la conexión
  18. $con->close();

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Última edición por Alexis88; 15/01/2014 a las 15:28
  #5 (permalink)  
Antiguo 15/01/2014, 16:29
Avatar de zreep  
Fecha de Ingreso: octubre-2009
Ubicación: Argentina
Mensajes: 534
Antigüedad: 14 años, 6 meses
Puntos: 12
Respuesta: Error en comentarios

Gracias a los dos, pero me da este error: Notice: Undefined property: PDOStatement::$num_rows in...

Lo estoy probando y lo voy a modificar respecto a lo aprendido... y por su puesto, compartirlo...
__________________
Zreep
  #6 (permalink)  
Antiguo 15/01/2014, 16:34
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Error en comentarios

Ah caray, estás trabajando con PDO, pensé que lo hacías con Mysqli en el estilo orientado a objetos. Adecua el código a PDO, la lógica es la misma.
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #7 (permalink)  
Antiguo 15/01/2014, 16:45
Avatar de zreep  
Fecha de Ingreso: octubre-2009
Ubicación: Argentina
Mensajes: 534
Antigüedad: 14 años, 6 meses
Puntos: 12
Respuesta: Error en comentarios

Ahi lo voy modificando pero, solo me da como resultado las notas que tienen comentario...

Código PHP:
$sql $con->query("SELECT * FROM notas A INNER JOIN comentario B ON A.pr_id = B.id_nota ORDER BY A.pr_id DESC");
if (
$sql->execute(array())) {
    
//Aquí creas el array asociativo y lo iteras
    
while ($fila $sql->fetch()) { 
Nose si el execute tiene que reemplazar al query y tampoco que poner en el array...
__________________
Zreep
  #8 (permalink)  
Antiguo 15/01/2014, 17:07
Avatar de zreep  
Fecha de Ingreso: octubre-2009
Ubicación: Argentina
Mensajes: 534
Antigüedad: 14 años, 6 meses
Puntos: 12
Respuesta: Error en comentarios

Ahi quite el if...

Código PHP:
$sql $con->query("SELECT * FROM notas A INNER JOIN comentario B ON A.pr_id = B.id_nota ORDER BY A.pr_id DESC");
    while (
$fila $sql->fetch()) { 
pero nose como hacer para que aparezcan todos los comentario...
__________________
Zreep
  #9 (permalink)  
Antiguo 15/01/2014, 17:16
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Error en comentarios

Como estás trabajando con PDO, la figura cambia un poco, pero la lógica se mantiene.

Código PHP:
Ver original
  1. $sql = $con->query("SELECT * FROM notas A INNER JOIN comentario B ON A.pr_id = B.id_nota ORDER BY A.pr_id DESC");
  2. foreach ($sql as $datos) {
  3.     echo "Comentario: " . $datos["comentario"] . "<br />";
  4.     echo "Nota: " . $datos["nota"] . "<br /><br />";
  5. }

O así:

Código PHP:
Ver original
  1. $sql = $con->prepare("SELECT * FROM notas A INNER JOIN comentario B ON A.pr_id = B.id_nota ORDER BY A.pr_id DESC");
  2. $sql->execute();
  3.      
  4. for($i=0; $datos = $sql->fetch(); $i++){
  5.     echo "Comentario: " . $datos["comentario"] . "<br />";
  6.     echo "Nota: " . $datos["nota"] . "<br /><br />";
  7. }
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #10 (permalink)  
Antiguo 15/01/2014, 17:21
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Error en comentarios

Cita:
Iniciado por zreep Ver Mensaje
Ahí lo voy modificando pero, solo me da como resultado las notas que tienen comentario
Claro, esa es la idea de dicha query.
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #11 (permalink)  
Antiguo 15/01/2014, 17:22
Avatar de zreep  
Fecha de Ingreso: octubre-2009
Ubicación: Argentina
Mensajes: 534
Antigüedad: 14 años, 6 meses
Puntos: 12
Respuesta: Error en comentarios

Gracias Alexis88, pero lo que no logro es que me muestre todos los comentario...
__________________
Zreep
  #12 (permalink)  
Antiguo 15/01/2014, 17:25
Avatar de zreep  
Fecha de Ingreso: octubre-2009
Ubicación: Argentina
Mensajes: 534
Antigüedad: 14 años, 6 meses
Puntos: 12
Respuesta: Error en comentarios

Es mas sospecho que es la consulta donde esta el problema...

Código PHP:
$sql $con->prepare("SELECT * FROM notas A INNER JOIN comentarios B ON A.pr_id = B.id_nota ORDER BY A.pr_id DESC"); 
Osea , en el select
__________________
Zreep
  #13 (permalink)  
Antiguo 15/01/2014, 17:26
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Error en comentarios

¿Quieres que se muestren todos los comentarios o solamente los que están relacionados a las notas?, porque lo segundo es lo que intentabas hacer con tu segunda consulta:

Código MySQL:
Ver original
  1. SELECT * FROM comentarios WHERE id_nota = 'pr_id'

Decide qué datos deseas obtener para elaborar la consulta.
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #14 (permalink)  
Antiguo 15/01/2014, 17:36
Avatar de zreep  
Fecha de Ingreso: octubre-2009
Ubicación: Argentina
Mensajes: 534
Antigüedad: 14 años, 6 meses
Puntos: 12
Respuesta: Error en comentarios

En realidad quiero ver todas las notas y sus respectivos comentario. Lo que veo es que al cambiar la consulta ve solo las notas que tienen comentarios y el resto no.
__________________
Zreep
  #15 (permalink)  
Antiguo 15/01/2014, 17:54
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Error en comentarios

Inténtalo con un LEFT JOIN:

Código MySQL:
Ver original
  1.         notas A
  2.         comentarios B
  3.         A.pr_id = B.id_nota
  4.         A.pr_id DESC
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #16 (permalink)  
Antiguo 15/01/2014, 17:56
Avatar de zreep  
Fecha de Ingreso: octubre-2009
Ubicación: Argentina
Mensajes: 534
Antigüedad: 14 años, 6 meses
Puntos: 12
Respuesta: Error en comentarios

Sos un groso que es LEFT JOIN... funciona... je
__________________
Zreep
  #17 (permalink)  
Antiguo 15/01/2014, 18:01
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Error en comentarios

Supongamos que tenemos los conjuntos A y B, compuestos por los siguiente elementos:

A: {4, 12, 7, 9}
B: {3, 9, 5, 4}


Con el LEFT JOIN, tomamos solamente a los elementos del conjunto A, pero como habrás visto en la consulta, hay una condición que dice ON A.pr_id = B.id_nota, que aplicado a este ejemplo, busca la intersección de ambos conjuntos, por lo que el resultado contiene a todos los elementos del conjunto A y a los elementos del conjunto B que se encuentren en el conjunto A. Por eso es que puedes ver todas las notas y solamente los comentarios que tengan una nota relacionada. En el ejemplo, se mostrarían todos los elementos del conjunto A, es decir: 4, 12, 7 y 9, siendo además el 4 y el 9, elementos del conjunto B.

Este gráfico lo explica mejor:


No te olvides de marcar el tema como solucionado.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #18 (permalink)  
Antiguo 15/01/2014, 18:51
Avatar de zreep  
Fecha de Ingreso: octubre-2009
Ubicación: Argentina
Mensajes: 534
Antigüedad: 14 años, 6 meses
Puntos: 12
Respuesta: Error en comentarios

Alexis88 eres un genio. Gracias. Te voy a pedir algo ultimo, si me puedes aclarar porque pasa que cuando hay dos comentarios en una misma nota, la nota se repite y agrega el nuevo comentario en vez de agregar el comentario dejabo. Me explico?

ejemplo: esta mal:

nota: hola a todo
comen: hola a ti tambien

nota: hola a todos
comen: Hola se escribe con H

ejemplo: esta bien

nota: hola a todo
comen: Hola se escribe con H
comen: hola a ti tambien

PD: Habia ido a comer.. :)
__________________
Zreep
  #19 (permalink)  
Antiguo 15/01/2014, 19:40
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Error en comentarios

Puedes concatenar los comentarios correspondientes a cada nota y agruparlos por nota.

Código MySQL:
Ver original
  1. SELECT A.*, GROUP_CONCAT(B.comentario) AS coment
  2.         notas A
  3.         comentarios B
  4.         A.pr_id = B.id_nota
  5.         A.pr_id
  6.         A.pr_id DESC

Con GROUP_CONCAT, concatenas todos los elementos que indicas entre los paréntesis y que agrupas al final de la consulta con GROUP BY, en donde especificamos que el campo pr_id de la tabla notas, será el dato bajo el que se agruparán los comentarios.

Y como ahora tienes los comentarios agrupados y con comas como separadores, o bien los muestras así, con comas, o los extraes de ese agrupamiento y los imprimes fila por fila, por ejemplo:

Código PHP:
Ver original
  1. for($i = 0; $datos = $sql->fetch(); $i++){
  2.     echo "Nota: " . $datos["nota"] . "<br />";
  3.     if (strlen($datos["coment"])){
  4.         echo "Comentarios: <br />";
  5.         echo "- " . str_replace(",", "<br />- ", $datos["coment"]);
  6.     }
  7.     echo "<br /><br />";
  8. }

El resultado sería este:

Código HTML:
Ver original
  1. Nota: Nota 1
  2. Comentarios:
  3. - Comentario 1 de Nota 1
  4. - Comentario 2 de Nota 1
  5.  
  6. Nota: Nota 2
  7. Comentarios:
  8. - Comentario 1 de Nota 2
  9.  
  10. Nota: Nota 3
  11. Comentarios:
  12. - Comentario 1 de Nota 3
  13. - Comentario 2 de Nota 3
  14. - Comentario 3 de Nota 3

Con la función str_replace, reemplazo todas las comas que separan a los comentarios por saltos de línea y guiones, para así imprimirlos como una lista de comentarios. Los comentarios solamente se mostrarán si la extensión de los mismo es mayor a cero, es decir, si existen comentarios, lo cual compruebo con la función strlen.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Última edición por Alexis88; 16/01/2014 a las 13:16
  #20 (permalink)  
Antiguo 16/01/2014, 13:45
Avatar de zreep  
Fecha de Ingreso: octubre-2009
Ubicación: Argentina
Mensajes: 534
Antigüedad: 14 años, 6 meses
Puntos: 12
Respuesta: Error en comentarios

Hola Alexis88, gracias por la gran ayuda que me haz dado. Modifique el codigo y tambien la consulta...

Código PHP:
SELECT *, GROUP_CONCAT(B.comentario) AS coment 
Quite "A." ya que cuando llamaba otro dato me pedia que lo defina.

Deje el codigo como estaba antes, pero solo cambien la consulta. Habia que agrupar los resultado. Igualmente las funciones que me enseñaste me sirvieron. No las conocia.

Pero note que la funcion str_replace me resumia los comentarios y por la quite.


Gracias nuevamente.
__________________
Zreep
  #21 (permalink)  
Antiguo 16/01/2014, 13:56
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Error en comentarios

No era necesario que quites la A, ese A.* era para tomar únicamente a todos los elementos de la tabla A que es la de las notas, de la forma en que lo haces ahora, toma todos los elementos de ambas tablas, lo cual es innecesario para este caso. Sería interesante ver el código final, por cierto, str_replace no acorta las cadenas, algo más debes haber hecho y no te diste cuenta.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #22 (permalink)  
Antiguo 16/01/2014, 15:36
Avatar de zreep  
Fecha de Ingreso: octubre-2009
Ubicación: Argentina
Mensajes: 534
Antigüedad: 14 años, 6 meses
Puntos: 12
Respuesta: Error en comentarios

Lo deje asi:

Código PHP:
echo str_replace(",","<br>",$fila['coment']); 
Pienso que es el salto de linea. Pero nose que poner ahi...
__________________
Zreep
  #23 (permalink)  
Antiguo 16/01/2014, 16:42
Avatar de zreep  
Fecha de Ingreso: octubre-2009
Ubicación: Argentina
Mensajes: 534
Antigüedad: 14 años, 6 meses
Puntos: 12
Respuesta: Error en comentarios

"Con la función str_replace, reemplazo todas las comas que separan a los comentarios por saltos de línea y guiones..."

Me doy cuenta que al ingresar comentarios con comas o guiones o salto de lineas, los borra y lo que hace con las comas es hacer un salto de linea. Suena raro pero hace eso... tendria que ponerme a buscar otra funcion...


Gracias...
__________________
Zreep
  #24 (permalink)  
Antiguo 16/01/2014, 20:06
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Error en comentarios

El concatenador natural de GROUP_CONCAT es la coma, pero puedes especificar uno, por ejemplo, el símbolo | anteponiendo la palabra SEPARATOR y cuando hagas el reemplazo por el salto de línea y el guión, indicas que lo haga por ese símbolo.

Código MySQL:
Ver original
  1. SELECT A.*, GROUP_CONCAT(B.comentario SEPARATOR '|') AS coment
  2.         notas A
  3.         comentarios B
  4.         A.pr_id = B.id_nota
  5.         A.pr_id
  6.         A.pr_id DESC

Código PHP:
Ver original
  1. echo "- " . str_replace("|", "<br />- ", $datos["coment"]);

Los resultados se imprimirán así:

Código HTML:
Ver original
  1. Nota: Nota 1
  2. Comentarios:
  3. - Comentario 1, de Nota 1
  4. - Comentario 2, de Nota 1
  5.  
  6. Nota: Nota 2
  7. Comentarios:
  8. - Comentario 1, de Nota 2
  9.  
  10. Nota: Nota 3
  11. Comentarios:
  12. - Comentario 1, de Nota 3
  13. - Comentario 2, de Nota 3
  14. - Comentario 3, de Nota 3

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Etiquetas: comentarios, select, sql, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:28.