[PHP] preg_match bei großen Inhalten

Wenn man einen preg_match Befehl auf einen langen String durchführen will, kann es passieren, dass man trotz korrektem regulärem Ausdruck kein Ergebnis oder nur eine Fehlermeldung zurück bekommt.

Falls dies der Fall sein sollte, kann man folgender Befehl evtl. Abhilfe schaffen:

ini_set('pcre.backtrack_limit', 1000000);

Falls eure PHP Version > 5.3.7 sein sollte, so ist euer PCRE Backtracking Limit ebenfalls auf 1000000 eingestellt. Bei älteren PHP Versionen kann dieses Codesnippet allerdings Wunder bewirken.

PHP – Datumsdifferenz sicher ermitteln

Um in PHP die Differenz zwischen zwei Datumsangaben zu ermitteln, gibt es folgende Möglichkeit:

$date1 = '2013-03-01'
$date2 = '2013-05-17'

$dateDiff = gregoriantojd(
                date('m', strtotime($date2)),
                date('d', strtotime($date2)),
                date('Y', strtotime($date2)))
            - gregoriantojd(
                date('m', strtotime($date1)),
                date('d', strtotime($date1)),
                date('Y', strtotime($date1)));

Es erfolgt erst die Umrechnung in das vom gregorianische ins julianische Datumsformat. Danach kann man durch eine einfache Rechenoperation die Differenz zwischen beiden Datumsangaben ermitteln und erhält den Abstand zwischen Datum 1 und Datum 2 in Tagen.

Einstieg in Zend Framework 2

Auch ich habe mich an die neue Version des Zend Frameworks gewagt. Und mir fiel auf: Wenn man nicht an den richtigen Stellen fündig wird, fällt der Einstieg gar nicht mal so leicht. Denn: ZF1 und ZF2 sind von Grund auf verschieden. Viel von dem Wissen über Zend Framework 1 ist mit Zend Framework 2 schon wieder hinfällig. Die Unterschiede zwischen beiden Versionen des Frameworks sollte man sich von Florian Eibeck bei Mayflower als Einleitung verdeutlichen lassen (Link).

Danach sollte man das Quickstart Tutorial von Zend durchführen. Hat bei mir problemlos geklappt. Allerdings sollte man der englischen Sprache mächtig sein, da es im Fließtext zu wichtigen Erläuterungen kommt.

Link: Tutorial bei Zend

Zeilenumbruch in Kommentarfeld der Datenbank

Ich stand vor dem Problem in ein Kommentarfeld in der Datenbank einen weiteren Kommentar einzufügen. Für den Fall, das schon ein Kommentar in dem Feld steht, sollte ein Zeilenumbruch erfolgen und dann der neue Kommentar eingetragen werden. Andernfalls sollte einfach nur der neue Kommentar eingetragen werden.

Hier meine Lösung zu dem Problem:

UPDATE Tabelle
    SET Tabelle.Kommentarfeld = 
         IF(
             CHAR_LENGTH(Tabelle.Kommentarfeld) > 0,
             CONCAT_WS('\n', Tabelle.Kommentarfeld, 'mein neuer Kommentar'),
             'mein neuer Kommentar'
         )
WHERE Tabelle.weiteresFeld > 0

Hilfreich war mir dieser Link bei der Lösung meines Problems.

DELETE über einen SQL JOIN

Möchte man einen DELETE über mehrere Tabellen hinweg machen (mit Hilfe von Joins), kann es durchaus vorkommen, dass man beim Ausführen seines DELETE-Statements einen Fehler bekommt.

Nach längerer Suche bin ich auf folgenden Hinweis gestoßen.

Ich wollte folgendes SQL ausführen:

DELETE FROM 
  table1
JOIN 
  table2 ON [**onClause**] 
JOIN 
  table3 ON [**onClause**] 
WHERE 
  [**whereClause**]

Dieses Statement lieferte mir allerdings einen Syntaxerror zurück. Durch Einfügen von USING funktionierte meine Query dann so, wie sie sollte.

DELETE FROM 
  table1
USING 
  table1 
JOIN 
  table2 ON [**onClause**] 
JOIN 
  table3 ON [**onClause**] 
WHERE 
  [**whereClause**]

Alternativ funktioniert auch Folgendes:

DELETE table1 FROM 
  table1
JOIN 
  table2 ON [**onClause**] 
JOIN 
  table3 ON [**onClause**] 
WHERE 
  [**whereClause**]

Liegt wahrscheinlich daran, das die Query nicht wirklich weiß, aus welcher Tabelle sie die ermittelten Datensätze löschen soll.

Ich hoffe dem Einen oder Anderen so eine unnötige Sucherei erspart zu haben 🙂

Update 23.01.2013:
Einen Interessanten Beitrag zur Thematik findet ihr hier.

Zend_Form + Autocomplete

Da ich im Netz kein zufriedenstellendes Beispiel für Zend_Form in Verbindung mit Autocomplete finden konnte, möchte ich hier meinen Lösungsansatz zeigen. Vorraussetzungen sind hierfür ein Zend_Form, sowie aktiviertes jQuery + jQueryUI.

Im Formular passiert erstmal nix Besonderes. Es wird ein normales Zend_Form_Element_Text angelegt.

$autoCompleteElement = new Zend_Form_Element_Text('autoCompleteElement');

Der Controller bekommt eine zusätzliche autocompleteAction spendiert, welche wir dann später über jQuery ansprechen wollen, um die Werte zur aktuellen Eingabe zu erhalten. Wichtig ist hier, die Werte JSON-kodiert zu übergeben, um sie später im Javascript-File sauber auslesen zu können. Bei meinem $returnArray soll der Value später ins Formularfeld eingetragen werden, wohingegen das Label als Anzeige für die Auswahl beim Autocomplete gedacht ist.

public function autocompleteAction()
{
    $post = $this->_request->getPost();
    $searchString = $post['searchString'];
    
    // $returnArray zur Demonstration meiner übergebenen Daten
    $returnArray[$row['value']] = $row['label']; 
    $valuesJson = Zend_Json::encode($returnArray);
    echo $valuesJson;
    $this->view->layout()->disableLayout();
    $this->_helper->viewRenderer->setNoRender(true);
}

Das Javascript kümmert sich schlussendlich um das Absenden des Requests und das Mappen der empfangenen Daten.

$(document).ready(function() {
    $("input#autoCompleteElement").autocomplete({
        source : function( request, response) {
            url = "/meinModul/meinController/autocompleteAction";
            data = { 'searchString' : request.term };
            $.post(url, data, function(JSON){
                response($.map(JSON, function (item, value) {
                    return {
                        label: item,
                        value: value,
                        source: item};
                    }));
            }, 'json');
        },
        minLength: 1,
        autoFocus: true
    });
});

Zum Schluss natürlich nicht vergessen das Javascript in euer View-Script mit einzubinden.

SVN Tag aus aktuellem Trunk erstellen

Mit folgendem Kommando kann recht fix aus dem Trunk des SVN Projekts ein Tag erstellt werden:

svn copy http://svn.example.com/project/trunk http://svn.example.com/project/tags/1.0 -m "Release 1.0"

Eingeleitet wird das Ganze über die Schlüsselbegriffe svn copy, danach folgt der SVN Pfad zum aktuellen Trunk, dann der Pfad zum gewünschten Tag-Ordner. Mit dem Parameter -m könnt ihr dann in Anführungszeichen noch einen Kommentar angeben.