kostenloser Webspace werbefrei: lima-city


Suche auf lima-city

  • in: Wie mittels PHP Script IPs speichern ?

    geschrieben von nikic

    @fleischhoernchen: Bei solchen juristischen Aussagen ist es sehr empfehlenswert eine Referenz anzugeben. Zumindest glaube ich, dass deine Darstellung so nicht ganz richtig sein kann.
  • in: Programmierstil

    geschrieben von nikic

    anti-atomkraft schrieb:
    1. Wenn man einfache, statt Doppelte Leerzeichen verwendet; funktioniert dergleichen nicht.
    chr(15) ist nichts anderes als "\r" und chr(10) ist "\n".
    2. Um unterschiedliche Codierungen und PHP-Einstellungen zu berücksichtigen, lieber dies verwenden (höhere Kompatibilität)

    Nur um sicher zu gehen, dass ich das richtig verstanden habe: du benutzt das komplett unlesbare chr(15) anstelle von "\n", weil du keine doppelten Anführungszeichen verwenden willst, weil du denkst, dass sie langsam sind? Wenn das der Fall sein sollte, dann muss ich dich leider enttäuschen ;) Einfache und doppelte Anführungszeichen haben keinen (messbaren) Performanceunterschied und chr(15) ist da im Gegensatz *deutlich* langsamer, da Funktionsaufrufe immer recht viel Overhead haben.
  • in: Programmierstil

    geschrieben von nikic

    anti-atomkraft schrieb:
    - Ausgabe von Zeilenumbrüchen über echo() oder print() mittels chr(15).chr(10)

    Huh, wer hat dir denn den Mist untergejubelt?! Kein Schwein weiß was chr(15) und chr(10) sind. Benutz lieber allgemeinverständliche "\r" und "\n".
  • in: Programmierstil

    geschrieben von nikic

    Am wichtigsten ist denke ich
    a) Unit Tests für den Code zuschreiben
    b) den Code so zu schreiben, dass man ihn auch wirklich Testen kann - SOLID
  • in: Abi-Physik - Lernportal

    geschrieben von nikic

    Wirklich, Top-Seite. Viel mehr kann man einfach nicht mehr sagen. Einfach spitze.
  • in: apc_fetch() returns false in Safari, Chrome & Opera

    geschrieben von nikic

    Seit 5.4 hat PHP eingebauten Upload Progress Support, vielleicht möchtest du das mal testen.
  • in: Unterschied zwischen Abstract und Interface

    geschrieben von nikic

    Oft wirst du übrigens auch beides kombinieren. Also ein Interface *und* eine abstrakte Klasse welche dieses Interface implementiert definieren. Das Interface wirst du dann in deinen Schnittstellen nutzen, während die abstrakte Klasse eine sinnvolle Default-Implementierung abgibt.
  • in: Grösse der Ausgabe einer Seite in Bytes

    geschrieben von nikic

    @feedping: Dein Ansatz war schon richtig, du musst nur mb_strlen (das die Länge in Buchstaben misst) durch strlen ersetzen (was die Länge in Bytes misst), da Buchstaben nicht unbedingt Bytes entsprechen (wenn du UTF-8 benutzt, beispielsweise). Was drafed-map meint ist, ist noch etwas anderes. Ihm geht es darum, dass Dateien immer nur in Blöcken einer bestimmten Größe gespeichert werden und daher Dateien meist größer sind als ihr Inhalt. Aber diese Größe sollte dich eigentlich eher wenig interessieren ;)
  • in: Chemie - wunderschöne Schauversuche gesucht!

    geschrieben von nikic

    Kalium in Wasser kommt immer gut :) Andere Alkalimetalle gehen natürlich auch, aber ich finde, dass bei Natrium der Effekt bei weitem nicht so ausgeprägt ist (bei Lithium natürlich erst recht nicht). Und an noch reaktivere Alkalimetalle wie Ceasium kommt ihr als Schule wahrscheinlich gar nicht ran.

    Ein weiterer super Versuch ist die oben bereits erwähnte Knallgasprobe: Wasserstoff in Seifenwasser, die entstehenden Wasserblasen dann auf die Hand nehmen und anschließend anzünden. Das macht das ganze etwas interessanter als das typische lahme Ploppen, weil man dann ne schöne Stichflamme auf der Hand hat ;)
  • in: Kann man phpbench.com trauen?

    geschrieben von nikic

    NEIN! phpbench darfst du unter keinen Umständen blind trauen. Du musst dir immre ganz genau den Benchmark-Code ansehen. Denn viele ihrer Benchmarks sind in einer solchen Art und Weise geschrieben, dass eine Variante stark bevorzugt wird (Auf Anhieb sehe ich da schon, dass bei echo mit Kommas Output Buffering verwendet wird, was natürlich die Ergebnise stark ändert.) Weiterhin versucht der Autor da teilweise Sachen zu messen, die er mit seinen Mitteln gar nicht messen kann (beispielsweise Single vs. Double Quotes. Das Parsen wird da bereits vom zend_language_scanner erledigt der lange vor der Ausführung des Scripts mit der Zeitmessung arbeitet.)

    Aber abgesehen davon: Microptimization ist sehr böse. Es bringt einfach nichts. Solche Benchmarks kann man sich ansehen um PHP-Internals besser zu verstehen, aber auf deinen Code sollten sie eher weniger einwirken.

    Und als Antwort zu deiner zweiten Anmerkung: foreach ist wirklich schneller. Das liegt daran, dass PHP die Array Elemente verlinkt, um ihre Reihenfolge zu speichern. Diese Verlinkung kann von foreach sehr effektiv genutzt werden. Alles andere wie beispielsweise for-Schleifen, erfordern meist, dass für jedes Element zuerst ein Hash gebildet wird, dann in einer HashTable nach dem entsprechenden Bucket gesucht wird und anschließend die verlinkte Liste in dem Bucket abgearbeitet wird, bis das passende Element gefunden wurde.

    Aber auch hier erneut: Du solltest foreach nicht benutzen weil es besonders schnell ist, sondern weil es deinen Code schön lesbar macht und normalerweise auch mehr Möglichkeiten bietet für die Weiterverwendung des Script (foreach kann beispielsweise auch über Traversables iterieren.)
  • in: Atomkraft wird abgeschafft!

    geschrieben von nikic

    Ich habe schon lange aufgegeben Ökos zu erklären, warum ihre Wendung gegen Kernkraft wahrlich destruktiv ist. Daher möchte ich hier nur einen kleinen Link hinterlassen, der vielleicht verdeutlich, dass zumindest die Sicherheit von Kernkraftwerken statistisch unantastbar ist: Tote pro TWh nach Energieform.
  • in: Ein Mathematikerwitz

    geschrieben von nikic

    krisi12345 schrieb:
    hk1992 schrieb:
    Woran merkt man, dass man unter Informatikern ist?
    "Deine Mudda ist wie ein L3 Cache.... 4 Kerne und jeder hat Zugriff!"

    Der is geil xD

    Ja :D

    Und noch einen für Mathematiker: "Sei Epsilon kleiner Null..." (Muss man nicht verstehen.)
  • in: MYSQL abfrage [UTF-8] es entstehen \n \r Filter zwecklos

    geschrieben von nikic

    '\\n' ist keine Leerzeile, sondern der String \n. Wenn du die Leerzeile meinst, schreibe "\n" (Double Quotes!!!).
  • in: PHP Hash Algorythmen

    geschrieben von nikic

    Es gibt einen etabliertes Framework für Passwort Hashes in PHP: http://www.openwall.com/phpass/
    Auf neueren PHP Versionen würde es einen Blowfisch Crypt oder Extended DES verwenden. Auf älteren ein gestrechtes md5.

    Merksatz: Never roll your own crypto. - Gilt zumindest solange man keine Ahnung hat und ich würde mal wagen zu behaupten, dass wir hier alle nicht allzuviel Ahnung von Kryptografie haben ;)
  • in: Frage bzgl. Schleifen

    geschrieben von nikic

    @drafed-map: Wenn du eine Expression a la `expr_left T_IS_NOT_EQUAL expr_right` schreibst, also beispielsweise `$var != ($var = str_replace("\n\n\n", "\n\n", $var))`, dann muss PHP, um die beiden Expressions zu vergleichen, natürlich beide Seiten erstmal ausführen. PHP wird also deine `expr_right` also `$var = str_replace("\n\n\n", "\n\n", $var)` ausführen. D.h. zu dem Zeitpunkt, wo die Expressions verglichen werden, steht auf beiden Seiten `$var`, was logischerweise nicht ungleich sein kann.
  • in: Frage bzgl. Schleifen

    geschrieben von nikic

    Ich verstehe nicht recht was du willst drafed-map. Deine Schleife ist equivalent zu:
    $var = str_replace("\n\n\n", "\n\n", $var);
    while($var != $var) {}

    Da `$var != $var` immer zu `false` evaluiert kann man es auch aufschreiben als:
    $var = str_replace("\n\n\n", "\n\n", $var);


    Was du sicherlich meintest ist:
    $var = preg_replace('\R{3,}', "\n\n", $var);
  • in: Banner erstellen

    geschrieben von nikic

    Verschoben ins Such & Find Forum.
  • in: Welches ist das besere CMS

    geschrieben von nikic

    Verschoben nach Spam, da Sammelthread. Du findest eine sehr umfangreiche Liste mit CMSen hier: http://www.lima-city.de/thread/web-anwendungen-cms-forum-blog-wiki
  • in: Mehrere MySQLi datenbanken - Performance?

    geschrieben von nikic

    Bitte sag nochmal klar, ab du von Datenbanken oder Tabellen redest. Wenn du von Datenbanken redest, dann hast du beinahe sicher ein miskonzepiertes System. Du benötigst für eine Applikation normalerweise nur eine Datenbank.
  • in: sql injection verhindern

    geschrieben von nikic

    Nur um hier mal auszuklären, warum der ' OR 1 -- Trick bei dir nicht geht, obwohl du mysql_real_escape_string nicht benutzt: Auf Lima-City ist ein Feature namen magic_quotes aktiviert. Dieses escaped automatisch alle $_GET, $_POST, $_... Variablen.

    Dennoch sollte man sich auf dieses Feature nicht verlassen. Einerseite kann es seltsame Ergebnisse verursachen, wenn du Daten nicht in die DB einträgst und is zudem auch nicht gänzlich sicher (mysql_real_escape_string beachtet das Encoding der Datenbank und der Verbindung zur Datenbank, magic_quotes kann dies nicht).

    Das normale Vorgehen ist daher meistens zuerst die magic_quotes zu entfernen, sollten sie aktiviert sein und dann immer wenn man etwas in einen SQL Query einfügt es mit mysql_real_escape_string zu escapen. Ich persönlich nutze für letzteres einen kleinen Wrapper, der einem etas Tipparbeit erspart (ist aber PDO MySQL, nicht mysql_): https://github.com/nikic/DB
  • in: Warum Gulden?

    geschrieben von nikic

    Verschoben ins Spam-Forum.
  • in: Wie funktioniert spl_autoload?

    geschrieben von nikic

    Stimmt fast. spl_autoload sucht jedoch nicht den ganzen Webspace ab, sondern nur den include_path. Dieser enthält standardmäßig typischerweise das aktuelle Verzeichnis (.) und den PEAR Ordner. Wenn deine Klasse nicht in einem der beiden Ordner liegt, dann musst den den include_path dementsprechend anpassen:

    set_include_path('./lib/' . PATH_SEPARATOR . get_include_path());
  • in: Stored Functions // hierarchische Abfrage

    geschrieben von nikic

    Vergiss es einfach. Stored Procedures gelten nicht ohne Grund als verpöhnt. Mache das selbe einfach mit einem normalen PHP-Script und cache das Ergebnis, wenn deine Seite denn so beliebt sein sollte. Ich gehe mal davon aus, dass sich deine Navigation nicht alle paar Millisekunden ändert, oder?
  • in: preg_replace Problem

    geschrieben von nikic

    Weiterhin hast du die Anker fehlerhaft positioniert, sie sollten nur im zweiten Teil erscheinen (nach dem |):
    preg_replace('~(?:<a.*?</a>|\[url.*?\[/url]|\[/?[^]]++]|</?[^>]++>)(*SKIP)(*FAIL)|\b'.$this->exp[1].'\b~is', $ersetzung, $string);

    Das `^` am Anfang würde auch nur für den ersten Teil gelten (und ihn damit mehr oder weniger unwirksam machen), das `$` würde nur für den zweiten Teil gelten, also nur die jeweils letzte Occurance ersetzen und auch nur, wenn sie genau am Ende ist (was ja auch passiert ist).
  • in: Sortierung nach Name ohne beachtung Gross/Klein

    geschrieben von nikic

    Benutze dafür die Funktion natcasesort. Sie sortiert in natürlicher Reihenfolge, ohne Beachtung der Groß- und Kleinschreibung.
  • in: Moral und Gesetz

    geschrieben von nikic

    Ich glaube mal, dass der Mensch da einfach unterscheidet, dazwischen, ob das Brechen eines Gesetzes einen sichtbaren Schaden hinterlässt oder nicht. Ich denke nicht mal, dass das besonders viel mit Moral zu tun hat. Wenn ich bei rot über die Straße laufe, weil gerade kein Auto vorbeikommt, dann füge ich niemandem auch nur irgendeinen Schaden zu - genauer gesagt passiert absolut *gar nichts*, außer, dass ich etwas Zeit spare. Wenn ich einen Film herunter lade, dann entsteht ebenfalls kein offensichtlicher Schaden (weil ich der Filmindustrie nicht glaube, dass das denen ernsthaften finanziellen Schaden zufügt). Wenn ich einem Minderjährigen Alk verkaufe, dann sehe ich wahrscheinlich ebenfalls keinen offensichtlichen Schaden entstehen, da ich wahrscheinlich selber gerade mal 18 bin und Alk da eher was spaßiges als was gefährliches an sich hat.
    Wenn man dann im Gegensatz dazu betrachtet, jemanden zusammenzuschlagen, eine Bank auszurauben oder jemanden zu ermorden, entsteht ich ein denke ich sehr offensichtlicher Schaden. Daher ist das auch etwas, wovon die meisten absehen würden ;)
  • in: Wie kann man eine homepage wie twitter erstellen

    geschrieben von nikic

    Verschoben nach Spam, auf Grund der äußerst hochwertigen Fragestellung.
  • in: Wie kann ich die Homepage verlinken

    geschrieben von nikic

    Verschoben nach Spam, auf Grund der äußerst hochwertigen Fragestellung.
  • in: Datei nur durch ID laden

    geschrieben von nikic

    Einfacher Tipp: Mach es nicht mit der ID ;) Wenn du kannst, lass die ID sogar eher ganz weg (wenn die Dateinamen sonst eindeutig sind). index.php?page=34 sagt einem doch viel weniger als index.php?page=Startseite, oder? Kannst du sogar über path_info noch verschönern zu index.php/Startseite. Oder sogar über .htaccess das index.php einsparen und nur noch /Startseite schreiben :)

    Also, gibt es irgendeinen Grund, warum du gerade nur IDs haben willst und nicht eher umgekehrt?
  • in: .csv Dateien Datensatzweise auslesen?

    geschrieben von nikic

    PHP bietet zu diesem Zweck eine spezielle Funktion fgetcsv.
  • in: Man ey ..

    geschrieben von nikic

    Ich weiß zwar nicht, wofür ich Downloadvolumen brauchen könnte, aber ich hab mal drauf geboten :P *gaaaaanz fies sei*
  • in: Platzhalter?

    geschrieben von nikic

    In diesem Fall hast du mehrere Optionen. Was in diesem Fall nutzen würde, ist ein "regulärer Ausdruck":
    if (preg_match('~^xy~', $_GET['bsp'])) {
    
    }

    '~^xy~' matcht jeden String, der mit xy anfängt (^). (Die ~~ sind nur ein notwendiger Formalismus).

    Es gibt aber noch einige Alternativen:
    if (0 === strpos($_GET['bsp'], 'xy')) {
    
    }

    Oder:
    if ('xy' == substr($_GET['bsp'], 0, 2)) { // 2 ist die Länge von xy
    
    }
  • in: Platzhalter?

    geschrieben von nikic

    Könntest du da etwas konkreter werden? Meinst du sowas wie, du schreibst:
    <?php
        %
    ?>

    und `%` ersetzt sich dann automatisch durch den Code, der genau das macht was du willst. Oder wie meinst du das?
  • in: Hack mich!

    geschrieben von nikic

    So, nachdem lucas9991 mithilfe von ftp_get es geschafft hat, die Sandobx zu schrotten, ist sie nun wieder online :)

    Und diesmal findet ihr keine Lücke mehr :P
  • in: Frage zu Besucherzahlen

    geschrieben von nikic

    Nur um nochmal sicher zu gehen: Fragst du dich, warum es nur so wenige Zugriffe sind (10k in einem ganzen Monat sind verdammt wenig. Auf der Seite, die ich betreibe, haben wir monatlich etwas mehr als 2 Mio. Zugriffe und Seiten wie Lima haben da noch deutlich mehr) oder warum es so viele sind (weil du davor weniger hattest)?
  • in: Atom-Endlager

    geschrieben von nikic

    Nach deiner Rechnung wäre also ein Schießen ins All eine Lösung? Deine Zahlen sagen zumindest, dass der Energieaufwand dafür nur ein Bruchteil der Energie ist, welche das Material liefert, und dass die Entsorgung auch nur einen Bruchteil dessen kostet, was da an Strom produziert wird.
  • in: Automat umsetzen

    geschrieben von nikic

    HTML5 ist eine sehr gut definierte Sprache: http://www.whatwg.org/specs/web-apps/current-work/multipage/parsing.html
    Dort wird alles abgehandelt, von der Bestimmung des Chracter Sets, über das Tokenizen und bilden des Syntax Trees, bis hin zu korrekter Handlhabung von inkorrekter Verschachtlung. Wenn du also einen HTML Parser schreiben willst, dann ist die ganze Arbeit eigentlich schon für die getan, du musst es nurnoch in eine für Java Verständliche Form bringen ;) Aber ansonsten: Es gibt auch so bereits stabile HTML 5 Parser in Java. Du solltest am besten einen von denen verwenden.
  • in: 1

    geschrieben von nikic

    einfach ein paar tage lang nicht drauf antworten, dann wird das design schon wieder :P
  • in: 1

    geschrieben von nikic

    Oke, Lima Titel sind scheinbar varchar(120) mit maxlength=60.
  • in: 1

    geschrieben von nikic

    Nur ein Teeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeest
  • in: Floating-Point-Bug

    geschrieben von nikic

    Lima City nutzt zur Zeit PHP 5.2.17, d.h. der Bug tritt hier nicht auf. Weiterhin läuft Lima-City auf 64-Bit-Servern, die von vornherein nicht von diesem Fehler betroffen sind.
  • in: Seite ist leer?

    geschrieben von nikic

    if (isset($_POST['send_register'))

    Hier fehlt ein ].

    Für nächstes mal: Bevor du hier auf Lima eine Frage stellst, setze error_reporting auf -1 und display_errors auf true und stelle sicher, dass du keine Fehler bekommst.
  • in: Objekt nach Aktualisierung

    geschrieben von nikic

    @pantherstyle: Ja, das ist genau das Problem. Du denkst zu sehr Java. In PHP packst du deine persistenten Daten in die Datenbank. Und rufst sie von dort jedes Mal ab. Variablen wirklich persistent zu machen, ist nur in den seltensten Fällen sinnvoll und in solchen Fällen benutzt du dann einen Memory-basierten Cache wie APC.

    Ich zumindest habe nachwievor nicht verstanden, was dir persistente Variablen bei deinem Programm bringen. Wo liegt das Problem, wenn du die Datenbankverbindung jedes Mal neu erstellst? Oder wenn du die Pagination Klasse jedes mal neu instanziierst? Aus deiner aktuellen Beschreibung geht nicht wirklich hervor, was da nicht geht. (Auch wenn ich eine blasse Ahnung habe, dass du gerade ohne Front-Controller arbeitest und das eventuell dein Problem sein könnte...)
  • in: Variable global verfügbar machen

    geschrieben von nikic

    Das ist ein geläufiges Problem und man hat auch bereits viele Lösungen dafür gefunden. Dependency Injection ist ein Beispiel hierfür. Grundidee ist, dass alle für die Funktionalität einer Klasse benötigten Variablen "injected" werden.

    Aber es gibt auch deutlich einfachere Design Pattern als DI (welches normalerweise ein größeres Framework erfordert, um einigermaßen nutzbar zu sein), zumindest solange man recht wenige globale Variablen benötigt. Die meiner Meinung nach einfachste Variante ist die Registry. Eine Möglichkeit diese zu implementieren sind öffentliche statische Eigenschaften in einer Klasse:
    class R {
        public static $db;
        public static $session;
        public static $user;
        public static $tplData;
        public static $tplName;
        // ...
    }
    
    R::$db->query();
    
    doQuery();
    function doQuery() {
        R::$db->query(); // YES, it does!
    }
  • in: Verbindung zu zwei MySQL Datenbanken gleichzeitig

    geschrieben von nikic

    Wenn eine der beiden Datenbankverbindungen weniger genutzt werden soll als die andere, könntest du die weniger genutzt zuerst erstellen und die normalerweise genutzte anschließend. Wenn du nun den $connection Parameter weglässt, wird automatisch die letzte erstelle DB-Verbindung genutzt, also die normalerweise genutzte ;) Wenn du nun die andere, selten genutzte DB-Verbindung benötigst, musst du natürlich die entsprechende $connection angeben.

    Noch besser wäre es natürlich eine objektorientierte MySQL-Klasse zu nutzen (PDO MySQL), welche du dann über $db1->query() / $db2->query() respektive nutzt.
  • in: Objekt nach Aktualisierung

    geschrieben von nikic

    @sneppa: Eigentlich sollte eine __PHP_Incomplete_Class nur entstehen, wenn die Klasse zum Zeitpunkt des unserializens nicht verfügbar ist. Um das Problem von Klassen-Autoloading zu lösen wird die ini-Option unserialize_callback_func geboten, damit Klassen vor dem unserializen noch geladen werden können.

    @wagerm: Das ist ein optionales Argument. Wenn du es nicht angibst, wird die letzte über mysql_connect erstellte Datenbank-Instanz erstellt.

    @all: Man kann Resources generell nicht cachen. Eine MySQL-Connection in einer Session zu speichern ist technisch nicht möglich.

    @pantherstyle: Ich habe die Befürchtung, dass du gerade etwas in die falsche Richtung denkst (ich bin mir aber nicht ganz sicher). Möchtest du die Datenbankverbindung / Pagination-Klasse Seiten übergreifend machen, damit du einen Performance Gewinn bekommst? Wenn das deine Absicht ist, dann vergiss das mit der Session lieber wieder ;) PHP ist nicht so langsam, dass das erstellen eines Objekts oder das Verbinden zu einer Datenbank irgendeinen Einfluss auf deine Performance nehmen könnte. Was du aber vielleicht machen möchtest, ist, eine persistente Datenbankverbindung zu erstellen (ich glaube mysql_ bietet dies noch nicht, aber mysqli und PDO MySQL können dies in jedem Fall). Dabei wird die Datenbankverbindung in einem Connection Pool gecacht und immer wieder verwendet. (Bedenke aber, dass dies je nach genauem Nutzungszweck auch Komplikationen schaffen kann. Transactions, Locks oder direkte Handler-Zugriffe könnten dabei problematisch werden.)

    Also, könntest du nochmal genauer sagen, was du damit bewirken willst? Ich habe die Vermutung, dass du da versuchst ein Problem zu beheben, dass gar nicht existiert.
  • in: preg_split count

    geschrieben von nikic

    Das Problem an deinen urprünglichen Ansatz war übrigens nur ein fehlendes Fragezeichen.
    $count = 0;
    while ($row .....)) {
    $count += preg_match_all('~\[a].*?\[/a]~i', $row['message'], $matches);
    }
    
    echo $count;

    Das Fragezeichen hinter dem `.*` macht das ganze ungreedy, d.h. PCRE matcht nicht den längsten möglichen String (der ja von dem ersten [a] bis zum allerletzten [/a] gehen würde), sondern den kürzesten.
  • in: Array ohne Numerische Keys (doppelt) ?

    geschrieben von nikic

    Die mysql-Extension (die du heutzutage sowieso auf keinen Fall mehr nutzen solltest - nutze stattdessen PDO MySQL) bietet drei Funktionen und Daten zu fetchen. mysql_fetch_num fetcht die Daten in ein numerisches Array, mysql_fetch_assoc in ein assoziatives Array (das ist das was du haben willst) und mysql_fetch_array das beides kombiniert ;)

    Also, benutze einfach mysql_fetch_assoc.
  • in: php-code ,Vverschlüsselung

    geschrieben von nikic

    Absolut (und mit absolut keine ich auch absolut!) unmöglich. Jeder halbwegs gute Programmier braucht höchstens fünf Minuten um jegliche von dir verwendete "Verschlüsselung" (meistens nur ein base64 Encoding...) wieder in Klartext-PHP umzuwandeln.

    Stattdessen solltest du deinen Code entsprechend lizenzieren. Mehr wirst du nicht tun können.

    PS: Unter dem Thema ist so ein Dropdownmenü, wo die Option "Titel änden" drin ist ;)
  • in: Ist dieses Buch gut für den Anfang

    geschrieben von nikic

    @metalmachine: Man benutzt auch für kleinere Projekte PDO. Es hat keinen nennenswerten Overhead ;) Zudem ist PDO deutlich einfacher zu nutzen (bis auf die Herstellung der DB-Verbindung vielleicht).

    Aber genau ist das Problem. Du dienst als gutes Beispiel. Man hat dir beigebracht mysql_ zu benutzen. Und jetzt nutzt du es auch und findest irgendwelche Ausreden PDO nicht zu benutzen. Kleine Projekte, Bla Bla Bla. Jemanden, der vorher mysql_ benutzt hat, kannst du nur schwer davon überzeugen PDO zu benutzen. Viele sehen nicht ein, dass das wechseln der Datenbank gar nicht so unüblich ist. Viele sehen auch nicht ein, was es ihnen nun bringen soll, wenn ein PDOStatement Traversable ist. Usw. Leute sind sehr stur bezüglich der Programmiersprache die sie nutzen, bezüglich des Frameworks oder gar bezüglich der Datenbank-Klasse... Daher sollte man ihnen gleich beibringen die richtige zu nutzen. Später könnte es zu spät sein ;)
  • in: Ist dieses Buch gut für den Anfang

    geschrieben von nikic

    Auf den ersten Blick sieht es gut auf - PHP 5.3, MySQL 5.4, das ist so ziemlich der neuste Stand (auch wenn MySQL schon bei 5.5 ist...) - aber ein kurzer Blick in die Leseprobe sollte dir sagen: NEIN, Tu es Nicht!

    Ein Buch, das dir heutzutage beibringt die `mysql_` Funktionen zu nutzen, kann nichts gutes bedeuten. Es bringt dir reichlich wenig, wenn man dir von den Wundern von PHP 5.3 erzählt - Namespaces, Closures und Late Static Bindings -, welche du wahrscheinlich zu Anfang sowieso weder verstehen wirst, noch sie praktisch einsetzen kannst, anstatt dich über die Realität aufklärt. Und die Realität ist nunmal, dass man auf Datenbanken nicht mit mysql, nicht mit mysqli, sonder mit PDO MySQL zugreift. Und die Realität ist nunmal auch, dass man eine Template-Engine verwendet (auch wenn diese PHP selbst ist). Und die Realität ist, dass man MVC benutzt.

    Also, wenn du die Syntax von PHP lernen willst, dann ist das sicherlich ganz nett. Aber für was ernsthaftes - naja.
  • in: Alle Links in neuem Tab

    geschrieben von nikic

    Wow. Man muss schon sehr starke motorische Störungen haben, wenn es für einen zu schwer ist, den linken Finger etwa einen Zentimeter nach rechts zu bewegen und auf das Mausrad anstelle der linken Maustaste zu klicken...
  • in: basic von php

    geschrieben von nikic

    Es ist durchaus hilfreich, eine Sprache erstmal zu lernen (zumindest ansatzweise!), bevor man versucht mit ihr zu arbeiten. Verschoben ins Spam-Forum.
  • in: Für wen gilt das Grundgesetz?

    geschrieben von nikic

    Verstoßen Behörden beispielsweise gegen den Grundsatz der Selbstbindung der Verwaltung, der sich aus Art. 3 Abs. 1 GG ergibt, so können betroffene Bürger Klage erheben. Das Verfassungsgericht ist in diesem Fall nicht zuständig, da der Verwaltungsrechtsweg eröffnet ist.

    Verstehe ich nicht recht. Was ist "Selbstbindung der Verwaltung" und was hat das mit der Gleichheit vor dem Gesetz (Art. 3 Abs. 1 GG, den du erwähnst) zu tun? Und warum ist das VerfG in diesem Fall nicht zuständig?
  • in: Für wen gilt das Grundgesetz?

    geschrieben von nikic

    @thoba: Okay, das ist alles was ich wissen wollte. Das Grundgesetz bindet also nur den Staat. Mich kann der Staat dann durch Gesetze binden, welche dem Grundgesetz entsprechen.
  • in: Für wen gilt das Grundgesetz?

    geschrieben von nikic

    Was sich mir bis jetzt noch nicht wirklich erschlossen hat, ist für wen das Grundgesetz eigentlich gilt. Art. 1 Abs. 3 GG bindet die gesetzgebenden, vollziehenden und rechtssprechenden Gewalten. Von Personen ist aber nie die Rede.

    Kann also nur der Staat gegen das Grundgesetz verstoßen oder auch Ich, als natürliche Person?
  • in: Sicherheitslücken mit PHP und MySQL

    geschrieben von nikic

    @fabo: Man benutzt ctype_digit. Nur damit das hier mal klar ist. Man benutzt nicht is_numeric. Man benutzt nicht /^[0-9]+$/. Man benutzt nicht filter_var. Man benutzt ctype_digit.

    Wollte ich nur mal gesagt haben ;)

    Und damit ist auch zu hier. Über Sicherheit von PHP-Applikationen haben wir haufenweise Themen und im Internet finden sich sehr viele gute Informationen dazu. http://cwe.mitre.org/top25/: XSS und SQLI stehen natürlich an oberster Stelle, aber auch vor vielen anderen Sachen muss man sich schützen. CSRF, Overflows, ...
  • in: fresh style 2 my blog

    geschrieben von nikic

    Du musst nicht bei jeder kleinen Änderung an deiner Website ein neues Thema erstellen - dein vorheriges ist noch ganz oben!

    Somit geschlossen.
  • in: I need a MySQL database

    geschrieben von nikic

    Verschoben ins Spam-Forum, da keine Diskussionsgrundlage.
  • in: Regex gesucht

    geschrieben von nikic

    Ah, ich glaube ich habe jetzt verstanden, was du möchtest. Du solltest die URL im Text dann mit Regex ersetzen, mithilfe von
    $text = preg_replace('~' . preg_quote($matches[2], '~') . '(?=\']|]|\[/url])~i', $replacementText, $text)

    Mir fällt jetzt auf Anhieb kein Fall ein, wo das falsche Ergebnisse liefern würde.
  • in: Regex gesucht

    geschrieben von nikic

    Ich habe das noch nicht recht verstanden. Möchtest du nur URLs ohne darauf folgenden Pfad ersetzten? Oder willst du wirklich ausnahmslos alle URLs durch einen String ersetzen, außer die URL ist irgendwas bestimmtes? Falls letzteres: Iterier einfach durch die Blacklist durch und seh ob die URL = Blacklist-String ist. Wenn nein, dann ersetze.
  • in: PHP 5.3.5 Function eregi_replace() is deprecated

    geschrieben von nikic

    Die Fehlermeldung sagt es doch: eregi_replace ist deprecated :D Stattdessen solltest du preg_replace verwenden.
  • in: Regex gesucht

    geschrieben von nikic

    Heh, du forderst aber viel :D Gut, nächster Versuch:
    preg_match_all(
            '~
            (?(DEFINE)
                (?<URLContent>
                    [^[]*+
                    (?:           
                        \[
                        (?!/url])
                        [^[]*+
                    )*+
                )
            )
            \[url
            (?|]([^[]++)
              |=\'([^\']++)\'] (?&URLContent)
              |=([^]]++)]      (?&URLContent)
            )
            \[/url]
            ~x',
            '[url]http://www.lima-city.de[/url]
            [url=\'http://www.lima-city.de\']Lima-City[/url]
            [url=http://www.lima-city.de]Lima-City[/url]
            [url=\'http://www.lima-city.de\'][b]Lima-City[/b][/url]
            [url=http://www.lima-city.de][i]Lima-City[/i][/url]',
            $matches
        );
        echo '<pre>';
        var_dump($matches);


    Achtung: Das gibt dir jetzt die URLs in $matches[2] statt 1. Das (?<URLContent>) ist zwar in nem DEFINE Conditional, aber dennoch ist es ne Capturing Group wie jede andere ;)
  • in: Regex gesucht

    geschrieben von nikic

    @fabo: Ja, habe meinen Regex nun angepasst (und habe das String-Escaping rausgenommen, das ist wahrscheinlich sowieso unerwünscht). Die Ausgabe ist nun:
    array(2) {
      [0]=>
      array(3) {
        [0]=>
        string(34) "[url]http://www.lima-city.de[/url]"
        [1]=>
        string(46) "[url='http://www.lima-city.de']Lima-City[/url]"
        [2]=>
        string(44) "[url=http://www.lima-city.de]Lima-City[/url]"
      }
      [1]=>
      array(3) {
        [0]=>
        string(23) "http://www.lima-city.de"
        [1]=>
        string(23) "http://www.lima-city.de"
        [2]=>
        string(23) "http://www.lima-city.de"
      }
    }


    Zu deinem zweiten Problem: Ah, jetzt verstehe ich. Ich dachte du willst nicht, dass X innerhalb des Tags steht im Sinne von <a>X</a>, nicht im Sinne von <X>.

    Okay, das ist ein nicht mehr ganz einfaches Problem. Ich würde es mit ein wenig schwarzer Magie lösen:
    '~(?:\[/?[^]]++]|</?[^>]++>)(*SKIP)(*FAIL)|X~'
  • in: Regex gesucht

    geschrieben von nikic

    Zu deinem zweiten Problem:
    '~\[url(?|]([^[]++)|=\'([^\']++)\'][^[]++|=([^]]++)][^[]++)\[/url]~'

    Wenn ich mich nicht vertippt haben sollte, sollte dir das die URL immer in $matches[1] packen.

    Was dein erstes Problem angeht, brauche ich mehr Infos: Können die HTML Tags oder die BB Tags verschachtelt sein? Wenn ja, auch untereinander? Wie valide ist die Eingabe? Sind die HTML Tags XML konform? Sind alle Tags in der richtigen Reihenfolge geschlossen?
  • in: Lichtgeschwindigkeit = Maximum für normale Materie?

    geschrieben von nikic

    drafed-map, wenn du von dem Verhalten von Zeit und Materie bei annähernder Lichtgeschwindigkeit sprichst, dann kannst du nicht mehr mit den Mitteln der klassischen Mechanik argumentieren. Es ist einfach anders

    Ich habe davon auch nicht viel Ahnung, aber ich habe mir kurz mal den Wikipedia-Artikel zum Thema Lichtgeschwindigkeit angesehen. Interessant für dich sein sollte der Abschnitt Teilchenphysik und Lichtgeschwindigkeit. Dort steht, dass die Energie von massebehafteten Körpern (wir sprechen die ganze Zeit von Körpern mit einer Ruhemasse. Wenn sie keine Masse besitzen, ist wieder alles anders ^^) bei Annäherung an die Lichtgeschwindigkeit unendlich wird. D.h. Um 500km/h vor der Lichtgeschwindigkeit eine Kugel mit 1000km/h abzuschießen, bräuchtest du unendlich viel Energie. Das ist der Grund, weshalb du einen Körper nicht auf Lichtgeschwindigkeit beschleunigen kannst, du kannst du Energie nicht aufwenden.
  • in: brauch eure hilfe

    geschrieben von nikic

    Verschoben ins Such & Find Forum.
  • in: Team Mitglied für Browsergame Entwicklung gesucht

    geschrieben von nikic

    Verschoben ins Such und Find Forum.

    Wenn du die folgenden drei Fragen noch beantworten könntest, würdest du die Entscheidung für viele sicherlich einfacher machen:
    a) Benutzt ihr git?
    b) Benutzt ihr PHPUnit und wie hoch ist eure Code Coverage?
    c) Haltet ihr euch an den Zend (oder PEAR) Coding-Standard?
  • in: Inline Dateien

    geschrieben von nikic

    trueweb schrieb:
    kostenlose-javascripts schrieb:
    Könnte mir vorstellen, dass es dann auch mit href geht. Ich werds mal ausprobieren......


    Wie soll das denn funktionieren? Ein Link fügt keine Datei ein sondern durch diesen kann man eine Datei aufrufen (hypertext-reference)....

    trueweb, ein Blick in den Standard (HTML5) würde dir zeigen, dass in @href eine "valid URL potentially surrounded by spaces" erlaubt ist, wobei eine "valid URL" unter anderem eine "valid URI reference [RFC3986]" sein kann. Nach genannter RFC ist eine URI eigentlich alles, was mit einem "scheme" gefolgt von einem Doppelpunkt beginnt. Darunter fallen sowohl "data:" als auch "javascript:" (deine Aussage in einem anderen Thread war folglich ebenfalls falsch).
  • in: Wie aktiviere ich BB- Codes?

    geschrieben von nikic

    @satoforum: Du hast eigentlich auch Recht. Es gibt unzählige BBCode-Funktionen, -Klassen und -Librarys da draußen. Tausende. Die Kunst ist, die richtige zu finden, die für deine Anwendungen passend ist. Es macht wenig Sinn irgendeine riesige Super-Duper-BB-Code-Library mit 150 Dateien einzubinden, wenn du doch eigentlich nur was einfaches haben willst ;) Daher schreibe ich am besten die BB-Codes einfach selbst. Wenn man einigermaßen mit PCRE umgehen kann, ist das kein Problem.
  • in: Webseite streamen

    geschrieben von nikic

    misterbastis Variante geht natürlich auch, aber ... warum einfach, wenns auch kompliziert geht?
    $code = file_get_content($url);

    gitb dir den Quelltext der Seite. Du kannst über stream_context_create sogar zusätzliche Header schicken, Timeouts festlegen, usw.
  • in: MD5 und Salt

    geschrieben von nikic

    Ich sehe weiterhin eine theoretische Gefahr, die ich allerdings nicht beurteilen kann.
    Kann es passieren, dass sich durch n viele Verschlüsselungsschritte, die Schlüssel mit jedem Schritt immer ähnlicher werden?
    Die Verschlüsselungen md5 hat Kollisionen, deshalb müsste theoretisch nach unendlich vielen Schritten zum Schluss sehr ähnliche Schlüssel heruaskommen.
    Beispiel:
    1) aaa -> aab -> ... -> baa (Kollision) -> aab
    2) bbb -> bab -> ... -> aaa (Kollision) -> aab

    Ja, diese Gefahr besteht. Du musst aber bedenken, dass die Anzahl der Kollisionen nur linear zunimmt. Und da die Wahrscheinlichkeit von Kollisionen bei Hashalgorithmen sehr gering ist, so ist dies auch bei hunderttausend Iterationen noch kein Problem. Dennoch kann es sinnvoll sein dem entgegenzuwirken, indem man den Salt bei jeder Iteration anhängt, nicht nur ganz am Anfang.

    Das tue ich auch in dem Snippet, das ich unten gepostet habe:
    function pwHash($string, $salt, $runs = 100, $algorithm = 'sha512) {
        // some nice big salt
        $salt = hash($algorithm, $salt);
    
        // apply $algorithm $runs times for slowdown
        while ($runs--) {
            $string = hash($algorithm, $string . $salt, $raw);
        }
    
        return $string;
    }
  • in: MD5 und Salt

    geschrieben von nikic

    Ich halte bisher folgendes Verfahren ausreichend sicher:
    - ein festdefinierten Salt S wird im PHP Script festgelegt
    - alle Passwörter werden in der Datenbank, wie folgt abgelegt: md5 (Passwort . Salt)

    - beim Login des Benutzers
    - PasswortLoginMD5 := md5 (PasswortDesLogin . Salt)
    - PasswortLoginMD5 == PasswortDatenbank => Passwort korrekt

    Wenn nun der Angreifer Lesezugriff auf die Datenbank hat, muss er den Salt herausfinden, um sich einloggen zu können.
    Der Angreifer kann zwar eine Kollision finden (md5(Kollision) == PasswortDatenbank), wenn er sich nun aber mit Kollision anmeldet, dann wird md5(Kollision.Salt) im Skript erzeugt und das ist wieder nicht gleich PasswortDatenbank

    So, ich versuche dann mal zu zeigen, warum dein aktuelles System nicht ausreichend ist.

    Fangen wir da an, wo wir ankommen wollen, bei den Zielen. Wofür ist dieses ganze rumgesalte überhaupt gut, was wollen wir damit erreichen?
    1. Wir wollen verhindern, dass eine Rainbow-Tabelle (eine Tabelle mit Hash => Ursprungstext Zuordnungen) genügt, um an alle Passwörter in allen Passwort-Datenbanken der Welt heranzukommen. Ein applikationsspezifischer Salt (diesen nutzt du) verhindert dies effektiv. Man kann nicht mehr eine Rainbow-Tabelle nutzen, um alle Passwörter der Welt herauszubekommen. Huh. super!
    2. Wir wollen verhindern, dass eine Rainbow-Tabelle genügt, um alle Passwörter in unserer Datenbank wiederherzustellen. Der Applikationsspezifische Hash wird hier kläglich versagen, denn er ist für alle User und Passwörter gleich. Eine Rainbow-Table für die ganze Datenbank ist bei der Geschwindigkeit moderner Computer wirklich kein Problem. Daher müssen wir nun einen userspezifischen Salt verwenden. Durch diesen muss für jeden Hash in der Datenbank eine Dictionary-Attacke durchgeführt werden. Okay, also, lasst uns etwas ganz userspezifisches nehmen, sagen wir mal den Username?
    3. Wir wollen verhindern, dass mehrere Rainbow-Tabellen genügen, um viele Passwörter reversieren zu können. Das Problem an der vorherigen Technik ist, dass viele Usernamen nunmal häufig vorkommen. Darunter fallen "admin", "root" genauso wie "peter" oder "peter1". Wenn man also mehrere Passwort-Datenbanken vorliegen hat, die den Username als Salt benutzen, dann kann man jeweils alle User mit dem Namen "peter" gleichzeitig angreifen und somit die Attacke ungemein optimieren. Was tut man dagegen? Man benutzt einen zufälligen Salt, der nichts mit dem Usernamen, seiner Id, Email oder sonstige zu tun hat.

    Ja, das ist ja alles schön und gut, aber es hat doch sowieso niemand Zugriff auf meinen PHP-Code. Es reicht doch, wenn der geheime Salt im PHP-Code steht und für alle gleich ist. Kennt doch niemand, ist sicher. Naja. Auf die Datenbank hast eigentlich auch nur du Zugriff ;) Wenn man die Datenbank übernehmen kann, dann ist PHP oder gar der ganze Server nicht weit ;) Was du betreibst ist Security By Obfuscation und wird nicht als Sicherheit anerkannt ;)

    So, gehen wir aber noch ein wenig weiter: Mit guten Salts zwingen wir den Angreifer dazu eine Dictionary-Attacke für jedes einzelne Passwort in der Datenbank durchzuführen. Das dauert doch ewig! Nein. Computer sind verdammt schnell. MD5 ist verdammt schnell. SHA1 ist verdammt schnell. Man kann Millionen von md5-Hashes pro Sekunde generieren [für diese Zahl habe ich keine Belege :P]. Daher setzt man mittlerweile gehäuft eine Technologie Namens Key Stretching ein. Dabei wird der Hash-Algorithmus nicht einmal angewandt, sonder hundert oder tausendfach. Dies erzeugt eine minimale und vernachlässigbare Verzögerung beim Login, aber verlangsamt die Attacke um hundert beziehungsweise tausend Mal! Wenn der Angreifer vorher eine Millionen Hashes pro Sekunde generiert hat, so sind es nun nurnoch Tausend.

    Noch Fragen?
  • in: MD5 und Salt

    geschrieben von nikic

    misc schrieb:
    Jetzt wollen wir ja nicht in einen Flamewar kommen aber du hast gesagt man könne nur mit einem Hash ohne Ursprungspasswort eine Zeichenfolge herausfinden, die den gleichen Hash hat, was bis heute einfach und simpel unmöglich ist.

    Du hast Wikipedia falsch verstanden. Man kann für einen Hash in vernachlässigbarer Zeit einen Ausgangstext finden, der diesen Hash besitzt, aber nicht zwangsweise dem Ursprungstext entspricht. Für Passwörter ist das aber uninteressant, da man ja nicht Zugriff zu deiner vollkommen unwichtigen, niemanden interessierenden Seite erlangen will, sondern versucht mit dem selben Passwort Zugriff zum Email-Konto, usw. zu erlangen.

    Und nein, der Hash des Passworts eignet sich nicht als Salt. Du hast scheinbar noch nicht wirklich verstanden wofür der Salt da ist: Er dient dazu, damit nicht eine Rainbow Table genutzt werden kann, um eine ganze Passwortdatenbank auszuhebeln. Wenn man nun aber den Hash des Passworts als Salt nimmt, dann gilt MD5(MD5(PW).PW) == MD5(MD5(PW).PW). So offensichtlich das jetzt auch klingen mag (was klar zeigt, das du absolut keine Ahnung von der Sache hast und daher fabo nicht selbiges unterstellen solltest!), sagt uns das, dass der Hash für das selbe Passwort immernoch gleich bleibt und somit eine Rainbow Table für die ganze Datenbank genutzt werden kann.

    Also, wie ihc oben bereits erwähnt habe, muss der Salt für jeden User verschieden sein und möglichst zufällig.
  • in: MD5 und Salt

    geschrieben von nikic

    Gut, ich habe schon oft genug immer das selbe zu diesem Thema geschrieben, daher jetzt nur in Stichpunkten, ohne große Begründung:

    * Benutze md5 nicht, stattdessen nutze sha1 oder noch besser sha512
    * Der Salt muss für jeden User verschieden sein. Wenn du willst, kannst du einfach den Usernamen nutzen. Ein zufallsgenerierter Salt ist natürlich besser, da er bei Cross-Domain-Attacken deutlich mehr im Weg steht, aber wenn du dir die Mühe nicht machen willst, ist der Username genügend.
    * Du solltest deinen Key stretchen, d.h. mehrere Iterationen durchführen, um den Prozess zu verlangsamen.

    function pwHash($string, $salt, $runs = 100, $algorithm = 'sha512) {
        // some nice big salt
        $salt = hash($algorithm, $salt);
    
        // apply $algorithm $runs times for slowdown
        while ($runs--) {
            $string = hash($algorithm, $string . $salt, $raw);
        }
    
        return $string;
    }
  • in: Mysql Zugriff/Php Skriptausführung performance schwankt.

    geschrieben von nikic

    Ein Table (MyISAM) oder Row (InnoDB) Lock erfolgt normalerweise nur, wenn du in die Datenbank schreibst, nicht wenn du aus ihr liest. Schreibt eines deiner Scripte in die Datenbank?

    €dit: Wenn du also eine Applikation hast, mit der sehr viele User viele Daten in die Datenbank schreiben, solltest du unbedingt auf InnoDB umstellen, weil es deutlich besseres Lock-Verhalten aufweist.
  • in: Armut vs. Verschwendung

    geschrieben von nikic

    Es gibt Menschen auf der Welt die hungern. Kinder und Erwachsene.
    Arbeitslose die keine Chance auf einen Job habe und von der Hand in den Mund leben.

    Steck diese zwei Sachen niemals in einen Topf! Wenn du von hungernden Kindern sprichst, dann sprichst du von der dritten Welt. Sowas gibt es in Deutschland nicht. Hier muss ein Arbeitsloser nur dann hungern, wenn er es für nötig hält eine High-Tech Entertainment Anlage einzurichten. Sowas wie Hungernot gibt es in Deutschland nicht und darüber zu reden ist Ignoranz und Blasphemie.
  • in: Star Rating Tabellen Frage

    geschrieben von nikic

    Erstelle eine Tabelle mit den Spalten user_name (oder user_id, wenn du IDs benutzt), entry_id (die ID des Eintrags der bewertet wird, was auch immer es ist), rating. Erstelle einen PRIMARY(user_name, entry_id), um zu verhindern, dass ein User mehrfach votet. Um die Votes für einen Eintrag zu bekommen mache `SELECT AVG(rating) FROM ratings WHERE entry_id = xxx`.
  • in: PHP include

    geschrieben von nikic

    @alexxus: Ohne die Seite je gesehen zu haben, kann ich dir dennoch sagen, worans lag: Die Datei wurde wohl als UTF-8 mit BOM (Byte Order Mark) erstellt. Damit kommt PHP überhaupt nicht klar und gibt diese drei Zeichen aus ;)
  • in: Hilfe!

    geschrieben von nikic

    Keine Diskussionsgrundlage -> verschoben ins Spam-Forum.
  • in: Was gehört/muss in das Impressum?

    geschrieben von nikic

    Thema geschlossen, da wir nicht das Recht haben, auf diese Frage zu antworten. Wende dich an einen Anwalt.
  • in: .htaccess

    geschrieben von nikic

    Geschlossen, da zu offene Fragestellung.
  • in: Geschwindigkeit: SQLite, MySQL, PDO

    geschrieben von nikic

    Vorab: MySQL + PDO.

    MySQL ist schneller als SQLite. Man kann jetzt wild mit Benchmarks um sich schmeißen, wo man dann sieht, dass SQLite in den und den Fällen dann schneller ist als MySQL, aber das ist die grundlegende Tatsache: MySQL ist schneller.
    Der einzige Grund SQLite zu verwenden, ist normalerweise, dass kein MySQL vorhanden ist. Einige Desktopanwendungen wie Firefox beispielsweise nutzen SQLite. Einfach weil es "Lite" ist. Man kann ja wohl kaum parallel zu Firefox noch MySQL mit 20 Prozessen starten.

    Warum PDO? Klar, du wirst nie das Datenbanksystem ändern. Das sagen sie alle. Ist halt nur blöd, wenn man dann doch von sqlite auf mysql umsteigen will und dann viel Spaß hat den ganzen Code umzuschreiben ;) Wirklich, Datenbanksystemänderungen sind nichts seltenes. Man sollte nicht sagen "Trifft mich sowieso nicht". Weiterhin bietet PDO eine deutlich nicere API und erlaubt Sachen, die mysqli nicht kann (ich muss aber zugeben, ich bin da nicht auf dem neusten Stand. Vielleicht kann mysqli mittlerweile auch in Klassen und eigene Objekte fetchen oder per Iterator über Datensätze iterieren.) Um die Geschwindigkeit solltest du dir an dieser Stelle keine Sorgen machen. Normalerweise wird die Geschwindigkeit von Webanwendungen durch die Geschwindigkeit deiner Datenbankabfragen bestimmt ;)

    Übrigens. Ich habe für PDO eine Mimi-Wrapper Klasse (90 Zeilen Code), die all deine Escaping Probleme behebt: DB.
  • in: Sauberer PHP/HTML Programmierstil

    geschrieben von nikic

    @hemiolos: Dann habe ich wahrscheinlich nicht gut genug erklärt, wie das funktioniert: Diese Regex Sachen, werden nur ein einziges Mal gemacht, um den PHP-Template-Code zu generieren. Dieser wird anschließend gecacht (normalerweise sogar über APC im Arbeitsspeicher).
    Wie lange der Vorgang des Generierens dauert ist im Endeffekt eigentlich vollkommen unbedeutend,, entscheidend ist nur, wie schnell das entstandene Template dann ausgeführt wird.

    Was Regex anbelangt: Unabhängig davon, dass die Regex-Sachen ja sowieso nur einmalig ausgeführt werden, ist die Annahme, dass Regex langsam sind nicht wirklich richtig. Ich muss aber zugeben, dass die dort genutzten schon recht alt sind (Oktober 2010) und ich das jetzt natürlich anders machen würde:
    a) Man sollte wahrscheinlich eine negated character group mit possesive quantifier benutzen:
    ~\{\s*+([^}]++)\s*+\}~
    Das würde der Regex-Engine das sämtliches Backtracking ersparen, was natürlich ein großer Vorteil ist, was Geschwindigkeit anbelangt.
    b) Es wäre eventuell sinnvoll '}' in Strings nicht als schließendes Zeichen zu werten:
    ~\{\s*+([^}'"]*+(?:(?:'[^'\\\\]*+(?:\\\\.[^'\\\\]*+)*+'|"^[^"\\\\](?:\\\\.[^"\\\\]*+)*+")[^}'"]*+)*+)\s*+\}~
    Das ganze wird dann aber schon etwas unübersichtlich für jemanden, der sich nicht sonderlich mit regulären Ausdrücken auskennt.

    Und da sieht mans schon: Einfach Twig benutzen :D Es ist einfach besser als schnell selbst was zusammenzuhauen ;)

    PS: Schön zuwissen, dass du auch StackOverflow nutzt :D
  • in: Sauberer PHP/HTML Programmierstil

    geschrieben von nikic

    hemiolos schrieb:
    nikic schrieb: Das kaum einer HEREDOC oder NOWDOC benutzt, ist sehr verständlich...


    un dann gib es diejenigen, die suchen und ersetzen ...

    Kann es sein, dass du einen Beitrag von mir überlesen hast? Ich habe da recht ausführlich zu dem Thema Stellung genommen.
  • in: Sauberer PHP/HTML Programmierstil

    geschrieben von nikic

    Das kaum einer HEREDOC oder NOWDOC benutzt, ist sehr verständlich. Für normale Webseiten bietet sich ein Templatesystem einfach besser an, als irgendein limiterter HEREDOC String.

    Solche Sachen kommen normalerweise erst dann zum Einsatz, wenn maneinen längeren Text hat, in dem viele ' vorkommen. Also eigentlich nur, wenn man zu PHP kompiliert. Auch wenn du CLI Anwendungen entwickelst, wirst du sowas häufiger mal sehen.
  • in: Sauberer PHP/HTML Programmierstil

    geschrieben von nikic

    @hemiolos: Ich glaube dein letzter Beitrag entstand aus Ignoranz heraus. Tempalte-Systeme, funktionieren *nicht* durch Suchen und Ersetzen. Von unerfahrenen Programmierern selbstgeschriebene Template-Systeme vielleicht schon. Professionelle jedoch nicht.

    Alle großen Template-Systeme kompilieren nämlich das Template mit der Designer freundlichen und auf Templates spezialisierten Syntax zu ... PHP Code! Da ist nichts mit langsamem Ersetzen. Am Ende wird einfach nur der schnelle PHP Code ausgeführt.

    Wenn dich genauer interessiert, wie das funktioniert, habe ich eine kleine Einführung geschrieben, in der man mit recht wenig Code ein voll funktionsfähiges Template-System schreibt. (Auch wenn ich die Nutzung von Twig natürlich empfehle.)

    Aber auch ohne diesen Punkt ist dein Benchmark etwas unfair: Um fair zu sein müsstest du zuerst die tausend Zeilen mit #content# generieren und dann erst #content# ersetzen. Du wirst sehen, dass geht deutlich schneller ;)
  • in: Drupal problem!

    geschrieben von nikic

    https://www.lima-city.de/thread/warning-ini_set-has-been-disabled-for-security-reasons

    Verschoben ins Spam-Forum.
  • in: Ist Sie Fertig?

    geschrieben von nikic

    Hey, das ist schon der dritte Promo-Thread in sehr kurzer Zeit zu deiner Seite. Benutze deinen alten weiter: Klick!. Wenn deine Seite niemanden einen Dreck interessiert, dann änderst du daran auch nichts, wenn du noch so viele Threads eröffnest. Somit verschoben nach Spam.
  • in: An alle Foto-Fans

    geschrieben von nikic

    Verschoben ins Spam Forum, da nicht den Regen zum Schreiben im Board Promotion entsprechend.
  • in: Wie findet ihr das?

    geschrieben von nikic

    Verschoben ins Spam Forum. Wenn du zumindest den Link verlinkt hättest, wäre es vielleicht noch im Promo Forum gelandet...
  • in: Sauberer PHP/HTML Programmierstil

    geschrieben von nikic

    thwjugend-marktschwaben schrieb:
    Schon fertig geschriebener HTML-Code mit mehreren kleinen php-Segmenten führt meines Wissens schneller zur Darstellung als wenn man auch den bloßen HTML-Code erst über echo produziert..

    Gruß,
    Christian


    Nicht zwangsweise. Wenn man nur einen einzigen PHP Block hat, wird der PHP Interpreter nur ein mal angeworfen. Wenn man aber dauernd zwischen PHP und HTML hin und her wechselt, entsteht ein nicht unbedeutenderr Overhead.

    Aber um solche kleinen Performanceangelegenheiten sollte man sich nicht kümmern ;) Was nun schneller ist, ist absolut egal. Entscheidend ist nur, was sauberer ist.
  • in: PHP: E-Mail kam nicht an ... Was mach ich falsch?

    geschrieben von nikic

    Das liegt nicht an deinem Script, sondern an Lima-City: Klick

    Somit geschlossen.
  • in: Alert ohne Javascript?

    geschrieben von nikic

    Wenn du die Bilder schon mit PHP generierst, füg doch unten rechts deinen Text "Dieses Bild wird von Blablabla gehostet" mit GD ein ;) So ist er immer und narrensicher drin. Wenn du nicht gerade den knalligen Rotton dafür nimmst, sogar einigermaßen unauffällig (also keine nervigen Alerts).
  • in: Fehler datei erstellen wie?

    geschrieben von nikic

    Verschoben ins Spam-Forum wegen unzureichender Beschreibung des Problems.
  • in: Sauberer PHP/HTML Programmierstil

    geschrieben von nikic

    Es gibt Editoren, die dir auch HTML, JavaScript, SQL, ... in Strings highlighten können. PHPStorm kann dies beispielsweise.

    Wie aber misterbasti schon erwähnt hat, solltest du noch besser PHP ganz von HTML trennen, indem du eine Template Engine verwendest. Für PHP ist Twig der kommende Standard was TE anbelangt.
  • in: Jetzt gehts ab

    geschrieben von nikic

    Verschoben ins Spam-Forum: https://www.lima-city.de/thread/an-alle-rap-fans
    Ein Thread reicht!
  • in: Befehlsübersicht umstieg aufs Neue PHP

    geschrieben von nikic

    Uhm, was verstehst du unter dem "neuen" PHP? Meinst du PHP 4 -> PHP 5? PHP 5.2 -> PHP 5.3? PHP 5.3.0 -> PHP 5.3.5? "Neu" hat viele Namen...

    Wenn du den Umstieg von PHP 5.2 auf PHP 5.3 meinst, sieh dir den entsprechenden Migration Guide an. Für PHP 4 zu PHP 5 gibt es ebenfalls einen Migration Guide. Für 5.3.x -> 5.3.y sieh einfach den Changelog an.

    Übrigens, das mit dem `<?` und `<?php` hat nichts mit der PHP-Version zu tun. `<?` geht nur, wenn `short_tags` an sind ;)
  • in: Gültigkeit von Mailadressen prüfen

    geschrieben von nikic

    Anknüpfend an ra1ns Beitrag: Du kannst das Validieren von Emails in drei Schritte einteilen:
    1. Syntaktische Validierung: Prüfen, dass die Email gewisse Anforderungen erfüllt. Dabei solltest du eher mehr Mails zulassen als weniger. Es gibt nichts ärgerlicheres als seine Email "+@example.org" einzugeben und gesagt zu bekommen, dass eine Email kein "+" enthalten darf (was nämlich Schwachsinn ist.) Die Prüfung kannst du mit filter_var machen (siehe fabo).
    2. Validierung der Domain: Anschließend extrahierst du die Domain aus der Email (alles hinter dem letzten @) und machst ein `checkdnsrr`. Dabei macht PHP ein DNS-Lookup für die Domain und prüft, ob es überhaupt einen MX-Record gibt. Damit kannst du einige Spam-Mails schonmal aussortieren.
    3. Validierung der Existenz: Wenn du wirklich sicher prüfen willst, dass die Email existiert kommst du nicht drumrum eine Bestätigungsemail zu schicken. D.h. du schickst eine Nachricht an die Email mit einem uniquen Link. Wenn dieser geklickt wird, gelte die Email als bestätigt. Auch das stellt natürlich nicht sicher, dass du eine echte Email bekommst. Wenn jemand `blabla@trash-mail.com` als Email angibt, dann kann er diese über Trashmail auch bestätigen - es ist aber immernoch nicht seine echte Email. Dagegen kannst du dich nicht wirklich schützen. Du kannst vielleicht eine Blacklist mit bekannten Trash-Mail-Providern erstellen, aber wirklich schützen kannst du dich dagegen nicht.

    Ich belasse es normalerweise bei den ersten zwei Schritten. Für einen kleinen Dienst mit etwa 25000 Besuchern/Tag kommt da nur mäßig Spam an. Viele Leute geben ihre echte Email schon an, alleine weil sie glauben, dass sie eine Aktivierungsmail bekommen.
  • in: Frage bzgl. Regex

    geschrieben von nikic

    1. Benutze `$1` statt `\1`, die Syntax mit dem Backslash ist veraltet.
    2. Du verstehst das mit den Gruppen etwas falsch. `preg_replace` geht den String durch und bei jeder Übereinstimmung mit dem Regex ("Match") ersetzt es den gematchten Bereich durch den Ersetzungs-Teil.
    D.h. zuerst wird der Regex `"besonderen"` matchen. Dabei wird er sich `array('"besonderen"', 'besonderen')` als merken, da diese als Capturing Groups definiert wurden (der gesamte Regex ist automatisch eine Capturing Group). Dann ersetzt er das gematchte `"besonderen"` durch `$1`, wobei `$1` dem zweiten Element im Array entspricht. Das selbe macht er dann mit dem zweiten Vorkommen, das Array ist dieses mal aber `array('"besonders"', 'besonders')`. Du musst die Gruppen also nicht global, auf den ganzen String verteilt sehen, sondern lokal, bei jedem Match.

Login zum Webhosting ohne Werbung!