SQLSTATE[HY093]: Invalid parameter number: parameter was not defined ? Perchè secondo voi?

otto9due

Utente Attivo
22 Feb 2014
552
21
28
Bungiorno a tutti hocercato nel forum ed ho trovato una discussione simile ma non uguale al mio probema.
Sono due giorni che cerco una soluzione a questa cosa apparentemente molto banale.
SI tratta di una select INNER JOIN tra due tabelle con un WHERE.
PHP:
$sql = 'SELECT prodotti.nome, prodotti.prezzo, prodotti.sku, prodotti.produttore, fornitori.nome
                FROM prodotti INNER JOIN fornitori
                ON prodotti.fornitori_id = fornitori.id
                WHERE prodotti.id = :prodotti.id';
         
$id = 1; // per esempio
         
$stmt = $this->db->prepare($sql);
$stmt->bindParam(':prodotti.id', $id, PDO::PARAM_INT);
$stmt->execute();

$results = $stmt->fetchAll(PDO::FETCH_ASSOC);

$prodlist[$id] = $results;
         
var_dump($prodlist);

Se la eseguo ricevo questo errore :
Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in........
Mi sembra che l'errore sta nel WHERE e din modo particolare leggendo online ho scoperto che potrebbe essere un problema fare questo: WHERE prodotti.id = prodotti.id';
suggeriscono di fare ad esempio: WHERE prodotti.id = :id'; e poi nel bindparam stessa cosa $stmt->bindParam(':id', $id, PDO:: PARAM_INT);
in effetti facenso così funziona a metà, nel senso che mi restituisce i dati detta prima tabella 'prodotti' ignorando la seconda 'fornitori'.
Qualcuno sa dirmi dove sbaglio? Grazie

P.S. Aggiungo che come da immagine allegata sotto, se la provo sul db (senza bidding) funziona..
 

Allegati

  • localhost.png
    localhost.png
    73,4 KB · Visite: 18
Ultima modifica:

marino51

Utente Attivo
28 Feb 2013
3.072
195
63
Lombardia
credo che dia fastidio il punto nel nome del placeholder,
in questa pagina
trovi,
Note that PDO supports positional (?) and named placeholders, the latter always begins from a colon and can be written using letters, digits and underscores only. Also note that no quotes have to be ever used around placeholders.
 
  • Like
Reactions: otto9due

otto9due

Utente Attivo
22 Feb 2014
552
21
28
Grazie, grazie e ancora grazie mille per l'aiuto, è da due giorni che provo e riprovo incessantemente. In effetti questa mattina, cosa che mi hai confermato con quanto hai scritto, ho fatto in modo che nell'alias si elimini il punto lasciando ad esempio "prodottiid" quando viene bindato ed in effetti funziona, ma mi restituisce solo la colonna prodotti, ignorando totalmente quella fornitori. Puó essere che c'è qualcosa che disturba anche li? La cosa strana è che quella parte dell'inner join non è bindata. Puó essere il contenuto di on?


Inviato dal mio iPhone utilizzando Tapatalk
 

otto9due

Utente Attivo
22 Feb 2014
552
21
28
Ho fatto qualche altra prova, in generale con la soluzione proposta sopra la query funziona. Unica cosa, che mi ha fatto perdere un sacco di tempo era il nome della colonna nome (uguale per fornitori e prodotti) se sono uguali mette solo il primo anche se lo faccio precedere dalla tabella es: prodotti.nome e anche fornitori.nome prende solo il primo.
C'è un modo per fixare questa cosa o mi tocca sostituire i nomi delle tabelle? Grazie
 

marino51

Utente Attivo
28 Feb 2013
3.072
195
63
Lombardia
quando hai nomi uguali nelle tabelle, devi indicare la tabella e per differenziare il risultato puoi usare un alias
esempio,
SELECT
prodotti.nome as Pnome,
fornitori.nome as Fnome

il primo risultato ti sarà restituito nella colonna Pnome ed il secondo nella colonna Fnome
senza dover modificare la struttura del database
 

otto9due

Utente Attivo
22 Feb 2014
552
21
28
quando hai nomi uguali nelle tabelle, devi indicare la tabella e per differenziare il risultato puoi usare un alias
esempio,
SELECT
prodotti.nome as Pnome,
fornitori.nome as Fnome

il primo risultato ti sarà restituito nella colonna Pnome ed il secondo nella colonna Fnome
senza dover modificare la struttura del database

Perfetto funziona alla grande.
Grazie tante per il prezioso supporto.


Inviato dal mio iPhone utilizzando Tapatalk
 
Ultima modifica:

Discussioni simili