1054 - Unknown column 'p.products_id' in 'on clause'

Postate qui discussioni di carattere generale riguardo a problemi di installazione e configurazione di osCommerce

Moderatore: mod Generali

duketrt
membro Baby
membro Baby
Messaggi: 63
Iscritto il: 14/11/2005, 15:55

1054 - Unknown column 'p.products_id' in 'on clause'

Messaggio da duketrt »

Purtroppo questa volta la ricerca nei post precedenti non mi ha aiutato per nulla...

Il problema che mi ritrovo e' il seguente.
Se guardo nelle categorie dei prodotti all'interno di una categoria sia che essa sia vuota o che sia popolata, allo stesso modo se vado dalla lista dei produttori direttamente su uno di questo, se effettuo una ricerca... insomma un po' ovunque mi ritrovo il classico messaggio di query:

1054 - Unknown column 'p.products_id' in 'on clause'

Purtroppo sono ancora agli inizi e non ho ancora capito come capire dal semplice link in che file siano ubicate le giuste query. ho cercato un po' i vari file per cercare una di tali query ma non ho trovato nulla al fine di correggerla.
Suggerimenti da voi esperti?
Grazie in anticipo :)
duketrt
membro Baby
membro Baby
Messaggi: 63
Iscritto il: 14/11/2005, 15:55

Messaggio da duketrt »

mhh mi sto scervellando un po' ma non trovo sta soluzione a livello mysql la query da proprio errore:

select count(p.products_id) as total from products p, products_description pd, manufacturers m left join specials s on p.products_id = s.products_id where p.products_status = '1' and pd.products_id = p.products_id and pd.language_id = '4' and p.manufacturers_id = m.manufacturers_id and m.manufacturers_id = '10'
(una di esempio di quelle generate)

se invece pero' faccio fare la semplice left join anche mysql non restituisce l'errore:
select * as total from products p left join specials s on p.products_id = s.products_id where 1

E' proprio errarata la sintassi della query per come effettuare la left join di quella serie di tabelle con la tabella special...

Sto usando Mysql 5.0.15
duketrt
membro Baby
membro Baby
Messaggi: 63
Iscritto il: 14/11/2005, 15:55

Messaggio da duketrt »

la query corretta sarebbe
select count(p.products_id) as total from( (products p join products_description pd)join manufacturers m) left join specials s on p.products_id = s.products_id where ......
adesso quello che mi chiedo nessuno ha avuto questo problema?
e sopratutto dove trovo tutte le query quando si guardano le liste dei prodotti dalla sotto categoria, le ricerche per manufactor, e quelle del motore di ricerca perche' a quanto pare capita ovunque e quindi devo modificarmele tutte :D
E la cosa assurda e' che essendo un count e' solo per ottenere un risultato numero di conto dei "risultati" trovati...
duketrt
membro Baby
membro Baby
Messaggi: 63
Iscritto il: 14/11/2005, 15:55

Messaggio da duketrt »

Mhhh ho provato a reinstallare tutto da capo una versione "pulita" per vedere se il prob stava in qualche modulo da me installato ed invece nulla anche la versione "vergine" da lo stesso problema... a sto punto mi sa che e' un problema di incopatibilita' con mysql 5 possibile???
Bass
membro Master
membro Master
Messaggi: 3593
Iscritto il: 18/04/2004, 0:00
Località: Varese
Contatta:

Messaggio da Bass »

duketrt ha scritto:M a sto punto mi sa che e' un problema di incopatibilita' con mysql 5 possibile???
Potrebbe essere, sinceramente non l'ho mai provato con mysql 5 ma in genere i problemi strani vengono fuori dalle nuove versioni di mysql o del php

'iao

Sergio
http://www.oscomtemplate.com - E' disponibile il nuovo pacchetto free con forum di supporto

http://www.semilandia.it
duketrt
membro Baby
membro Baby
Messaggi: 63
Iscritto il: 14/11/2005, 15:55

Messaggio da duketrt »

