Archiv für: Mai 2008

23.05.08

 
Permalink 17:14:12, Kategorien: blade the bofh  

Oscommerce auf php5/mysql5

Alte Oscommerce Installationen, so wie die ChaosCompany sie einsetzt haben einige mit php5 und mysql5. Unter anderem erhält man wenn man eine Kategorie aufruft anstatt der gewünschten Artikel folgende Fehlermeldung:

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

select count(p.products_id) as total from products_description pd, products p left join manufacturers m on p.manufacturers_id = m.manufacturers_id, products_to_categories p2c left join 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 = '4' and p2c.categories_id = '75'

[TEP STOP]

oder diese Fehlermeldung wenn man die Suchfunktion benuzt:

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

select count(distinct p.products_id) as total from products p left join manufacturers m using(manufacturers_id), products_description pd left join specials s on p.products_id = s.products_id, categories c, products_to_categories p2c where p.products_status = '1' and p.products_id = pd.products_id and pd.language_id = '4' and p.products_id = p2c.products_id and p2c.categories_id = c.categories_id and ((pd.products_name like '%foo%' or p.products_model like '%foo%' or m.manufacturers_name like '%foo%') )

[TEP STOP]

Am einfachsten kann man dieses Problem umgehen indem man eine Aktuelle Oscommerce Version herunterlädt und installiert, da neuere Versionen keine Probleme mehr mit Mysql5 haben. Nun sind unsere Shops aber sehr stark modifiziert und ein Upgrade kommt nicht infrage, eine Situation wie sie bei vielen Betreibern von Oscommerce Shops vorkommen dürfte - unmodifiziert ist Oscommerce nahezu nicht zu gebrauchen. Ein Downgrade von Mysql und Php kommt selbstverständlich auch nicht in Betracht, zum einen weil unsere andere Software nicht in einer derat Antiquierten Umgebung funktionieren würde, andererseits weil solche Software Dinosaurier kaum noch Support genießen und Scheunentor grosse Sicherheitslücken aufreißen können. Nachdem somit alle anderen Möglichkeiten ausgeschöpft sind bleibt mir nur übrig das alte Oscommerce an die Aktuelle Laufzeitumgebung anzupassen.

Überaschenderweise sind dazu nur wenige Änderungen nötig, die leicht von der Hand gehen. Folgende Modifikationen müssen vorgenommen werden:

in advanced_search_result.php

In Zeile 218 (Zeilennummern können Abweichen, gegebenenfalls Suchfunktion benutzen):


$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";

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 .= " 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 . "')";
}

ersetzen mit:

$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)";

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 .= " 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 . "')))";
}

in index.php

In Zeile 178 (Zeilennummern können Abweichen, gegebenenfalls Suchfunktion benutzen):



// 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'] . "'";
} 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'] . "'";
}
} 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 . "'";
} 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 . "'";
}
}

ersetzen mit:

// 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'] . "'";
} 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'] . "'";
}
} 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 . "'";
} 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 . "'";
}
}

in admin/includes/classes/upload.php

In Zeile 31 (Zeilennummern können Abweichen, gegebenenfalls Suchfunktion benutzen):


$this = null;

ersetzen mit:

unset $this;

Damit sollte auch ein altes Oscommerce mit Aktuellen mysql und php Installationen zurecht kommen. Da ich es in diesem Eintrag noch nicht getan habe möchte ich noch folgendes Anmerken: Oscommerce ist der letzte Dreck.

 
Permalink 17:01:38, Kategorien: egotrip  

Sekundenkleber

Die Menge der Hautschichten die man sich von der sekben Stelle reissen kann ohne das es merklich weh tut ist begrenzt.

sehr begrenzt...

 
Permalink 13:52:02, Kategorien: egotrip  

Tabs are bad

Woher weiss man das man im Editor zu viele Tabs offen hat?
Wenn er einem beim start nach 20 Ftp Passwörtern fragt.

20.05.08

 
Permalink 17:26:58, Kategorien: Weisheiten  

Weisheit des Tages

Grundierspray stinkt wie ... Grundierspray

19.05.08

 
Permalink 13:52:25, Kategorien: blade the bofh, egotrip, Warhammer 40K  

Not Dead

