fetchAll() PDO

Marco_88

Utente Attivo
4 Dic 2014
150
0
0
Roma
batwebit.blogspot.it
Ciao ragazzi già avevo chiesto aiuto precedentemente, ci riprovo.

Ho lanciato questa query con l'intento di unire le due chiavi primarie di queste due tabelle.
PHP:
			               if ($join = $PDO->prepare("SELECT id_product FROM products AS A LEFT JOIN accessi AS B ON A.id_product = B.id_accesso;")) {
			               
                           
			                      if ($join->execute())   {

$res = $join->fetchAll();


//funzione personalizzata di print_r
preize ($res)

Il risultato è questo.

Codice:
Array
(
    [0] => Array
        (
            [id_product] => 587
            [0] => 587
        )

    [1] => Array
        (
            [id_product] => 589
            [0] => 589
        )

    [2] => Array
        (
            [id_product] => 590
            [0] => 590
        )

    [3] => Array
        (
            [id_product] => 592
            [0] => 592
        )

    [4] => Array
        (
            [id_product] => 593
            [0] => 593
        )

.....etc etc

Perché vedo [0] come chiave anziché `id_accesso`?
 
PDO::fetchAll ti ritorna tutte le righe recuperate dalla query e l'indice della prima dimensione dell'array è rapportato a quelle.

Quanto al contenuto di ogni riga, ti ritrovi questi valori..
Codice:
    [3] => Array
        (
            [id_product] => 592
            [0] => 592
        )

..semplicemente perché, da documentazione, il metodo è impostato per ritornare i valori sia in indice numerico, sia con chiave.
Se vuoi che soltanto le chiavi siano presenti nell'array allora ti basterà indicarlo a PDO:
PHP:
$res = $join->fetchAll(PDO::FETCH_ASSOC);

A questo punto otterrai qualcosa di simile per ognuna delle righe recuperate:
Codice:
    [3] => Array
        (
            [id_product] => 592
        )

Il recordset ti viene ritornato in forma di array multidimensionale poiché puoi facilmente scorrerlo tramite un foreach in quel modo:
PHP:
foreach ($res as $row) {
    echo $row['id_product'];
}

L'elenco delle costanti che il fetchAll accetta lo puoi trovare nella documentazione del parametro fetch_style in questa pagina.
 
Ok per quanto riguarda gli argomenti di fetchAll. Mi sa che non ha preso la left join perché quando vado a fare il ciclo foreach su tutti gli elementi dell'array non stampa nulla, mentre se faccio il semplice il print_r vedo il contenuto della prima dimensione così come mi hai indicato.
Cosa posso fare per unire e verificare le due chiavi e mostrarle in output? Thanks
 
Se vuoi mostrare anche la seconda chiave devi prima di tutto selezionarla nella query:
Codice:
SELECT A.id_product, B.id_accesso FROM products AS A LEFT JOIN accessi AS B ON A.id_product = B.id_accesso

Occhio però che la seconda chiave può avere solo due valori: il primo è il valore della prima chiave quando viene soddisfatta la left join, il secondo è il valore NULL quando il record non viene trovato nella seconda tabella.

Quanto al problema che non riesci a stampare i dati, hai provato col foreach di esempio che ti ho scritto nel mio precedente post ? Se lo hai scritto in modo differente mi faresti vedere come ?
 
Ah ecco cosa mi mancava della query. Credevo che non prendesse l'altra tabella dopo il comando SELECT.

Adesso stampa questo:

Codice:
Array
(
    [0] => Array
        (
            [id_product] => 587
            [0] => 587
            [id_accesso] => 
            [1] => 
        )

    [1] => Array
        (
            [id_product] => 589
            [0] => 589
            [id_accesso] => 
            [1] => 
        )

    [2] => Array
        (
            [id_product] => 590
            [0] => 590
            [id_accesso] => 
            [1] => 
        )

    [3] => Array
        (
            [id_product] => 592
            [0] => 592
            [id_accesso] => 
            [1] => 
        )

etc...


Il foreach l'ho scritto esattamente come mi hai detto ma non stampa nulla, preize() invece sì.
 
Ultima modifica:
Se lo riesci a stampare in quel modo dovresti per forza riuscire a scorrerlo, sembra strano.
Prova così:
PHP:
if ($join = $PDO->prepare("SELECT A.id_product, B.id_accesso FROM products AS A LEFT JOIN accessi AS B ON A.id_product = B.id_accesso")) {

    if ($join->execute())   { 

        $res = $join->fetchAll(); 

        if (!empty($res)) {
        
            foreach ($res as $row) {
                echo 'id_product => ', $row['id_product'], "<br>\n";
                echo 'id_accesso => ', $row['id_accesso'], "<br>\n";
            }

        } else {
            echo 'Non ho trovato record';
        }
    }
}
 
PHP:
//preparo la query
			               if ($join = $PDO->prepare("SELECT id_product, id_accesso FROM products AS A LEFT JOIN accessi AS B ON A.id_product = B.id_accesso;")) {
			                 
			               	
                          

                                  //se la prima query è stata eseguita procedo con la seconda
                           
			                      if ($join->execute())   {
			               	
			                      	 
		
			                         //creazione di un array dei risultati
			                         $res = $join->fetchAll();
			               
			                         //visualizzo il risultato
			                         
			                         //preize($res);
                                     foreach ($res as $row) {
                                     	echo 'id_product =>' . $row['id_product'] . '<br />';
                                     	echo 'id_accesso =>' . $row['id_accesso'] . '<br />';
                                     }

Facendo in questa maniera il risultato è questo.

Codice:
id_product =>587
id_accesso =>
id_product =>589
id_accesso =>
id_product =>590
id_accesso =>
 
Ultima modifica:
Si questo si. E' la mia join che non funziona :(

Unendo le due tabelle: products, che contiene circa una 30ina di colonne (compilate) e la tabella accessi, che contiene id_accesso come chiave primaria e una colonna "conta". Con il comando LEFT JOIN praticamente gli dico di mantenere intatta la tabella products e trovare tutte le corrispondenze nella tabella accessi, che di fatto non ci sono perché non sono state compilate ed è per questo che rimane vuoto il valore di id_accesso. gulp

Non va bene proprio il comando LEFT JOIN.
 
Ultima modifica:
Penso ci sia un po di confusione..

... trovare tutte le corrispondenze nella tabella accessi, che di fatto non ci sono perché non sono state compilate ed è per questo che rimane vuoto il valore di id_accesso.

E' questo il motivo per cui non visualizzi nessun "id_accesso", nel senso che nella tua tabella accessi non esiste nessun record che abbia il campo "id_accesso" con lo stesso valore del campo "id_product" della tabella products.

La left join funziona benissimo in tal senso, peché per suo funzionamento le righe della tabella products verranno ritornate anche se non c'è una corrispondenza nell'altra tabella.

Se vuoi invece che non ti venga visualizzato nulla quando non vi sono corrispondenze in entrambe le tabelle, dovresti usare una INNER JOIN.
 
Non va bene per quello che desidero fare io. Vorrei vedere il seguente il risultato:

Codice:
id_product =>587
id_accesso => 587
id_product =>589
id_accesso => 589
id_product =>590
id_accesso =>590

Adesso sto tentando con gli INSERT e UPDATE e mi sono fermato con una subquery che però mi da errore di sintassi.

PHP:
$join = $PDO->prepare("SELECT FROM product WHERE id_product IN (SELECT id_accesso FROM accesso);"))
 
Prima di arrivare al risultato bisogna capire una cosa: nelle due tabelle coinvolte, products e accessi, ci sono dei record che corrispondano alla ricerca che vuoi fare ?

Perché, come dimostra questo fiddle, in se l'istruzione funziona.
 
Visual_SQL_JOINS_orig.jpg
mi permetto di allegare una tabella che ho trovato in rete (non ricordo dove)
magari aiuta ....
ciao
Marino
 
@flameseeker, come dicevo prima capisco perfettamente come funziona la LEFT JOIN (e funziona) il punto è che l'altra tabella accessi è vuota.

Vi allego le foto così non rischiamo di fraintenderci.

Tabella products
Schermata 2015-04-21 alle 14.23.39.jpg


Tabella accessi

Schermata 2015-04-21 alle 14.23.24.jpg

In altre parole devo copiare tutti gli id_product della tabella products nella colonna id_accesso della tabella accessi.
 
Ultima modifica:

Discussioni simili