Posts mit dem Label Webprojekte werden angezeigt. Alle Posts anzeigen
Posts mit dem Label Webprojekte werden angezeigt. Alle Posts anzeigen

Mittwoch, 2. November 2011

PHP: Erster Montag im Monat

Der Frager hat ein "kleines" Problem mit der PHP-Funktion "strtotime". Nach einem Umzug zu einem anderen Hoster funktionierte diese trotz gleicher PHP-Version nicht mehr wie gewohnt. strtotime ist eine Funktion welche versucht(!) aus einem String einen Zeitpunkt zu ermitteln und ist wohl von vielem, u.a. von Lokaliserungseinstellungen abhängig. Im konkreten Fall führt der Luxus aber auch zu Unwägbarkeiten ...und die sollte man umgehen.
<?php
#Test:
print ErsterWochentagImMonat( 11, 2011, 1 )."\n";

function ErsterWochentagImMonat(
$intMonat, $intJahr, $intWochentag
) {

### Erwartete Daten:
#$intMonat = '1...12 (Januar...Dezember)

#$intWochentag = 0 für Sonntag;
#$intWochentag = 1 für Montag
# ...
#$intWochentag = 6 für Sonnabend;

# Plausibilitätsprüfungen:
if ( 1 > $intMonat || 12 < $intMonat ) {
return false;
}
if ( 0 > $intWochentag || 6 < $intWochentag ) {
return false;
}

# Berechnung:
$intTag=date( 'w', mktime ( 0, 0, 0, $intMonat, 1, $intJahr ) );
# Ergebnis: 0 ... 6
if ( $intTag == $intWochentag ) {
return '01.' . ZweiStellig($intMonat) . '.' . $intJahr;
} else {
if ( $intTag < $intWochentag ) {
return ZweiStellig( $intWochentag - $intTag + 1 )
. '.' . ZweiStellig($intMonat)
. '.' . $intJahr;
} else {
return ZweiStellig( $intWochentag - $intTag + 8 )
. '.' . ZweiStellig($intMonat)
. '.' . $intJahr;
}
}
return false;
}

function ZweiStellig( $int ) {
$int = intval( $int );
if ( $int < 10 ) {
return '0' . $int;
}
return $int;
}
?>

Sonntag, 11. September 2011

Honeypot blockt Angreifer

Vor einigen Tagen habe ich einen Honeypot fertiggstellt, der Angreifer schon bei der Vorbereitung eines Angriffs auf meine Webserver feststellt und blockiert.

Hier das Ergebnis der letzten Nacht:

(Uhrzeit, Angriffsersuch, IP-Adresse)

04:42 /admin/banner_manager.php/login.php - 174.128.240.2
04:50 /admin/categories.php/login.php?cPath=&action=new_product_preview - 174.142.75.174
04:50 /admin/categories.php/login.php?cPath=&action=new_product_preview - 75.126.154.162
04:53 /admin/categories.php/login.php?cPath=&action=new_product_preview - 85.158.181.47
04:53 /admin/categories.php/login.php?cPath=&action=new_product_preview - 189.113.5.131
04:54 /admin/categories.php/login.php?cPath=&action=new_product_preview - 74.222.6.111
04:59 /admin/categories.php/login.php?cPath=&action=new_product_preview - 85.36.63.35
05:26 /admin/categories.php/login.php?cPath=&action=new_product_preview - 88.12.17.111
06:45 /admin/banner_manager.php/login.php - 89.249.68.71
07:34 /admin/file_manager.php/login.php - 62.173.138.142

Nette Versuche! Beim nächsten Test auf eine Angriffsmöglichkeit gab es für diese Besucher eine Umleitung zu einer Webseite des BKA über die Bekämpfung von Internetkriminalität. (Etwas) Humor habe ich nämlich auch noch.

Dienstag, 7. Juni 2011

Ticketsystem für mittelständischen Webshop-Betreiber fertiggestellt

Für ein mittelständisches Kassler Unternehmen mit ca. 60 Beschäftigten habe ich ein Ticketsystem fertiggestellt. Dieses erlaubt, ergänzend zum bestehenden Webshop, die Bearbeitung eingehender Anfragen und das Erstellen individueller Angebote. Prinzipiell ist auch die Bearbeitung von Reklamationen damit möglich.

Das System ist natürlich mehrnutzerfähig, webbasiert (also auch sehr gut für die Heimarbeit geeignet). Es bietet einen Dateiupload - der spätestens dann nützlich ist, wenn z.B. Zeichnungen in einer Werkstatt benötigt werden und über die Ticket-Nummer abrufbar sein sollen. Eingehende Emails können natürlich in das Ticket-System übernommen werden.

Das Ticket-System befindet sich in Betrieb und entlastet insbesondere den Vertrieb und den Kundendienst - allein die Angebotserstellung läuft bis zu 60% schneller ab und natürlich ist besser kontrollierbar, ob auch alle Kundenanfragen bearbeitet wurden und was den Kunden wann von wem mitgeteilt wurde.

Eine Besonderheit des Systems: Es läuft in einem relativ kleinen Fenster z.B. neben dem Webshop. In der konkreten Ausführung erlaubt es durch sinnvollen Einsatz von Frames Angebotsbeschreibungen und Preise direkt aus dem Webshop zu übernehmen

Ticket-System_01.png
Ticket-System_02.png

Ticket-System_07.png

Dienstag, 18. Januar 2011

Joomla 1.6 und der Meta-Tag "generator"

Wem es aus gutem Grund nicht gefällt, dass Joomla 1.6 in jedes HTML-Dokument den Meta-Tag "generator" mit dem Wert "Joomla! 1.6 - Open Source Content Management" einbaut, dem kann geholfen werden:

In der Datei /libraries/joomla/document/document.php befindet sich in Zeile 79 der Eintrag:

var $_generator = 'Joomla! 1.6 - Open Source Content Management';

Den kann man natürlich ändern.

Samstag, 15. Mai 2010

Des fastix kleines CMS

Auf fastix.org biete ich ein kleines und deshalb recht einfach zu bedienendes CMS-System an. Es hat die Besonderheit, dass es ohne Datenbank funktioniert.

Wem es reicht, dass er seine Webseite in Kategorien einteilen kann, in die wieder Artikel eingestellt werden können, welche kommentiert werden können, die dann wieder erst freigeschaltet werden müssen, wer mit einer kleinen Bilderverwaltung zu recht kommt und eine einfache Terminverwaltung benötigt (oder eben nicht mal diese...), der wird mit dem Des fastix kleines CMS schon zufrieden sein.

In Übrigen habe ich fastix.orgund das Portal zu Des fastix kleines CMS mit dem CMS erstellt.

Man muss es ja testen. Es funktioniert also:

Dienstag, 22. Dezember 2009

PHP, Einlesen einer Excel-Datei

Hallo Community,
bitte dringend um Hilfe beim einlesen einer Excel Datei...

Also ich lade eine Excel Datei hoch, und möchte sie Zeile für Zeile und Spalte für Spalte aus lesen.

So sieht mein Script etwa aus:
----------------

$dom = DOMDocument::load( $_FILES['file']['tmp_name'] );
$rows = $dom->getElementsByTagName( 'Row' );

foreach ($rows as $row)
{
$cells = $row->getElementsByTagName( 'Cell' );
foreach( $cells as $cell )
{
$cellwas=$cell->nodeValue;
...
---------------


Leider kann ich so nur alle Zellen mit Inhalt auslesen. Also leere Zellen werden einfach übergangen, wodurch das ganze unbrauchbar wird.

Kann mir irgendjemand sagen wie ich zum Beispiel in einer Zeile jede Zelle einzeln abfragen kann, auch wenn diese Leer ist?


Eine schnelle Lösung:

Beim Blick in den Quelltext einer solchen Datei sehe ich: Leere Zellen lassen sich gar nicht abfragen. Die Zelle existiert in den Daten schlicht nicht. Die Zellen nach leeren Zellen haben aber ein Attribut 'ss:Index'. Also: Nach der Existenz des Attributes fragen, wenn es existiert den Spaltenzähler auf den Wert setzen.

Bei mir funktionierte mit test.xml als (aus OpenOffice exportierte) Excel-2003-xml-Datei:
<?php
$dom = DOMDocument::load( "test.xml" );
$rows = $dom->getElementsByTagName( 'Row' );
$zeile=0;
$arValues=array();
foreach ($rows as $row) {
$cells = $row->getElementsByTagName( 'Cell' );
$spalte=0;
foreach( $cells as $cell ) {
if ($cell->hasAttribute('ss:Index')) {
$spalte=$cell->getAttribute('ss:Index')-1;
}
$arValues[$zeile][$spalte]=$cell->nodeValue;
$spalte++;
}
$zeile++;
}

$zeile=0;
$maxSpalten=0;

# spalten zählen
foreach ($arValues as $arZeile) {
if ($maxSpalten < count($arZeile)) {
$maxSpalten = count($arZeile);
}
}

# Array mit false aufüllen und für foreach schön machen:
$arTemp=$arValues;
$arValues=array();
for ($zeile=0; $zeile < count($arTemp); $zeile++) {
for ($spalte=0; $spalte < $maxSpalten; $spalte++) {
if (isset($arTemp[$zeile][$spalte])) {
$arValues[$zeile][$spalte]=$arTemp[$zeile][$spalte];
} else {
$arValues[$zeile][$spalte]=false;
}
}
}
unset($arTemp);
print "Werte:<pre>";print_r($arValues);print "</pre>";
?>


Hinweis:

Diese schnelle Lösung berücksichtigt übrigens noch nicht, dass ein solches Dokument auch Tabellenblätter hat.

htpasswd-Generator - Eine Lösung für kleine Webs

Unter http://www.fastix.de/htpasswd2_sourceview.php habe ich eine "kleine Lösung" für die Verwaltung von Benutzern auf Webservern abgelegt.

Einfach als Datei htpasswd.php in dem zu schützendem Verzeichnis speichern.

Danach Aufruf mit http://DeinHost/DeinVerzeichnis/htpasswd.php - Benutzer anlegen, Schutz einschalten. Das sollte auch schnell getan werden, denn sonst kann es jeder andere auch...

Ein Bild sagt mehr als tausend Worte:

Sonntag, 20. Dezember 2009

Pantone, RAL und RGB-Farben und deren theoretische Grau-Werte im Vergleich

Wikipedia und meine nur eingeschränkte Farbtüchtigkeit hat mich darauf gebracht: Ich habe mal eine Tabelle gebaut, die zeigt, wie sich Pantone, RAL und RGB-Farben und deren theoretische Helligkeitswahrnehmung in der Praxis machen.

Die Daten stehen in einer Datenbank - ich hätte jetzt gern Vorschläge für Filter- oder Abfragefunktionen.

Dienstag, 13. Oktober 2009

Best of PHP-Programming

// The output is the form.
$output = $form;
// So output it.
return $output;
Scheinbar müssen heiß gestrickte Daten erst abkühlen und werden deshalb vor dem Auskippen von einem Topf in den anderen geschüttet.

Leider steigt dadurch der Speicherplatzverbrauch...

Fundstelle? Ein Wordpress-Plug-In.