Domani provero' a modificare un po' le query... anche se non ho bene capito dove avviene questa query ad inizio di ogni parte di visione del catalogo.
Pensavo in application_top.php ma non trovato query di count del numero di prodotti poi ho visto che e' includes/modules/product_listing.php a gestire la schermata che mi mostra l'errore ma anche li niente query di count che non siano le onnipresenti count(*)... per effettuare i test di controllo di database... domani con piu' calma con ci daro' un occhio.
Bass
membro Master
membro Master
Messaggi: 3593
Iscritto il: 18/04/2004, 0:00
Località: Varese
Contatta:

Messaggio da Bass »

duketrt ha scritto: ho visto che e' includes/modules/product_listing.php a gestire la schermata che mi mostra l'errore ma anche li niente query di count che non siano le onnipresenti count(*)...
La product_listing viene richiamata da index.php

'iao

Sergio
http://www.oscomtemplate.com - E' disponibile il nuovo pacchetto free con forum di supporto

http://www.semilandia.it
duketrt
membro Baby
membro Baby
Messaggi: 63
Iscritto il: 14/11/2005, 15:55

Messaggio da duketrt »

Si ero da quello che ci ero arrivato la pagina index e' stata a portarmi a quelle.... adesso vorrei capire dove sta questa benedetta query che non vedo query di count fatte come quella ma solo count(*)...
E poi.... e' sempre product_listing che viene richiamata a termine di una ricerca o a termine delle selezione di un produttore per generare la lista dei prodotti?
In caso affermativo modificando la query li dovrei risolvere il problema... almeno per quello che fino ad ora ho visto del programma perche' potrebbe comparire un problema simile ovunque se la sintassi della query non e' compatibile con mysql5....
mannaggia non ho piu' nemmeno un server con su mysql4 per poter provare se e' quello...
duketrt
membro Baby
membro Baby
Messaggi: 63
Iscritto il: 14/11/2005, 15:55

Messaggio da duketrt »

Ok evoluzione e' sempre il file split_page_result che si occupa di fare quella query:

Codice: Seleziona tutto

$count_query = tep_db_query("select count(" . $count_string . ") as total " . substr($this->sql_query, $pos_from, ($pos_to - $pos_from)));
e nel file index.php vengono generate le queri dove c'e' il afamigerato:

Codice: Seleziona tutto

left join " . TABLE_SPECIALS . " s on p.products_id
Ora da perfetto ignorante di come funzioni bene l'intero oscommerce, guardo questo codice da soli 2 giorni, provo a metterci mano e vediamo che ne viene fuori vi tengo aggiornati sempre che la cosa interessi.
Anche perche' se no questo thread e' solo come mio blocco di appunti per ricordarmi cosa sto facendo :P
Ahh ho trovato query simili pure in: advance_searc_result e new_products la cosa che mi fa' strano e' che i prodotti nel box del new product appaiono ma ripeto sono ancora troppo novizio di questo malloppo di codice per poter aver capito cosa fanno ogni singolo modulo.
Ciao e ringrazio chiunque legga e mi dia le proprie esperienze, strano che nessuno avesse riscontrato questo problema con mysql5 :)
duketrt
membro Baby
membro Baby
Messaggi: 63
Iscritto il: 14/11/2005, 15:55

Messaggio da duketrt »

continuo il mio work in progress ora ho risolto la vista dopo la scelta del produttore.

adesso ho corretto un altra query

Codice: Seleziona tutto

select count(p.products_id) as total from (((products_description pd join products p) left join manufacturers m on p.manufacturers_id = m.manufacturers_id) join products_to_categories p2c) left join specials s on p.products_id = s.products_id where...
che e e' quella che capita quando si sceglie una subcategorie e si dovrebbe avere la lista dei prodotti.
Ora la cerco e la sistemo...
duketrt
membro Baby
membro Baby
Messaggi: 63
Iscritto il: 14/11/2005, 15:55

Messaggio da duketrt »

ok ho risolto in parte ora devo sistemare le query per quello che riguarda le ricerche e le ricerche avanzate.
se interessa ecco come correggere il codice
file index.php:

Codice: Seleziona tutto