Entgegen allen anderslautenden Gerüchten bin ich keineswegs tot, und auch das bloggen habe ich nicht grundsätzlich eingstellt. An Alle die sich etwas anderes erhofft haben: Ätschebätsch.. Nun ja, seit meinem letzten Blogeintrag ist eine Menge Zeit vergangen, und es ist auch ein bischen was passiert. Da die meisten Sachen kaum einen Eintrag wert gewesen wären hier die Zusammenfassung, geeordnet nach Kategorien:

Warhammer 40K

Die ersten Spiele

B3rt und ich haben die ersten zwei Spiele hinter uns, beide male ist B3rt als Sieger hervorgangen, was zu einem nicht geringen Teil daran liegt dass ich meinen Codex nicht richtig gelesen habe. Mit den Regeln hakt es sowieso noch ein bischen, entweder lesen wir vor jeder Aktion ersteinmal zehn Minuten im Regelbuch oder wir spielen totalen Crap zusammen.

blade the bofh

WAAAGH!

Man merkt wie Warhammer 40K langsam in meine Arbeit hinein Sickert: mein Aktuellstes Tool hört auf den griffigen Namen WAAAGH!. Auch das Design ist schön Orkig, von der Funktion ganz zu schweigen.

Waaagh!

Rootus Rootus

Wie ich bereits erwähnte haben wir nach langer, langer Rede, und viel Überzeugungsarbeit den ersten Rootserver für einen unserer Shops. Darüber gibt es eigentlich nicht viel zu erzählen, denn erwartungs gemäß läuft5 der Server ohne Probleme, da 1und1 seine Griffel nicht dadrin hat. Nur das schrottige OS-Commerce hatte ein paar Schwierigkeiten mit PHP5 und Mysql5, das fühlt sich auf einem Antiquierten PHP4/ Mysql4 System viel wohler.

Zahlen und lUSER

Einer unserer lUSER, bekannt für seine ausserordentliche Blödheit wollte neulich wissen was die hälfte von 100.000 ist. Dividieren könne er, doch mit so grossen Zahlen hat er Probleme meinte er. Naja. Ausser schallendem Gelächter kann er damit nichts gewinnen.

So das war es ersteinmal. Sobald etwas wirklich erwähnswertes passiert melde ich mich wieder.

04.05.08

 
Permalink 22:15:18, Kategorien: egotrip  

Heute Mittag im Eiscafe

Heute Mittag ging ich mit meiner Freundin in das Eiscafe bei mir um die Ecke. Das Eiscafe hat ein paar Tische draussen stehen, und aufgrund des schönen Wetters haben wir und draussen hingesetzt, anstatt drinnen zu sitzen. Es war recht voll, von dem Dutzend Aussentischen waren nur noch zwei frei als wir ankamen. Wir hatten gerade unser Eis bestellt und sollten es schnell bereuen.

Zwei Tische weiter saß eine Gesellschaft von Scheintoten zwischen 65 und 99. Aus heiterem Himmel schrie jemand von besagter Gesellschaft:

Die hat dir eine Sonnenbrille und ein Brettle geschenkt!

Wtf? Dachte mich und sah zu dem Tisch, um den Störer zu identifizieren, und erneut:

Die hat dir eine Sonnenbrille und ein Brettle geschenkt, da drüben, ich war dabei!

Da mein Blick immer noch in diese Richtung ging konnte ich nun die Situation erkennen, eine Frau zwischen 60 und 70 mit Dauerwelle und Violett gefärbeten Haaren brüllte ihren man, der augenscheinlich 15 Jahre älter und einen halben Meter kürzer war, an. Keine fünf Sekunden später brüllte sie erneut:

Die Gerda hat dir eine Sonnenbrille und ein Vesperbrettle geschenkt, ich war dabei!

Anstatt in Ruhe ein Eis zu Essen, durfte ich mir also dieses Theater anhören. Wenige Minuten, und einige Brüller später hatte ich das Starke Bedürfniss nachhause zu gehen, ein Brett und eine Sonnenbrille zu holen, der ständig brüllenden Frau die Sonnenbrille in die Nase zu rammen, und ihr solange mit dem Brett auf den Schädel zu hauen bis sie endlich ruhig ist.

