Multidimensionale Arrays per Zufall durchmischen
Kategorie: web-development
Für große SQL Tabellen eignet sich ORDER BY RAND() LIMIT 4 nicht um eine zufällige Datenmenge aus der Datenbank zu holen – erklärt Anton Titov in seinem Blog. Alternativ lässt sich per PHP das Ergebnisarray bearbeiten.
Ein “normales Array” mischt man einfach mit $my_array = array_rand($_my_array). Man kann die Anzahl der Ergebnisse sogar beinflussen indem array_rand($my_array, 4) noch einen (int) Wert für die Anzahl der Elemente angehängt bekommt. Doch was mache ich mit einem mehrdimensionalem Array? Hier funktioniert array_rand() nicht.
Im PHP Manual zu array_rand() findet sich nur eine relativ aufwändige Funktion. Doch es geht auch einfacher – einfach mit
shuffle($my_array);
$my_array = array_slice($my_array,0,4);
Edit: Probleme mit PHP und Apache2
Kategorie: Internet, Linux (Ubuntu)
EDIT: Lösung des Problems
Warum auch immer war meine php5.conf komplett falsch!
Sie müsste nämlich wie folgt aussehen:
<ifmodule mod_php5.c>
<filesmatch "\.ph(p3?|tml)$">
SetHandler application/x-httpd-php
</filesmatch>
<filesmatch "\.phps$">
SetHandler application/x-httpd-php-source
</filesmatch>
</ifmodule>
Vielen Dank an BlackFate vom irc.debian.org !
replace self-defined chars with htmlcode
Kategorie: web-development
str_replace ( array ( '&', '<', '>','ä','Ä','ö','Ö','ü','Ü','ß' ),
array ( '&', '<' , '>', 'ä','Ä', '&oum;l','Ö'
,'ü','Ü','ß' ),
$string );
str_repalce durchsucht in diesem Fall die Quelle $string mit einem Suchmuster, welches im ersten Array definiert ist und ersetzt diese durch die dazugehörigen Zeichen im zweiten Array.
GD Library Probleme bei 1und1
Kategorie: Headline, web-development
1und1 Server scheinen mächtige Probleme mit der GD Library zu haben. Will man beispielsweise mit der WordPresserweiterung NextGen Gallery die Bilder automatisch verkleinern, Thumbnails erstellen oder die Größe der Bilder reduzieren bricht der Vorgang meist ohne einer nachvollziehbaren Fehlermeldung vom Server ab. Ich hatte es bei einem Projekt nur mit Bildern unter 900×600 geschafft, was aber auch nicht immer ging.
Lang habe ich nach einem Ausweg dafür gesucht und dann entdecke ich zufällig eine wirklich simple Rätsels Lösung. Anstatt PHP 4.x zu benutzen, teile man dem Server mit, dass man von ab an nur noch PHP 5.x verwenden möchte — und die Lösung wär nicht einfach, wenn das nicht nur mit Hilfe einer einzigen Zeile in der .htaccess Datei ginge.
Also einfach eine neue .htaccess Datei im Wurzelverzeichnis von WordPress (root) anlegen (falls nicht eh schon eine vorhanden ist) und darin an oberster Stelle folgendes eintragen:
# PHP5 auf 1und1 einschalten
AddType x-mapp-php5 .php
AddHandler x-mapp-php5 .php
Zum weiterlesen geht es hierlang
Sicheres Kontaktformular mit jQuery und PHP erstellen
Kategorie: web-development
Ein Kontaktformular ist mit PHP eigentlich schnell erstellt und lässt sich einfachste Weise in jede Webseite einbauen. Was leider oft vergessen wird ist die Sicherheit — nicht nur zum Schutz vor SPAM des Kontaktformular-Administrators, sondern auch zum Schutz vor Injections, die das Skript zum versenden von SPAM unter dem Namen des Webseitenbetreibers missbrauchen können.
Oft wird diese vermeintlich triviale Website-Funktion von Programmier-Anfängern umgesetzt, die keine Erfahrung mit der sicheren Web-Programmierung haben. Solche Skripte prüfen die Formular-Eingaben nicht auf unerlaubte Zeichen – dadurch können sie von Spammern als Spam-Verteiler missbraucht werden … Das oberste Gebot eines jeden Web-Programmierers muss lauten: “Vertraue nichts und niemandem”. Daten, die ein Skript aus HTML-Formularen, POST/GET-Übergabeparametern oder sonstwoher erhält müssen grundsätzlich als potenziell gefährlich angesehen und vor der Verarbeitung “gesäubert” werden. Eine “gesunde” Portion Paranoia ist sehr hilfreich beim Web-Programmieren, auch wenn Auftraggeber oder Vorgesetzte manchmal schief gucken mögen.
Auch wenn man ein Webskript nicht so sicher machen kann wie ein Tresor, lässt sich ein Kontaktformular doch recht einfach absichern. Damit die SPAMmer nicht so einfach freies Futter finden, hier also eine Anleitung, wie ein Formular sehr einfach abgesichert werden kann — und dazu passend ein How-To zur Erstellung eines sicheres Kontaktformulars mit PHP und jQuery
EDIT: ich habe seit der Erstellung des Posts gelernt, dass eine alleinige JS Validierung aus Sicherheitstechnischer Sicht eigentlich gar keine ist, denn: “Die Validierung von Formularen über JavaScript kann zwar nützlich sein, da sie oft schneller ist und die Seite nicht neu geladen werden muss, allerdings ist sie kein Ersatz für eine erneute Validierung der Daten auf der Seite des Servers. Sind die Daten nicht serverseitig validiert worden, kann man davon ausgehen dass sie überhaupt nicht validiert wurden.” [gängige Sicherheitsprobleme im Web
Zudem "hat sich leider immer wieder herausgestellt, das es mit Javascript unmöglich ist, eine Validierung zu garantieren. Irgendwelche Trottel haben Javascript immer ausgeschaltet oder es buggt. " [phpBlogger]
Ich werde demnächst also nur noch eine phpValidierung durchführen, und wohlmöglich mit Hilfe dieser Bibliothek
Tweets2Delicious – Twittermeldungen automatisch an delicious weiterreichen
Kategorie: Headline, Internet
Update:
Ihr könnt nun meine angepasste Version weiter unten downloaden.
Aus spannenden Tweets werden nützliche Bookmarks
Zahlreiche Services wie TweetBackup oder Tag.this erlauben eine kostenfreie Sicherung eines festgelegten Twitter-Streams. Tweets2Delicious ist einer mehr, der eigene Tweets, die mit
Andere Tools haben meist jedoch den Nachteil, dass die Hashtags nicht als Tags und der eigene Tweet-Text nicht in delicious übernommen werden. Tweets2Delicious hingegen erlaubt es, alle Hashtags und den eigenen Tweettext nach delicious zu übernehmen. Zudem werden nicht alle Tweets gesichert, sondern nur solche, die mindestens eine URL und einen Hashtag haben.
Mit einem täglichen Cronjob – exemplarisch bei Cronjob.de oder vom eigenen Webhoster ausgeführt – kann der Export der Tweets mit Leichtigkeit automatisiert werden.
Das Skript war für mich genau das, wonach ich schon seit einigen Wochen gesucht habe. Allerdings hatte es meiner Meinung nach einige Schwächen, die ich nun beseitigt habe.
Ein großer Nachteil — finde ich — war, dass der Tweet-Text als Titel und nicht als Description in die delicious Bookmarks übernommen wurde. In der Description landete bloß ein Werbeslogan für das Skript selbst. Ich habe es jetzt so modifiziert, dass es für jede URL den Titel der Webseite holt und bei delicious ablegt. Der Eigene Tweet-Text wird jetzt — gefolgt von der Werbemessage — als Description gespeichert.
Ferner hat das Skript im Text alles ab der URL gelöscht, so dass — je nach Tweet-Stil — komische Schnipsel bei delicious landeteten:
RT: @maRk Hatte Ärger mit #Umlaute in #Reguläre #Ausdrücke – dank dieser Seite http://url.de nicht mehr #utf8 #lokalisierung #deutsch (via @OgNor)
wurde so:
RT: @maRk Hatte Ärger mit Umlaute in Reguläre Ausdrücke – dank dieser Seite
Was natürlich unschön ist, und in diesem Fall sogar den Sinn total verfälscht.
Hatte Ärger mit Umlaute in Reguläre Ausdrücke – dank dieser Seite nicht mehr utf8 lokalisierung deutsch
Ferner waren keine Umlaute in den Tags möglich — die Wörter waren nach dem Umlaut abgeschnitten, die nun aber korrekt übernommen werden.
Sofern meine Änderungen beim Autor nicht auf Unmut treffen, kann ich ja das geänderte Skript online stellen.
Update:
Hier ist nun also meine angepasste Version (zip)
SQL-Injections in PHP vermeiden
Kategorie: Internet
In PHP steht zu diesem Zweck für fast jede verwendete Datenbank eine Escape-Funktion bereit.
Ein Beispiel für MySQL: anstatt
$abfrage = "SELECT spalte1
FROM tabelle
WHERE spalte2 = '".$_POST['spalte2Wert']."'";
$query = mysql_query($abfrage) or die("Datenbankabfrage ist fehlgeschlagen!");
sollte Folgendes verwendet werden:
$abfrage = "SELECT spalte1
FROM tabelle
WHERE spalte2 = '".mysql_real_escape_string($_POST['spalte2Wert'])."'";
$query = mysql_query($abfrage) or die("Datenbankabfrage ist fehlgeschlagen!");</pre>Eine weitere Möglichkeit ist die Typumwandlung von Übergabeparametern.
$abfrage = "SELECT spalte1
FROM tabelle
WHERE spalte2 = " . intval($_POST['spalte2Wert']);
$query = mysql_query($abfrage) or die("Datenbankabfrage ist fehlgeschlagen!");</pre>Ab PHP 5.1 sollten PHP Data Objects für Datenbankabfragen verwendet werden.
$dbh->exec("INSERT INTO REGISTRY (name, value)
VALUES (".$dbh->quote($name,PDO::PARAM_STR).", ".$dbh->quote($value,PDO::PARAM_INT).")");</pre>Oder als Prepared Statement:
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam('name', $name);
$stmt->bindParam('value', $value);</pre>
Häufig wird aus Bequemlichkeit einfach die Konfigurationsoption „magic_quotes_gpc“ auf „on“ gestellt, mit der von außen kommende Benutzereingaben automatisch maskiert werden. Doch dies ist nicht empfehlenswert. Denn manche nicht selber programmierte Skripte setzen eigenständig Funktionen wie etwa addslashes() oder das bereits weiter oben genannte mysql_real_escape_string() ein. Das heißt, dass bereits allen relevanten Zeichen in den Benutzereingaben durch so genannte Magic Quotes ein Backslash vorangestellt wurde und nun durch die Escape-Funktion erneut ein Backslash vorangestellt wird. Somit werden die Benutzereingaben verfälscht und man erhält beispielsweise anstatt eines einfachen Anführungszeichens ein Anführungszeichen mit vorangestelltem Backslash (\"). Auch aus Gründen der Portabilität sollte bei der Entwicklung von Anwendungen auf diese Einstellung verzichtet und stattdessen alle Eingaben manuell validiert und maskiert werden, da nicht davon ausgegangen werden kann, dass auf allen Systemen dieselben Einstellungen vorherrschen oder möglich sind.
Das ist ein Auszug aus diesem Artikel
Browserswitch — zwischen IE und FF unterscheiden
Kategorie: web-development
Die Lösung heißt: conditional comments
Normal comment: <!-- Comment text -->
Conditional comment: <!--[If expression]> HTML <![endif]-->
Für den einfachsten Switch bedeutet dies:
<!--[If IE]> HTML <![endif]-->
Hier wird jeder IE (ab v5) den eingeklammerten HTML code ausführen
Die umgekehrte Richtung geht leider nur mit einem nicht XHTML validen code, nämlich:
<!--[if !IE]>
Das Ganze geht auch komplexer:
- ! (negation)
Use the negation to select all versions except the one specified, e.g.
[If !IE 6]will select IE 5, 5.5 and 7. - lt (less than)
Select any versions less than the one specified, e.g.[If lt IE 6]will select IE 5 and 5.5. - lte (less than or equal)
e.g.[If lte IE 6]will select IE 5, 5.5 and 6. - gt (greater than)
Select any versions greater than the one specified, e.g.[If gt IE 6]will select IE 7 (and any later versions that may appear). - gte (greater than or equal)
e.g.[If gte IE 6]will select IE 6 and 7 (and later).
Für weitere Informationen [Quelle]
Weiterlesen: Browserswitch — zwischen IE und FF unterscheiden »
HOWTO: Enable PEAR on OS-X XAMPP
Kategorie: Mac
PEAR is comming out with XAMPP but it is not installed by default. Here you’ll find how to install it easily.
Weiterlesen: HOWTO: Enable PEAR on OS-X XAMPP »
XAMPP 1.6.4 + Ubuntu 64-Bit
Kategorie: Linux (Ubuntu)
Xampp 1.6.4 lässt sich auf der Ubuntu 64-Bit nicht ohne weiteres starten. Beim Versuch lampp zu starten kommt die Fehlermeldung dass Xampp bisher nur auf 32-bit Systemen läuft. Der Problems Lösung ist eine kleine Library namens ia32-libs. Also einfach mittels apt-get installieren
sudo aptitude install ia32-libs
und gut ist. Nun lässt sich lampp wie gewohnt starten.
Der Dank geht an Jens!