// BUG MYSQL5
// show the products of a specified manufacturer
    if (isset($HTTP_GET_VARS['manufacturers_id'])) {
      if (isset($HTTP_GET_VARS['filter_id']) && tep_not_null($HTTP_GET_VARS['filter_id'])) {
// We are asked to show only a specific category
        //$listing_sql = "select " . $select_column_list . " p.products_id, p.manufacturers_id, p.products_price, p.products_tax_class_id, IF(s.status, s.specials_new_products_price, NULL) as specials_new_products_price, IF(s.status, s.specials_new_products_price, p.products_price) as final_price from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_MANUFACTURERS . " m, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id where p.products_status = '1' and p.manufacturers_id = m.manufacturers_id and m.manufacturers_id = '" . (int)$HTTP_GET_VARS['manufacturers_id'] . "' and p.products_id = p2c.products_id and pd.products_id = p2c.products_id and pd.language_id = '" . (int)$languages_id . "' and p2c.categories_id = '" . (int)$HTTP_GET_VARS['filter_id'] . "'";
		$listing_sql = "select " . $select_column_list . " p.products_id, p.manufacturers_id, p.products_price, p.products_tax_class_id, IF(s.status, s.specials_new_products_price, NULL) as specials_new_products_price, IF(s.status, s.specials_new_products_price, p.products_price) as final_price from (((" . TABLE_PRODUCTS . " p join " . TABLE_PRODUCTS_DESCRIPTION . " pd) join " . TABLE_MANUFACTURERS . " m) join " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c) left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id where p.products_status = '1' and p.manufacturers_id = m.manufacturers_id and m.manufacturers_id = '" . (int)$HTTP_GET_VARS['manufacturers_id'] . "' and p.products_id = p2c.products_id and pd.products_id = p2c.products_id and pd.language_id = '" . (int)$languages_id . "' and p2c.categories_id = '" . (int)$HTTP_GET_VARS['filter_id'] . "'";
      } else {
// We show them all
        //$listing_sql = "select " . $select_column_list . " p.products_id, p.manufacturers_id, p.products_price, p.products_tax_class_id, IF(s.status, s.specials_new_products_price, NULL) as specials_new_products_price, IF(s.status, s.specials_new_products_price, p.products_price) as final_price from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_MANUFACTURERS . " m left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id where p.products_status = '1' and pd.products_id = p.products_id and pd.language_id = '" . (int)$languages_id . "' and p.manufacturers_id = m.manufacturers_id and m.manufacturers_id = '" . (int)$HTTP_GET_VARS['manufacturers_id'] . "'";
		$listing_sql = "select " . $select_column_list . " p.products_id, p.manufacturers_id, p.products_price, p.products_tax_class_id, IF(s.status, s.specials_new_products_price, NULL) as specials_new_products_price, IF(s.status, s.specials_new_products_price, p.products_price) as final_price from ((" . TABLE_PRODUCTS . " p join " . TABLE_PRODUCTS_DESCRIPTION . " pd) join " . TABLE_MANUFACTURERS . " m) left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id where p.products_status = '1' and pd.products_id = p.products_id and pd.language_id = '" . (int)$languages_id . "' and p.manufacturers_id = m.manufacturers_id and m.manufacturers_id = '" . (int)$HTTP_GET_VARS['manufacturers_id'] . "'";
      }
    } else {
// show the products in a given categorie
      if (isset($HTTP_GET_VARS['filter_id']) && tep_not_null($HTTP_GET_VARS['filter_id'])) {
// We are asked to show only specific catgeory
        //$listing_sql = "select " . $select_column_list . " p.products_id, p.manufacturers_id, p.products_price, p.products_tax_class_id, IF(s.status, s.specials_new_products_price, NULL) as specials_new_products_price, IF(s.status, s.specials_new_products_price, p.products_price) as final_price from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_MANUFACTURERS . " m, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id where p.products_status = '1' and p.manufacturers_id = m.manufacturers_id and m.manufacturers_id = '" . (int)$HTTP_GET_VARS['filter_id'] . "' and p.products_id = p2c.products_id and pd.products_id = p2c.products_id and pd.language_id = '" . (int)$languages_id . "' and p2c.categories_id = '" . (int)$current_category_id . "'";
		$listing_sql = "select " . $select_column_list . " p.products_id, p.manufacturers_id, p.products_price, p.products_tax_class_id, IF(s.status, s.specials_new_products_price, NULL) as specials_new_products_price, IF(s.status, s.specials_new_products_price, p.products_price) as final_price from (((" . TABLE_PRODUCTS . " p join " . TABLE_PRODUCTS_DESCRIPTION . " pd) join " . TABLE_MANUFACTURERS . " m) join " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c) left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id where p.products_status = '1' and p.manufacturers_id = m.manufacturers_id and m.manufacturers_id = '" . (int)$HTTP_GET_VARS['filter_id'] . "' and p.products_id = p2c.products_id and pd.products_id = p2c.products_id and pd.language_id = '" . (int)$languages_id . "' and p2c.categories_id = '" . (int)$current_category_id . "'";
      } else {
// We show them all
        //$listing_sql = "select " . $select_column_list . " p.products_id, p.manufacturers_id, p.products_price, p.products_tax_class_id, IF(s.status, s.specials_new_products_price, NULL) as specials_new_products_price, IF(s.status, s.specials_new_products_price, p.products_price) as final_price from " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_PRODUCTS . " p left join " . TABLE_MANUFACTURERS . " m on p.manufacturers_id = m.manufacturers_id, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id where p.products_status = '1' and p.products_id = p2c.products_id and pd.products_id = p2c.products_id and pd.language_id = '" . (int)$languages_id . "' and p2c.categories_id = '" . (int)$current_category_id . "'";
		$listing_sql = "select " . $select_column_list . " p.products_id, p.manufacturers_id, p.products_price, p.products_tax_class_id, IF(s.status, s.specials_new_products_price, NULL) as specials_new_products_price, IF(s.status, s.specials_new_products_price, p.products_price) as final_price from (((" . TABLE_PRODUCTS_DESCRIPTION . " pd join " . TABLE_PRODUCTS . " p) left join " . TABLE_MANUFACTURERS . " m on p.manufacturers_id = m.manufacturers_id) join " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c) left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id where p.products_status = '1' and p.products_id = p2c.products_id and pd.products_id = p2c.products_id and pd.language_id = '" . (int)$languages_id . "' and p2c.categories_id = '" . (int)$current_category_id . "'";
      }
    }