Die Bestellten Eisbecher waren noch nicht da und dieses brüllende Subjekt immer noch lautstark dabei ihren Mann anzuschreien als jemand anderes meinen Zorn auf sich zog. Am Tisch nebenan saßen zwei Typen, die sich mit der Bedienung stritten weil sie die Rechnung nicht zahlen wollten. Beide Sprachen nur sehr schlechtes Deutsch, und einer von ihnen war offentsichtlich Betrunken.

Warum soll ich jetzt zahlen?

Der nüchterne von beiden stand auf und ging ins innere des Eiscafes, entweder um Wasser zu lassen, oder der um der Diskussion mit seinem Tischnachbarn auszuweichen. Aggressiv schrie der Mann, der dreckige Kleidung trug und alles in allem den Eindruck eines Stadtsteichers machte, die zierliche Bedienung an.

Warum soll ich jetzt zahlen?
Ich will eine Pizza!

Die Bedienung, sichtlich genervt und auch die anderen Anwesenden Gäste, mich eingeschlossen, erwarteten dass der Betrunkene jeden Moment Gewaltätig wird. Um die Situation etwas zu Deskalieren kam die zweite Bedienung an und mischte sich ein.

Bedienung: Können sie nicht zahlen?

Betrunkener Typ: Doch.

Bedienung: Warum wollen sie denn nicht zahlen?

Betrunkener Typ: Ich will eine Pizza!

Bedienung: Wenn sie ihre Rechnung jetzt bezahlen, bekommen sie auch eine Pizza.

Betrunkener Typ: Ich will erst Pizza dann zahlen.

Bedienung: Können sie denn Bezahlen?

Betrunkener Typ: Ich will Pizza!

Bedienung: Können sie bezahlen, haben sie Geld dabei?

Betrunkener Typ: Ich habe Geld, ich habe viel Geld

Die Diskussion drehte sich noch eine Weile so weiter, und die andere Bedienung lief davon. Auf dem Weg nach drinnen begegnete sie dem Tischnachbarn des Betrunkenen, der die Rechnung schliesslich ohne viel Aufsehens beglich.

Kurze Zeit später brachte die Bedienung dann auch die Eisbecher die wir bestellt hatten. Ich hatte gerade meinen Bananensplitt bewundert und den ersten Löffel genommen, tönte es von bekannter Stelle:

Die Gerda hat dir eine Sonnenbrille und ein Vesperbrettle geschenkt! Da drüben sind wir gesessen, und da hat die Gerda dir eine Sonnenbrille und ein Brettle geschenkt.

Um mich selbst daran zu hindern irgendjemandem ein Brett über den Kopf zu ziehen, konzentrierte ich mich auf mein Eis und kaute etwas auf dem Löffel herum. Ohne Zweifel weist das Metall des Löffels nun einige Bissspuren auf. Die Nächsten paar Minuten war es Relativ ruhig, der Betrunke murmelte irgendetwas vor sich, doch alles noch in erträglichem Maße.

Meine Freudin und ich hatten unsere Eisbecher beinahe leer, als es in der Gesellschaft von Frau Vesperbrettle erneut zum Disput kam. Die Gessellschaft wollte gerade Bezahlen als Frau Brüllt-Gern-Und-Viel das Ausmaß des Bierkonsumes ihres Mannes erkannte.

Du hast fünf Bier Getrunken!

Da sie alle Getrennt bezahlen wollten blieben bei der Rechnung natürlich einige Bier übrig, die keiner getrunken und erst recht keiner bezahlen wollte. Die Bedienung schien allmälich auch Mordpläne gegen Frau Brüllt-ihren-Mann-an zu schmieden, als die hälfte der Rechung immer noch offen war, und sie beständig "Du hast fünf Bier Getrunken!" schrie.

Glücklicherweise waren meine Freundin und ich zu diesem Zeitpunkt mit unseren Eisbechern fertig, konnten Zügig zahlen und verschwinden, denn unser Betrunkener Freund setzte erneut an.

Warum ich vorher zahlen muss?

Noch ein paar Minuten länger und ich hätte laut "Stuhlkampf" gebrüllt, und dem Betrunkenen einen Stuhl über die Rübe geschlagen. Der Beifall der Anwesenden währe mir sicher gewesen.

02.05.08

 
Permalink 11:02:00, Kategorien: Weisheiten  

Weisheit des Tages

Du bist so ein Ferkelficker, B3rT!