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`?
 

flameseeker

Utente Attivo
27 Nov 2013
699
0
0
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.
 

Marco_88

Utente Attivo
4 Dic 2014
150
0
0
Roma
batwebit.blogspot.it
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
 

flameseeker

Utente Attivo
27 Nov 2013
699
0
0
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 ?
 

Marco_88

Utente Attivo
4 Dic 2014
150
0
0
Roma
batwebit.blogspot.it
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:

flameseeker

Utente Attivo
27 Nov 2013
699
0
0
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';
        }
    }
}
 

Marco_88

Utente Attivo
4 Dic 2014
150
0
0
Roma
batwebit.blogspot.it
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:

Marco_88

Utente Attivo
4 Dic 2014
150
0
0
Roma
batwebit.blogspot.it
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:

flameseeker

Utente Attivo
27 Nov 2013
699
0
0
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.
 

Marco_88

Utente Attivo
4 Dic 2014
150
0
0
Roma
batwebit.blogspot.it
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);"))
 

flameseeker

Utente Attivo
27 Nov 2013
699
0
0
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.
 

marino51

Utente Attivo
28 Feb 2013
3.204
207
63
Lombardia
Visual_SQL_JOINS_orig.jpg
mi permetto di allegare una tabella che ho trovato in rete (non ricordo dove)
magari aiuta ....
ciao
Marino
 

Marco_88

Utente Attivo
4 Dic 2014
150
0
0
Roma
batwebit.blogspot.it
@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
Autore Titolo Forum Risposte Data
T foreach e fetchAll dove recupero solo l'ultimo record PHP 5
L pdo (stampare un valore con ritorno a funzione) PHP 0
K [PHP] PDO.bindingParam PHP 2
M [PHP] Interrompere DROP TABLE con PDO PHP 0
M [PHP] Alternativa a datagrid con PDO PHP 6
M [PHP] Creare un menu a tendina con pdo PHP 18
M [PHP] Array di array - PDO PHP 2
3_g errore con mysql insert in PDO PHP 29
W [PHP] Creazione classe PDO PHP 4
F PHP, PDO e visualizzazioni errori e/o eccezioni PHP 3
3_g [PHP] mvc, pdo e classi... PHP 7
F Help-PDO copiare Database MySQL PHP 3
F php PDO mysql connessione(select_db) PHP 3
Fredyss redirect a altra pagina php dopo commit su postgresql con PDO PHP 1
K Non trovo l'errore! PDO MYSQL UPDATE PHP 2
C [PHP] PDO prepared statement - select query errore PHP 7
ANDREA20 [PHP] Errore $this->db_connection = new PDO PHP 0
CristianB72 Non riesco a connettermi al DB tramite PDO Database 10
MarcoGrazia [PHP][PDO][MySQL] Non registra ma non da nemmeno errori. PHP 0
MarcoGrazia [PHP][PDO] Come connettersi al database Snippet PHP 0
MarcoGrazia [PDO][PHP[MySQL] Piccolo modulo di ricerca in un sito tramite l'operatore LIKE Snippet PHP 1
neo996sps [PHP e funzioni con PDO] Funzione per generare corpo tabella PHP 1
D Paginazione dati PDO PHP 8
N Problemi estrazione / visualizzazione immagini dal database con PDO PHP 2
R Organizzazione PHP Mysql PDO PHP 15
M PDO e mysqli PHP 1
MarcoGrazia [PDO][MySQL] L'update non avviene PHP 1
MarcoGrazia [PDO] insert che non inserisce e non da errori PHP 1
Monital PDO e connessioni a più database PHP 4
Monital Da mysql a PDO PHP 3
S PDO accertarsi del avvenimento della query PHP 1
voldemort PHP PDO: non c'ho capito niente PHP 1
L [RISOLTO]PDO if per "non ci sono dati" PHP 8
L pdo e sistema crud PHP 1
L Paginazione con pdo. PHP 8
L pdo con login PHP 2
L PDO : bindParam PHP 3
L login con pdo/mysql PHP 2
S Problema di login con PDO PHP 2
B Esercizio PDO PHP 20
B Pdo PHP 6
S Meglio mysqli o PDO ? PHP 2
borgo italia query con PDO PHP 11
borgo italia classe pdo PHP 9
M PDO prepare PHP 1
L da mysql a pdo PHP 4

Discussioni simili