Come visualizzare dei valori in modo allineato da un dabatase con PHP e MySQL

  • Creatore Discussione Creatore Discussione Garaux
  • Data di inizio Data di inizio

Garaux

Utente Attivo
24 Feb 2013
50
0
0
Ciao,
settimana scorsa ho postato un messaggio in cui chiedevo supporto per la visualizzazione in modo orizzontale di alcuni valori da un database.
Ora ho un'altra gatta da pelare.
In breve...

Ho creato un database con MySQL in cui figurano diverse tabelle relazionate tra di loro.
La tabella principale è denominata article in cui figurano tutti gli articoli associati agli autori, alle categorie e a diverse lingue.

La tabella article è così formata:
ID article_name author_id

La tabella autori
ID author_name
è relazionata con la tabella article.

Mentre questa è la tabella lang
ID lang_name
Per associare ad ogni articolo una o più lingue ho creato una tabella di lookup denominata
lookuplang
articleID langID

I valori vegono visualizzati così:
[table="width: 500"]
[tr]
[td]Articolo[/td]
[td]Lingua[/td]


[/tr]
[tr]
[td]Primo articolo[/td]
[td]Italiano[/td]
]
[/tr]

[tr]
[td]Primo articolo[/td]
[td]Inglese[/td]

[/tr]


[tr]
[td]Primo articolo[/td]
[td]Tedesco[/td]

[/tr]

[tr]
[td]Primo articolo[/td]
[td]Francese[/td]

[/tr]

[tr]
[td]Secondo articolo[/td]
[td]Italiano[/td]

[/tr]
[/table]


Mentre io vorrei poterli visualizzare in questa maniera:
[table="width: 500"]
[tr]
[td]Articolo[/td]
[td]Lingua 1[/td]
[td]Lingua 2 [/td]
[td]Lingua 3 [/td]
[td]Lingua 4 [/td]
[/tr]
[tr]
[td]Primo articolo[/td]
[td]Italiano[/td]
[td]Inglese[/td]
[td]Tedesco[/td]
[td]Francese[/td]
[/tr]

[tr]
[td]Primo articolo[/td]
[td]Italiano[/td]

[/tr]

[/table]

Ecco il codice utilizzato:
PHP:
//CREAZIONE QUERY
<?php
try { 
     
  $query_sql = 'SELECT article_name, author_name, lang_name FROM article  
                INNER JOIN author 
                ON article.author_id = author.id 
        inner join lookuplang 
                on article.id = lookuplang.articleID                              
                inner join lang 
                on langID = lang.id 
        ORDER BY article.id ASC'; 
                
  
      $result = $GLOBALS['pdo']->query($query_sql); 
} 


//VISUALIZZAZIONE RECORD 
foreach($result as $row) { 
    $valori[] = array('article_name'=>$row['article_name'],'author_name'=>$row['author_name'], 'lang_name'=>$row['lang_name']); 
} 
include 'test.html.php'; 

?>




<?php foreach($valori as $lista):?> 
<?php 
$lingua = $lista['lang_name'] . ': Status'; 
?> 
<tr> 
<td> <?php echo $lista['article_name']?></td> 
<td> <?php echo $lista['lang_name']?></td> 

  
   
 </tr> 
<?php endforeach?></table>

Potresti darmi una mano?

Grazie!
 
Hai cambiato idea su come organizzare la tabella finale?
Ma devi solo visualizzare oppure hai proprio bisogno di ottenerlq con la query la tabella finale che desideri?
Perché se lo devi solo visualizzare con php fai subito.
 
Ciao, la visualizzazione in orizzontale la utilizzo per altri valori.
Io vorrei visualizzare i valori delle lingue come mostrato nella tabella con la query.
Dici che con PHP farei subito...in che modo?
Grazie
 
Ti basta visualizzarle così?
Allora puoi sostituire l'ultima parte:
PHP:
<?php
$lingua="";
foreach($valori as $lista):
if($lingua!=$lista['lang_name']){
$lingua = $lista['lang_name']; 
echo "<tr><td>".$lista['article_name']."</td>";
}
echo "<td>".$lista['lang_name']."</td>";
endforeach?></table>
 
Ciao, purtroppo questa stringa mi restituisce questo:

Primo articolo English English
Qurto articolo Italian
Secondo articolo English English
Terzo articolo French

Tieni presente che nel prim articolo c'è Italiano, Inglese, Tedesco e Francese, cosi come nel secondo.
E invece mi stampa solo due volte la lingua Inglese.
 
Ho fatto un po' di confusione:
PHP:
<?php
$nome="";
foreach($valori as $lista):
if($nome!=$lista['article_name']){
$nome = $lista['article_name']; 
echo "<tr><td>".$lista['article_name']."</td>";
}
echo "<td>".$lista['lang_name']."</td>";
endforeach?></table>
 
Ultima modifica:
Ciao, mi sembra che sia lo stesso codice con l'unica differenza della variabile nome.
 
Ultima modifica:
Sì, ma non funziona...la variabile lingua non è definita
Notice: Undefined variable: nome in C:\EasyPHP\www\progetti\CMS\versione_stabile\frontend\test.html.php on line 103
 
Sì, ho fatto così, ma invece di ottenere questo risultato

Articolo Lingua 1 Lingua 2 Lingua 3 Lingua 4
Primo articolo Italiano Inglese Tedesco Francese
Primo articolo Italiano

ottengo questo

Primo articolo English English
Qurto articolo Italian
Secondo articolo English English
Terzo articolo French

