Precedente :: Successivo |
Autore |
Messaggio |
frons Mortale devoto
Registrato: 08/11/07 11:31 Messaggi: 14 Residenza: Ancona
|
Inviato: 17 Dic 2007 23:13 Oggetto: PHP tabelle e MySQL |
|
|
Salve, ho un problema che non riesco a risolvere e che mi dà un sacco di rogne. Ho due (in realtà sono di più ma ne posto solo due tanto le relazioni che le legano sono sempre le stesse) tabelle su db MySQL:
Codice: | CREATE TABLE `autori` (
`id` int(2) NOT NULL auto_increment,
`nome` varchar(255) default NULL,
`nazione_id` int(3) default NULL,
`genere_id` int(3) default NULL,
`web` varchar(255) default NULL,
`email` varchar(255) default NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;
CREATE TABLE `dischi` (
`id` int(2) NOT NULL auto_increment,
`autore_id` int(2) default NULL,
`titolo` varchar(255) default NULL,
`data` date default NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
|
Le due tabelle come si può vedere sono "collegate" dalla relazione autore_id = autori.id
In una pagina con un form di ricerca seleziono da un menù posso scegliere filtrare i dati per utente ($aim), per stringa di ricerca ($seachstring) o per tutte e due le cose:
Codice: | $select = 'SELECT DISTINCT id, titolo, data, autore_id';
$from = ' FROM dischi';
$where = ' WHERE 1=1'; //condizione sempre vera eventualmente da implementare sotto
$aid = $_POST['aid'];
if ($aid != '') { // Un autore è stato selezionato nel form perché $aid non è vuota
$where .= " AND autore_id='$aid'";
}
$searchtext = $_POST['searchtext'];
if ($searchtext != '') { // E' stata selezionata una ricerca su stringa visto che $searchtext non è vuota
$where .= " AND titolo LIKE '%$searchtext%'";
} |
Passo poi tutto alla pagina successiva che costruisce la tabella:
Codice: | $dischi= @mysql_query($select . $from . $where);
if (!$dischi) {
echo '</table>';
exit('<p>Errore!<br />'.
'Errore: ' . mysql_error() . '</p>');
}
while ($disc= mysql_fetch_array($dischi)) {
echo "<tr valign='top'>\n";
$id = $disco['id'];
$titolo= htmlspecialchars($disco['titolo']);
$data= $disco['data'];
$autore_id = htmlspecialchars($disco['autore_id']);
echo "<td>$autore_id</td>\n";
echo "<td>$titolo</td>\n";
echo "<td>$data</td>\n";
echo "</tr>\n";
} |
Premetto che funziona tutto, ma vorrei capire come posso fare, una volta formatasi e popolatasi la tabella, ottenere al posto del valore INT di autore_id quello testuale VARCHAR di autori.nome
Questa è una mia grossa lacuna e sarei contentissimo se riusciste a farmi degli esempi pratici, così che possa capire bene!!
|
|
Top |
|
|
SverX Supervisor Macchinisti
Registrato: 25/03/02 11:16 Messaggi: 11566 Residenza: Tokelau
|
Inviato: 18 Dic 2007 10:05 Oggetto: Re: PHPe MySQL |
|
|
frons ha scritto: | vorrei capire come posso fare, una volta formatasi e popolatasi la tabella, ottenere al posto del valore INT di autore_id quello testuale VARCHAR di autori.nome |
Nella query devi mettere in join le due tabelle attraverso i due campi preposti, in questo modo
Codice: | SELECT d.id, titolo, data, nome
FROM dischi d INNER JOIN autori a ON d.autore_id=a.id |
a quel punto leggi in una variabile il campo così, come gli altri
Codice: | $autore = htmlspecialchars($disco['nome']); |
|
|
Top |
|
|
frons Mortale devoto
Registrato: 08/11/07 11:31 Messaggi: 14 Residenza: Ancona
|
Inviato: 18 Dic 2007 12:13 Oggetto: Re: PHPe MySQL |
|
|
SverX ha scritto: | Codice: | SELECT d.id, titolo, data, nome
FROM dischi d INNER JOIN autori a ON d.autore_id=a.id |
|
Scusa l'ignoranza, ma queste d e a da cosa derivano? |
|
Top |
|
|
Franto Semidio
Registrato: 14/06/05 15:05 Messaggi: 367 Residenza: como (provincia)
|
Inviato: 18 Dic 2007 12:42 Oggetto: Re: PHPe MySQL |
|
|
frons ha scritto: |
Scusa l'ignoranza, ma queste d e a da cosa derivano? |
SverX ha scritto: | Codice: | SELECT d.id, titolo, data, nome
FROM dischi d INNER JOIN autori a ON d.autore_id=a.id |
|
nella seconda riga dici che la tabbela autori la chimi a
e la tabella dischi la chiami d
e quando scrivi ad esempio gli dici prendi il campo id della tabella d
ecc ecc |
|
Top |
|
|
frons Mortale devoto
Registrato: 08/11/07 11:31 Messaggi: 14 Residenza: Ancona
|
Inviato: 18 Dic 2007 13:37 Oggetto: |
|
|
Un paio di cose non mi sono ancora chiare:
1) l'indice nome da $autore = htmlspecialchars($disco['nome']) da cosa lo tiro fuori? Non saprei dove fare un altro while...
2) quando vado ad assegnare a $data i suoi valori $data = $disco['data'] qual'è la sintassi per far si che in output la data esca in questa forma: dd/mm/yy ?
|
|
Top |
|
|
SverX Supervisor Macchinisti
Registrato: 25/03/02 11:16 Messaggi: 11566 Residenza: Tokelau
|
Inviato: 18 Dic 2007 14:35 Oggetto: |
|
|
frons ha scritto: | l'indice nome da $autore = htmlspecialchars($disco['nome']) da cosa lo tiro fuori? Non saprei dove fare un altro while... |
nello stesso while, leggi tutti i campi del record
frons ha scritto: | quando vado ad assegnare a $data i suoi valori $data = $disco['data']qual'è la sintassi per far si che in output la data esca in questa forma: dd/mm/yy ? |
Codice: | $data = date ("d/m/y",$disco['data']); |
per dettagli sulla funzione date() guarda qui |
|
Top |
|
|
frons Mortale devoto
Registrato: 08/11/07 11:31 Messaggi: 14 Residenza: Ancona
|
Inviato: 18 Dic 2007 16:24 Oggetto: |
|
|
Grazie mille a tutti: adesso mi è tutto più chiaro (anche se nell'output della data, se metto la funzione date, mi restituisce 01/01/1970 come risultato) |
|
Top |
|
|
SverX Supervisor Macchinisti
Registrato: 25/03/02 11:16 Messaggi: 11566 Residenza: Tokelau
|
Inviato: 18 Dic 2007 17:04 Oggetto: |
|
|
frons ha scritto: | Grazie mille a tutti: adesso mi è tutto più chiaro (anche se nell'output della data, se metto la funzione date, mi restituisce 01/01/1970 come risultato) |
prova a cambiare la query in
Codice: | SELECT d.id, titolo, UNIX_TIMESTAMP(data), nome
FROM dischi d INNER JOIN autori a ON d.autore_id=a.id |
|
|
Top |
|
|
frons Mortale devoto
Registrato: 08/11/07 11:31 Messaggi: 14 Residenza: Ancona
|
Inviato: 18 Dic 2007 18:32 Oggetto: |
|
|
Così non mi cambiava nulla, allora ho fatto in un'altra maniera poco elegante sicuramente, ma il risultato è quello voluto.
Grazie ancora! |
|
Top |
|
|
SverX Supervisor Macchinisti
Registrato: 25/03/02 11:16 Messaggi: 11566 Residenza: Tokelau
|
Inviato: 19 Dic 2007 12:48 Oggetto: |
|
|
frons ha scritto: | ho fatto in un'altra maniera poco elegante sicuramente, ma il risultato è quello voluto. |
Illustracela comunque |
|
Top |
|
|
frons Mortale devoto
Registrato: 08/11/07 11:31 Messaggi: 14 Residenza: Ancona
|
Inviato: 19 Dic 2007 14:22 Oggetto: |
|
|
Tabella NEWS
Codice: | CREATE TABLE `news` (
`id` int(3) NOT NULL auto_increment,
`titolo` varchar(255) default NULL,
`data` date NOT NULL default '0000-00-00',
`corpo` varchar(255) default NULL,
`link` varchar(255) default NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ; |
E query su essa e ho fatto in modo di farmi generare delle variabili in base agli indici di $news["data"] (non so bene la terminologia):
Codice: |
$query1 = "SELECT * FROM news ORDER BY id DESC";
$risultato1 = mysql_query($query1) or die("");
while ($news = mysql_fetch_array($risultato1, MYSQL_ASSOC)) {
$data_news = $news["data"];
$anno = $data_news[0].$data_news[1].$data_news[2].$data_news[3];
$mese = $data_news[5].$data_news[6];
$giorno = $data_news[8].$data_news[9];
$data_news = mktime(0,0,0,$mese,$giorno,$anno); |
Così facendo mi è bastato fare solamente un print
Codice: | <?php print date("d/m/Y", $data_news)?> |
ed eventualmente avevo già subito a disposizione una variabile $anno se, per ipotesi, avessi voluto riportare solamente l'anno, invece di tutta la data per esteso. Problemi non me ha dati, errori nemmeno, magari sembra un po' incasinato però funziona... |
|
Top |
|
|
SverX Supervisor Macchinisti
Registrato: 25/03/02 11:16 Messaggi: 11566 Residenza: Tokelau
|
Inviato: 19 Dic 2007 15:28 Oggetto: |
|
|
in pratica hai riscritto la funzione strtotime()
la stessa cosa:
Codice: | print date("d/m/Y", strtotime($news["data"]) ); |
|
|
Top |
|
|
|