[Pregunta]: ¿Como muestro el siguiente resultado?

Iniciado por Leguim, 19 Octubre 2019, 06:00 AM

0 Miembros y 1 Visitante están viendo este tema.

Leguim

Bueno quería saber como puedo acceder a el siguiente resultado que me arroja una consulta SQL

Código (php) [Seleccionar]

$query = $con->prepare('SELECT n.id_notification, u1.name, u2.name FROM notifications n INNER JOIN users u1 ON n.id_emitter = u1.id_user INNER JOIN users u2 ON n.id_user = u2.id_user');


Hice un var_dump a la variable que contiene los resultados que devuelve la consulta.

Código (php) [Seleccionar]

array(1) { [0]=> array(5) { ["id_notification"]=> string(1) "1" [0]=> string(1) "1" ["name"]=> string(6) "Miguel" [1]=> string(5) "Ramon" [2]=> string(6) "Miguel" } }
1


Para intentar a acceder a los dos nombres que se guardan que según entiendo sería así:

Código (php) [Seleccionar]

$results[0]['name'] // Va a devolver 'Miguel'
$results[0][1]['name'] // Esperaba que devuelva Ramon pero devuelve 'R'
$results[0][2]['name'] // Esperaba que devuelva Miguel pero devuelve 'M'


La idea era hacerlo sin tener que usar "AS"

engel lex

recomiendo el var_dump verlo como codigo fuente o usar un echo "<pre>"; antes para que se imprima como texto preformateado, ya que lo estás leyendo mal

el var_dump es
array(1) {
 [0]=> array(5) {
   ["id_notification"]=> string(1) "1"
   [0]=> string(1) "1"
   ["name"]=> string(6) "Miguel"
   [1]=> string(5) "Ramon"
   [2]=> string(6) "Miguel"
 }
}


ojo, para evitar esos problemas la mejor practica es usar siempre AS, no pierdes nada

e ignoro como no te devuelve error con $results[0][1]['name']
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

MinusFour

Yo creo que el problema aquí es más con PHP que con la base de datos. Tienes dos campos que se llaman "name" y los drivers que hay de MySQL en PHP tipicamente sobreescriben el valor en la columna repetida, no expanden la columna a un arreglo que contenga todos los valores de la columna con el mismo nombre. Hasta donde yo se, no hay forma de cambiar este comportamiento. Por eso necesitas usar un ALIAS con "AS" para evitar la colisión de las columnas.

O simplemente usas los indices en lugar de los nombres de las columnas:

Código (php) [Seleccionar]

$results[0][1]; //Ramon
$results[0][2]; //Miguel'


Cita de: engel lex en 19 Octubre 2019, 07:06 AM
e ignoro como no te devuelve error con $results[0][1]['name']

Devuelve un warning, pero no es un error fatal.

CitarAdvertencia
Escribir en un índice fuera del rango rellenará el string con espacios. Los tipos que no sean integer son convertidos a integer. Los índices ilegales emiten un error de nivel E_NOTICE. Los índices negativos emiten un error de nivel E_NOTICE en la escritura, aunque se lea un string vacío. Sólo se emplea el primer carácter de un string asignado. La asignación de un string vacío asigna un byte NULL.

https://www.php.net/manual/es/language.types.string.php#language.types.string.substr

Edit: La documentación en español discrepa con la de ingles, en la que dice que es E_WARNING. Probablemente un cambio en alguna version.

Leguim

Muchas gracias a los dos, ya todo funciona correctamente!