Il primo articolo dovrebbe stampare Italiano, Inglese, Tedesco e Francese, cosi come il secondo.
E invece mi stampa solo due volte la lingua Inglese.

La query sql è sempre la stessa:
PHP:
//CREAZIONE QUERY
<?php
try { 
     
  $query_sql = 'SELECT article_name, author_name, lang_name FROM article  
                INNER JOIN author 
                ON article.author_id = author.id 
        inner join lookuplang 
                on article.id = lookuplang.articleID                              
                inner join lang 
                on langID = lang.id 
        ORDER BY article.id ASC'; 
                
  
      $result = $GLOBALS['pdo']->query($query_sql); 
} 


//VISUALIZZAZIONE RECORD 
foreach($result as $row) { 
    $valori[] = array('article_name'=>$row['article_name'],'author_name'=>$row['author_name'], 'lang_name'=>$row['lang_name']); 
} 
include 'test.html.php'; 

?>
 
Sicuro che hai messo il codice dell'ultimo post?
Ho fatto una prova e a me funziona perfettamente.
 
Sì, ho inserito il codice nel file che visualizza i valori.
Lo script funziona, ma non produce la tabella che vorrei, ovvero:

[table="width: 500"]
[tr]
[td]Articolo[/td]
[td]Lingua A[/td]
[td]Lingua B[/td]
[td]Lingua C[/td]
[td]Lingua D[/td]
[/tr]
[tr]
[td]Primo articolo[/td]
[td]Italiano[/td]
[td]Inglese[/td]
[td]Tedesco[/td]
[td]Francese[/td]
[/tr]
[tr]
[td]Secondo articolo[/td]
[td]Italiano[/td]
[/tr]
[tr]
[td][/td]
[td][/td]
[/tr]
[tr]
[td][/td]
[td][/td]
[/tr]
[/table]

Il risultato che ottengo, al contrario, è:

[table="width: 500"]
[tr]
[td]Articolo[/td]
[td]Lingua A[/td]
[td]Lingua B[/td]
[td]Lingua C[/td]
[td]Lingua D[/td]
[/tr]
[tr]
[td]Primo articolo[/td]
[td]Inglese[/td]
[td]Inglese[/td]
[/tr]
[tr]
[td]Secondo articolo[/td]
[td]Italiano[/td]
[/tr]
[tr]
[td][/td]
[td][/td]
[/tr]
[tr]
[td][/td]
[td][/td]
[/tr]
[/table]

Non c'è un modo per isolare ciascuna lingua direttamente dalla matrice $lista['lang_name']?
Ovviamente se volessi estrarre $lista['lang_name'][0] mi darebbe I per l'italiano F per il francese etc...
 
In teoria potresti stampare già in quel ciclo senza usare l'altro come in questo esempio:
PHP:
//CREAZIONE QUERY 
<?php 
try {  
      
  $query_sql = 'SELECT article_name, author_name, lang_name FROM article   
                INNER JOIN author  
                ON article.author_id = author.id  
        inner join lookuplang  
                on article.id = lookuplang.articleID                               
                inner join lang  
                on langID = lang.id  
        ORDER BY article.id ASC';  
                 
   
      $result = $GLOBALS['pdo']->query($query_sql);  
}  

$articolo="";
//VISUALIZZAZIONE RECORD  
foreach($result as $row) {  
if($articolo!=$row[article_name]){
  $articolo= $row[article_name];
  echo "<tr><td>".$row['article_name']."</td>";
}  
echo "<td>".$row['lang_name']."</td>";
}
include 'test.html.php';  

?>
 
Ho provato entrambe le cose ma non visualizza i valori come vorrei.
Io vorrei che tutti i valori contenuti nella tabella lingue, ovvero tutte le lingue relazionate con gli articoli, venissero visualizzate così:

[table="width: 500"]
[tr]
[td]Articolo[/td]
[td]Lingue a[/td]
[td]Lingue b[/td]
[td]Lingue c[/td]
[td]Lingue d[/td]
[/tr]
[tr]
[td]Primo articolo[/td]
[td]Inglese[/td]
[td]Italiano[/td]
[td]Tedesco[/td]
[td]Francese[/td]
[/tr]
[tr]
[td]Secondo articolo[/td]
[td]Inglese[/td]
[td]Italiano[/td]
[td]Tedesco[/td]
[td]Francese[/td]
[/tr]
[/table]

E invece gli script che ho provato visualizzano cosi:
[table="width: 500"]
[tr]
[td]Articolo[/td]
[td]Lingue a[/td]
[td]Lingue b[/td]
[td]Lingue c[/td]
[td]Lingue d[/td]
[/tr]
[tr]
[td]Primo articolo[/td]
[td]Inglese[/td]



[/tr]
[tr]
[td]Secondo articolo[/td]
[td]Inglese[/td]

[/tr]
[/table]

Praticamente i valori contenuti nella tabella lingue non vengono visualizzati, ma solo il primo id Inglese.
 
Tieni presente però che la tabella lingue, che ha un tipo di relazione uno a molti, è associata alla tabella articoli con una tabella di lookup.
 
A me va bene. Non ho usato pdo però, prova a fare un:
PHP:
print_r($result);
E dimmi cosa ti esce fuori.
 
Ciao, mi esce questo:
PDOStatement Object ( [queryString] => SELECT article_name, online_date, offline_date, date_month, date_year, article.id, author.author_name, group_concat(lang_name) FROM article INNER JOIN author ON article.author_id = author.id inner join lookuplang on article.id = lookuplang.articleID inner join lang on langID = lang.id GROUP BY article_name )
 

Discussioni simili