//FINE: BUG MYSQL5
ora mi chiedo per la ricerca avanzata e' advandec_search_result.php che si occupa di mostrare il risultato ma per quella normale?
inizia la nuova ricerca all'errore!
duketrt
membro Baby
membro Baby
Messaggi: 63
Iscritto il: 14/11/2005, 15:55

Messaggio da duketrt »

Continuo il mio monologo dicendo che ho risolto pure la ricerca.
File: advanced_search_result.php

Codice: Seleziona tutto

  //BUG MYSQL5
  //$from_str = "from " . TABLE_PRODUCTS . " p left join " . TABLE_MANUFACTURERS . " m using(manufacturers_id), " . TABLE_PRODUCTS_DESCRIPTION . " pd left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id, " . TABLE_CATEGORIES . " c, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c";
  $from_str = "from (((((" . TABLE_PRODUCTS . " p left join " . TABLE_MANUFACTURERS . " m using(manufacturers_id)) join " . TABLE_PRODUCTS_DESCRIPTION . " pd) left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id) join " . TABLE_CATEGORIES . " c) join " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c)";
pero', e questo pero' e' bello grosso, ho un bel dubbio infatti poche righe sotto c'e' una altra clausula di ricerca in aggiunta alla variabile $form_str

Codice: Seleziona tutto

$from_str .= " left join " . TABLE_TAX_RATES . " tr on p.products_tax_class_id = tr.tax_class_id left join " . TABLE_ZONES_TO_GEO_ZONES . " gz on tr.tax_zone_id = gz.geo_zone_id and (gz.zone_country_id is null or gz.zone_country_id = '0' or gz.zone_country_id = '" . (int)$customer_country_id . "') and (gz.zone_id is null or gz.zone_id = '0' or gz.zone_id = '" . (int)$customer_zone_id . "')";
che viene richiamata dal ciclo:

Codice: Seleziona tutto

  if ( (DISPLAY_PRICE_WITH_TAX == 'true') && (tep_not_null($pfrom) || tep_not_null($pto)) ) {
    if (!tep_session_is_registered('customer_country_id')) {
      $customer_country_id = STORE_COUNTRY;
      $customer_zone_id = STORE_ZONE;
    }
    $from_str .=.....
}
Ora devo capire quando entra in azione questo ciclo perche' la cosa e' problematica in quanto a risposta di questo ciclo dovrei avere un controllo per aggiungere a fronte della prima dichiarazione della variabile $from_str altre parentesi tonde...
devo bene capirla sta cosa...
duketrt
membro Baby
membro Baby
Messaggi: 63
Iscritto il: 14/11/2005, 15:55

Messaggio da duketrt »

Mhh proprio non capisco quando entra in quel ciclo qualsiasi ricerca faccio non mi da errore.... bhe meglio cosi' ma non vorrei che non capissi io quando dovrebbe capitare quella condizione.
Ciao, se avete idee o suggerimenti sono qui se no se vi capita di avere problemi come quelli che ho avuto io se avete mysql5 spero di esservi stato di aiuto per ora finisco il mio monologo di thread :)
Scusate se ho scritto cose inutili ma io ho sbattuto la testa per 10 ore di lavoro su sta cosa :)
Bass
membro Master
membro Master
Messaggi: 3593
Iscritto il: 18/04/2004, 0:00
Località: Varese
Contatta:

Messaggio da Bass »

duketrt ha scritto: Scusate se ho scritto cose inutili ma io ho sbattuto la testa per 10 ore di lavoro su sta cosa :)
Non hai per niente scritto cose inutili, mi dispiace non poterti aiutare ma non ho da nessuna parte mysql 5.
Credo che questo tuo monologo pero' servira' ad altre persone :wink:

'iao

Sergio
http://www.oscomtemplate.com - E' disponibile il nuovo pacchetto free con forum di supporto

http://www.semilandia.it
duketrt
membro Baby
membro Baby
Messaggi: 63
Iscritto il: 14/11/2005, 15:55

Messaggio da duketrt »

Ops avevo detto che per oggi smettevo ma mi tocca continuare ho fatto un po' di ricerche avanzate cercando left join all'interno di tutti i file di oscommerce e ne ho trovate divese inizio a segnare le correzioni.
File checkout_process.php

Codice: Seleziona tutto

        $stock_query_raw = "SELECT products_quantity, pad.products_attributes_filename 
                            FROM (" . TABLE_PRODUCTS . " p
                            LEFT JOIN " . TABLE_PRODUCTS_ATTRIBUTES . " pa
                             ON p.products_id=pa.products_id)
                            LEFT JOIN " . TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD . " pad
                             ON pa.products_attributes_id=pad.products_attributes_id
                            WHERE p.products_id = '" . tep_get_prid($order->products[$i]['id']) . "'";
e poi:

Codice: Seleziona tutto

          $attributes_query = "select popt.products_options_name, poval.products_options_values_name, pa.options_values_price, pa.price_prefix, pad.products_attributes_maxdays, pad.products_attributes_maxcount , pad.products_attributes_filename 
                               from ((" . TABLE_PRODUCTS_OPTIONS . " popt join " . TABLE_PRODUCTS_OPTIONS_VALUES . " poval) join " . TABLE_PRODUCTS_ATTRIBUTES . " pa) 
                               left join " . TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD . " pad
File products_new.php

Codice: Seleziona tutto

$products_new_query_raw = "select p.products_id, pd.products_name, p.products_image, p.products_price, p.products_tax_class_id, p.products_date_added, m.manufacturers_name from (" . TABLE_PRODUCTS . " p left join " . TABLE_MANUFACTURERS . " m on (p.manufacturers_id = m.manufacturers_id)) join " . TABLE_PRODUCTS_DESCRIPTION . " pd where p.products_status = '1' and p.products_id = pd.products_id and pd.language_id = '" . (int)$languages_id . "' order by p.products_date_added DESC, pd.products_name";
E' facile che questa non sia strettamente necessaria ma nel dubbio la ho sistemata lo stesso senza dubbio non e' un errore farlo.
Adesso pausa pranzo poi continuo a fixare il bug.
Ciao
Rispondi