Archiv für die Kategorie ‘Programmierung’

Mobile Touch Icon

Samstag, 09. Juli 2011

Da wir via Seitenreport unsere Projekte auch auf Usability hin untersuchen, ist uns aufgefallen, dass ein zeitgemäßes “Mobile Touch Icon” verlangt wird, welches es iPhone, iPad und Apple Usern erlaubt, die jeweilige Website auf dem Home-Screen abzuspeichern. Dank der super Anleitung von Matthias Pabst geht das recht schnell:

- Icon mit 114×114 Pixeln erstellen

- als PNG abspeichern

- im Root der Website abspeichern

im Header der Seite per <link rel="apple-touch-icon-precomposed" href="http://domain.de/apple-touch-icon.png" /> das Icon einbinden

Habe es selber getestet. Funktioniert wunderbar.

Concardis Probleme mit neuer Payment Url

Freitag, 08. Juli 2011

Testhalber prüft man vor jeder Kreditkartenzahlung über den Saferpay Server die Erreichbarkeit der Saferpay URL per Script:

if( strtolower( substr( $payment_url, 0, 36 ) ) != “https://www.saferpay.com/vt/pay.asp?”)

Hier wird nur abgefragt, ob mit der Server per SSL erreichbar ist, ansonsten sollte man dem Kunden gar keine Kreditkartenzahlung ermöglichen.

 

Allerdings hat sicher die $payment_url geändert. War es für bestehende Concardis Kunden bis dahin die Url “https://www.saferpay.com/vt/pay.asp” is tes für neue Kunden ab 2011 die URL: “https://www.saferpay.com/vt2/pay.aspx”. Hierfür muss das Sctript angepasst werden:

if( strtolower( substr( $payment_url, 0, 36 ) ) != “https://www.saferpay.com/vt/pay.asp?” AND
strtolower( substr( $payment_url, 0, 38 ) ) != “https://www.saferpay.com/vt2/pay.aspx?”
)
{ echo “Saferpay Server per SSL nicht erreichbar!” }

Das funktioniert super, ebenso empfielt der technische Support folgende Script Abfrage:

 

Sehr geehrter Herr Kulschewki,

die Url hat sich mit Einführung der neuen Saferpay Page geändert. Der angegebene Code dient lediglich dazu zu überprüfen ob die Kommunikation funktioniert. Ersetzen Sie deswegen die alte Abfrage einfach durch:

if( strtolower( substr( $payment_url, 0, 24 ) ) != “https://www.saferpay.com” )”

dann funktioniert die Abfrage auch mit dem neuen Zahlungslink.

 

 

Der Support bei Saferpay ist super, eine Mail wird innerhalt 1 Stunde beantwortet, die telefonische Erreichbarkeit ist aber leider nicht so dolle.

 

CSSTidy Probleme mit a:hover CSS Anweisung

Dienstag, 21. Juni 2011

Ich nutze in einem Projekt CSSTidy und wunderte mich immer, warum bei einer CSS Anweisung “a:hover.navi_right  {font-family:Verdana,Arial,Helvetica;font-size:8pt;color:#0e0282;text-decoration:none;}” beim Mouseover das Underline nicht verschwand. Auch eine andere Komprimierung im CSSTidy brachte nix. Die Lösung fand sich schnell, es gab eine CSS Definition eines Elementes, welches über eine ID angesprochen wurde, welche ebenfalls als “navi_right” definiert war: #navi_right{background-color: #F4F4F4;border: 0px solid green; padding: 0px;height: auto; width: 135px; float: right; margin-top: 0px; }. Im Quelltext wurde dieses Element dann per <div id=”navi_right”> angesprochen.

Ich benannte das Element im Quelltext einfach um in <div id=”navi_right_box”> passte die CSS an “#navi_right_box{background-color: #F4F4F4;border: 0px solid green; padding: 0px;height: auto; width: 135px; float: right; margin-top: 0px; }” und es funktionierte danach problemlos.

Also, CSSTidy macht Probleme in der Komprimierung, wenn eine ID Definition, welche per “#” angesprochen wird, denselben Namen wie eine Klasse besitzt.

 

Hier noch ein paare Keywords für Suchende:

CSSTidy, a:hover, Klasse, Elemet-ID, Mouseover Probleme, CSS Komprimierung, Mouseout underline none

Plesk & das “LOAD DATA LOCAL INFILE” – Problem mit PHP

Montag, 06. Juni 2011

Ich hasse Plesk, das ist der letzte Kinderkram -klickibunti und mit Null Funktionen – aber egal. Ein Kunde von uns ist endlich auf einen eigene Server umgestiegen, so dass wir dringend eine benötigte Höheneinheit bei Keyweb in Erfurt frei bekamen. Allerdings versprachen wir in geistiger Umnachtung, sein System auf einen 1&1 Dedicated Server zu migrieren. Dort läuft das tolle Plesk in der buntesten Version 9.0.1 – aber na gut.

Die Domain war bereits drüben und es mussten nur die Daten per SSH rumkopiert werden, dank der superflotten 1&1 Anbindung ja kein Problem, schließlich pegelt sich ja der Transfer irgendwann bei sagenhaften 4 Mbit / sec ein … also Bilder in Tar.gz Archive gepackt und los ….

Dann legten wir eine neue Datenbank via Plesk an sowie den dazugehörigen Benutzer, auch erstmal kein Problem. Die Anwendung bekam die DB Logins mitgeteilt und es sollte gehen, denkste. Wir transferieren Stammdaten aus Warenwirtschaftssystemen üblicherweise in die Anwendungen via gezippten und verschlüsselten CSV Dateien, so also auch hier – und wollten einfach per “LOAD DATA INFILE” den Krempel wieder in die neue Datenbank einlesen, was aber netterweise auf Anhieb aus der PHP Anwendung heraus per Programmcode nicht klappte. Also loggte ich mich auf dem MYSQL DB SERVER dieser Maschine per “mysql -uBenutzer -pPasswort” ein, machte ein connect auf die betreffende frisch angelegte Datenbank und probierte den ganzen Kram händisch per “LOAD DATA INFILE ‘/srv/www/vhosts/DOMAINVERZEICHNIS/httpdocs/importdatei.csv’ INTO TABLE irgendwas FIELDS TERMINATED BY ‘;’ (Feld1, Feld2);” … was zu dem lustigen Error 13 (HY00) führte – “Can’t get stat of DeinebekloppteImportdatei”. Ok, Google meinte, Plesk kennt kein LOAD DATA INFILE, hier muss ein LOAD DATA LOCAL INFILE denselben Zweck erfüllen. OK, aber nun wurde es ganz interessant,denn nach Eingabe von “LOAD DATA LOCAL INFILE ‘/srv/www/vhosts/DOMAINVERZEICHNIS/httpdocs/importdatei.csv’ INTO TABLE irgendwas FIELDS TERMINATED BY ‘;’ (Feld1, Feld2);” verweigerte der DB SERver mir vollends die Zusammenarbeit und meinte nur trocken: ERROR 1148 (42000): The used command is not allowed with this MySQL version!

Na gut, irgendwo las ich dann was von “mysql -uBenutzer -pPasswort –local-infile=1″, was schonmal in die richtige Richtung ging, aber da wir nicht wissen, ob der DB Server oder der Client betroffen ist, kann das zwar auf der Shell funktionieren, aber nicht unbedingt in der Anwendung.

Na Super, und nun? Eine komplett neuen MYSQL Server auf die Kiste zu kompilieren, darauf hatte ich keine Lust, da sind locker 3 Stunden weg. Aber da wir keine Angst vor der Shell haben, nahm ich mir die my.cnf vor, welche in /etc/ liegt und änderte kurzerhand die Konfiguration, damit die gesamte Ausgangssituation des Servers geändert wird, kann ja nix passieren . Aus set-variable=local-infile=0 in der Abteilung des MYSQL SERVERS ( [mysqld] ) wurde ein set-variable=local-infile=1 und denselben Eintrag legte ich zusätzlich im MYSQL-CLIENT Konfigurationsbereich an ( [mysql] )!

# The MySQL server
[mysqld]
set-variable=local-infile=1

[mysql]
set-variable=local-infile=1

Um auf Nummer sicher zu gehen, loggte ich mich auf den DB SERVER per admin und Masterpasswort ein und machte ein Connect auf die Rechte-Datenbank “mysql”. Hier änderte ich per manuellem Update  in der Tabelle “user” für den DB Benutzer, welchen wir zu Beginn mit der neuen Datenbank angelegt hatten, alle Rechte von “N” auf “Y” und erklärte ihm am Ende per FLUSH PRIVILEGES, dass ich es ernst meine.

So, wieder händischer Test per “LOAD DATA LOCAL INFILE ‘/srv/www/vhosts/DOMAINVERZEICHNIS/httpdocs/importdatei.csv’ INTO TABLE irgendwas FIELDS TERMINATED BY ‘;’ (Feld1, Feld2);” und er las mir den Krempel korrekt ein, soweit so gut.

Ok, Anwendung aufgemacht und das ganze per PHP Script versucht – ohne Erfolg, wie sollte es anders sein, also lag hier ein Problem mit dem PHP MYSQL Connect vor, denn der DB SERVER selber und der MYSQL Client auf der Konsole habe ja ihren Job eben korrekt gemacht, also kann es nur noch am PHP liegen. Und da der Connect auf die DB per PHP regulär durch “mysql_connect($db_host, $db_user, $db_password)” erfolgt, war hier anzusetzen … google befragt …. und siehe da, an kann dem mysql_connect noch ein paar mehr Infos mit geben, wie etwa die Fehlerausgabe an Stelle 4 und optionale Parameter an Position 5. Ein erweitertes “mysql_connect($db_host, $db_user, $db_password, FALSE, 128) erlaubt nun auch der PHP Klasse, welche den mysql Client spielt, LOAD DATA LOCAL INFILE zu akzeptieren.  Die Zauberzahl ist die 128 am Ende, welche das benötigte Importrecht zu Verfügung stellt. Gefunden habe ich das unter diesem Link, aber auch unter mysql.com findet man Hinweise und weitere Wunderzahlen.

Ich hoffe, das war etwas hilfreich, ich sitze dafür seit 07:50 Uhr heute früh und kann nun endlich um 13:15 Uhr ohne Mittagessen und mit kaltem Kaffee die Anwendung umschreiben, so dass der Import der CSV Datein auch auf einem 1&1 Server mit Plesk korrekt funktioniert.

CSSTidy zum Komprimieren von CSS Dateien einbinden

Sonntag, 05. Juni 2011

CSSTidy Bibliothek per PHP verarbeiten:

CSSTidy kann man sich einfach runterladen und in ein Verzeichnis entpacken. Die grundsätzlich benötigte PHP Klasse liegt in der Datei “class.csstidy.php”.  Die einfachste Verarbeitung des Inhaltes einer CSS Datei in eine komprimierte Ausgabe erledigt man mit diesen wenigen Zeilen:

<?

require(‘../administration/CSSTIDY/class.csstidy.php’);

$css = new csstidy();
$css_code = file_get_contents($datei);
$css->set_cfg(‘remove_last_;’,true);
$css->load_template(‘highest_compression’);
$css->parse($css_code);

$css_inhalt = $css->print->plain();

echo $css_inhalt;

?>

—————————>

Aber man möchte ja in lesbaren Dateien CSS Code ablegen, daher bindet man einfach die verkleinerte CSS Dateiversion ein, ich habe das einfach in eine Routine gepackt:

1.) Klasse einbinden

2.) Quelldatein definieren, in denen lesbarer Code hinterlegt ist

3.) Schleife laufen lassen und die komprimierte Dateiversion unter anderem Namen abspeichern:

<?

require(‘../administration/CSSTIDY/class.csstidy.php’);

// Verzeichnisse durchsuchen …

$cssdatei[0] = “general.css”;
$cssdatei[1] = “aktion.css”;
$cssdatei[2] = “artikelliste.css”;
$cssdatei[3] = “voransicht.css”;
$cssdatei[4] = “detailansicht.css”;

$i = 0;
foreach($cssdatei as $datei)
{
$i++;
$quelldatei = $datei;
$zieldatei  = “compress_”.$datei;

$css = new csstidy();
$css_code = file_get_contents($datei);
$css->set_cfg(‘remove_last_;’,true);
$css->load_template(‘highest_compression’);
$css->parse($css_code);

$css_inhalt = $css->print->plain();

echo $css_inhalt;

@unlink ($zieldatei);
$file = $zieldatei;
$fd   = fopen($file,”a”);
fwrite ($fd,$css_inhalt.”\r\n”);
fclose ($fd);
}

?>

 

Funktioniert super, bei PageSpeed hat das etliche Punkte gebracht !

cannot generate system identifier for general entity

Mittwoch, 17. November 2010

Der  W3 Validator meckert immer rum bei Variablenübergabe per “&” Trennung, also wenn die Variablen für ein Dokument per  URL mitgegeben werden, in etwa so:

http://www.domain.de/bestellen.php?ART=123&MENGE=20&KDNR=50123&TEXT=bitte+heute+liefern

Könnte man über ein Formular lösen, sicher, geht aber nicht immer. Ganz schlaue Leute in diversen Foren empfehlen, aus dem “&” Entity ein”&amp;” zu machen ! Das geht natürlich nicht, ganz klar.

Daher hier ein anderer aber simpler Lösungsvorschlag, welcher auch funktioniert:

1.) Die Variablen per Sonderzeichen trennen (in diesem Fall per “|”) und als Gesamtvariable übergeben:

http://www.domain.de/bestellen.php?BESTELLUNG=123|20|50123|bitte+heute+liefern

2.)  In dem Dokument diese Variable auf Existenz überprüfen und die Subvariablen per explode abfragen:

if (isset($BESTELLUNG))
{

$BESTELLUNG_TEILE = explode(“|”,$BESTELLUNG);

$ART=$BESTELLUNG_TEILE[0];

$MENGE=$BESTELLUNG_TEILE[1];

$KDNR=$BESTELLUNG_TEILE[2];

$TEXT=$BESTELLUNG_TEILE[3];

}

————————

Das hat viele viele viele Vorteile:

1.) ich kann ENDLICH Texte übergeben, welche auch ein “&” enthalten oder ein anderes entity

2.) sehr einfach umzuprogrammieren

3.) auch Javascript Links können so codiert werden

4.) sicherheitsrelevanter, da die Variablen nicht mehr mit dem Zusatz des Variablennamens übergeben werden (ART=123&Menge=20) sondern als Parameterstring, welcher eine feste Synthax erfordert. Fehlt hier ein Parameter oder kommt einer mittendrin dazu, ist die Reihenfolge nicht mehr korrekt und mit einer Abfrage per”if (Count($BESTELLUNG_TEILE)!=4) echo “MANIPULIERT” kann man diesen Aufruf als manipuliert verwerfen.