Zum Inhalt

MongoDB als Datenbank in PHP verwenden

Wie einfach sich der Umgang mit MongoDB bei der Arbeit in PHP gestaltet, will ich hier anhand kurzer Beispiele zeigen . Die Vorzüge dieser Dokument-Orientierten Datenbank werden schnell ersichtlich, wenn man sieht wie einfach gängige Abläufe umgesetzt werden können. Ein grosser Vorteil von MongoDB gegenüber SQL-Datenbanken kann auch die Geschwindigkeit liegen. Dies kommt gerade bei der Ausgabe von grossen Mengen Content zum tragen. In diesem Artikel geht es aber erst einmal um den Einstieg.

 

php-logo

Verbindung zur Datenbank

In einer *.php-Datei, vorzugsweise einer Konfigurations-Datei welche wir später überall einbinden können, legen wir zu Beginn erst mal alle benötigten Angaben fest:

$db_host = 'localhost';
$db_port = '27017';
$db_name = 'mydatabase';
$db_user = 'myusername';
$db_pass = 'mypassword';

Dann stellen wir eine Verbindung zum Server her. Dazu gibt es mehrere Varianten. Am schnellsten ist eine Verbindung per Unix-Socket – wird emfpohlen! Dabei muss der Port angegeben werden. Achtung: Authentifizierung ist in MongoDB per default ausgeschaltet. Muss also in der Config eingeschaltet werden (später mehr dazu). Hier erstmal eine Verbindung ohne Authentifizierung.

$mongo = new MongoClient("mongodb:///tmp/mongodb-" . $db_port . ".sock");

Als nächstes das selbe mit Authentifizierung. Hier muss eine Datenbank angefügt werden, sofern der Nutzer eingeschränkte Rechte hat. Als Admin kann die Kollektion auch später noch gewählt werden.

$mongo = new MongoClient("mongodb://" . $db_user . ":" . $db_pass . "@/tmp/mongodb-" . $db_port . ".sock/" . $db_name);

Nun noch eine Verbindung übers Netzwerk, das sieht dann so aus. Der Port kann am Schluss angefügt werden muss aber nicht, falls nicht wird der Standart-Port 27017 genommen. Das ganze einmal ohne und einmal  mit Authentifizierung.

$mongo = new MongoClient("mongodb://" . $db_host . ":" . $db_port);

$mongo = new MongoClient("mongodb://" . $db_user . ":" . $db_pass . "@" . $db_host . ":" . $db_port);

Diese Art der Verbindung ist etwas langsamer, jedoch können damit auch entfernte Server angesprochen werden.

Um zu prüfen ob die Verbindung erfolgreich war nun folgendes:

if ($mongo->connected) {
    echo "verbunden";
} else {
    echo "nicht verbunden";
}

Sinnvoll wäre bestimmt auch eine Art Fallback Lösung. Falls eine Verbindung über Unix-Socked fehlschlägt, soll eine Netzwerkverbindung aufgebaut werden. Hier nur mal ein möglicher Ansatz:

function moauco($arr) {
    /*
     * MongoDB Authentication Connect
     * 
     * Als erstes wird versucht eine Socket Verbindung aufzubauen
     * geht natürlich nur mit localhost, sonst wird eine
     * Netzwerkverbindung aufgebaut.
     * 
     * @param $arr erwartet ein Array mit: 
     * [user]=Benutzername
     * [pass]=Passwort
     * [db]=Datenbankname
     * optional:
     * [host] falls leer - localhost
     * [port] falls leer - 27017
     * @ToDo - mehrere Serververbindungen ermöglichen
     */

    if (isset($arr['user'], $arr['pass'], $arr['db'])) {

        $a = false;

        if (!isset($arr['host'])) {
            $arr['host'] = 'localhost';
        }
        if (!isset($arr['port'])) {
            $arr['port'] = '27017';
        }
        a:
        if ($arr['host'] === 'localhost' && $a !== true) {
            $dbmsg = $arr['user'] . ":" . $arr['pass'] . "@/tmp/mongodb-" . $arr['port'] . ".sock/" . $arr['db'];
        } else {
            $dbmsg = $arr['user'] . ":" . $arr['pass'] . "@" . $arr['host'] . ":" . $arr['port'] . "/" . $arr['db'];
        }
        // verbinden
        $m = new MongoClient("mongodb://" . $dbmsg);

        if ($m->connect() == 1) {
            return $m;
        } else {
            if ($a === true)
                return false;
            $a = true;
            goto a;
        }
    }else {
        return false;
    }
}

Es ist auch möglich zu mehreren Servern gleichzeitig zu verbinden, dazu mehr auf php.net.

Daten in MongoDB speichern

Falls wir bei der Verbindung noch keine Datenbank gewählt haben, können wir das jetzt machen. Folgende Möglichkeiten haben wir:

$database = $mongo->$db_name;
//oder
$database = $mongo->selectDB($db_name);

nun können wir auf eine Datenbank zugreifen und eine Kollektion erstellen. In SQL würde das einer Tabelle entsprechen. Folgende Möglichkeiten haben wir (Falls die Kollektion nicht existiert wird sie somit erstellt)

$collection = $mongo->$db_name->meinekollektion;
$collection = $mongo->selectCollection($db_name, "mycollection");

Nun können wir die Kollektion füllen – also Datensätze anlegen nehmen wir mal ein paar Hündchen.

$dobermann = array(
    'name' => 'Blacky',
    'farbe' => 'schwarz',
    'jahrgang' => 2012,
    'eigenschaften' => array(
        'lieb',
        'guter Wachhund',
        'verfressen'
    )
);
$collection->insert($dobermann);

$boxer = array(
    'name' => 'Brownie',
    'farbe' => 'braun',
    'jahrgang' => 2012,
    'eigenschaften' => array(
        'verspielt',
        'verfressen'
    ),
    'ausbildung' => 'Schutzhund'
);
/*
 * wir können auch prüfen ob das insert erfolgreich war
 */
$insert = $collection->insert($boxer);

if ($insert) {
    echo 'gespeichert';
}

Es werden einfach ganze Arrays abgelegt was sehr praktisch ist. Im optimalen Fall fällt eine Datenaufarbeitung wie man es vor SQL-Inserts kennt komplett weg. Wie man sieht kann die Struktur auch verändet werden. Man ist nicht wie in SQL an feste Strukturen gebunden.

Daten aus MongoDB auslesen

Nun lesen wir die Daten wieder aus. Dies entspricht praktisch einem SELECT * in SQL.

$hunde = $collection->find();

foreach ($hunde AS $hund) {
    // name und barbe haben alle
    echo '<p>' . $hund['name'] . " ist " . $hund['farbe'] . "</p>\n";

    // zu den Eigenschaften
    if (isset($hund['eigenschaften'])) {
        echo "<h6>Eigenschaften:</h6>\n<ul>";
        foreach ($hund['eigenschaften'] AS $eigenschaft) {
            echo "\t<li>" . $eigenschaft . "</li>\n";
        }
        echo "</ul>";
    }

    // spezielles noch falls da
    if (isset($hund['ausbildung'])) {
        echo "<p>Ausbildung: ";
        echo $ausbildung . "</p>\n";
    }
}

Auch gezielt suchen ist möglich:

$find = $collection->find(array("jahrgang"=>2012));

foreach ($find as $hund) {
    print_r($hund);
}

Wir können auch mit findOne arbeiten, somit bekommen wir nur das erste Vorkommen. Oder mit weiteren Methoden.

$findone = $collection->findOne(array("jahrgang"=>2012));
/*
 * es kann auch belibig limitiert werden
 */
$find = $collection->find(array("jahrgang"=>2012))->limit(2);
/*
 * oder zählen
 */
$find = $collection->find(array("jahrgang"=>2012))->count();
/*
 * sortieren 1=ASC, -1=DESC
 */
$find = $collection->find(array("jahrgang"=>2012))->sort(array("name"=>1));
/*
 * Skip etwa für aufzählungen
 */
$find = $collection->find(array("jahrgang"=>2012))->skip(1);
/*
 * debug
 */
$find = $collection->find(array("jahrgang"=>2012))->explain();

So können wir ein Update durchführen. Wichtig hier ist $set es verhält sich wie “as” in mysql.

$update = $collection->update(array("name" => "Blacky"), array('$set' => array("name" => "BlackDog")));

Und noch zum Löschen. Hier muss man vorsichtig sein – auch löschen geht bei MongoDB sehr schnell und direkt. Mit $collection->remove(); leeren wir die Ganze Kollektion. In SQL wäre das eine leere Tabelle. Natürlich kann man auch nur bestimmte Datensaätze löschen, dazu übergibt man ein Array mit Kriterium und Wert.

$collection->remove(); // Alles löschen
$delete = $collection->remove(array("name" => "Blacky"));

If ($delete == true) {
    echo "Blacky wurde gelöscht!";
}

Es ist auch möglich optionen zu übergeben dazu mehr auf php.net.

Weiterführende Links:

Veröffentlicht inLösungenTipp's

21 Kommentare

  1. My programmer is trying to persuade me to move to .net from
    PHP. I have always disliked the idea because of the costs.

    But he’s tryiong none the less. I’ve been using Movable-type on various
    websites for about a year and am nervous about switching to another platform.
    I have heard very good things about blogengine.net.
    Is there a way I can import all my wordpress posts into
    it? Any kind of help would be greatly appreciated!

  2. I think this is among the so much vital information for
    me. And i’m happy reading your article. But wanna observation on few common things,
    The site taste is wonderful, the articles is actually
    nice : D. Good process, cheers

  3. Hello are using WordPress for your blog platform? I’m new to the blog world but I’m trying
    to get started and set up my own. Do you need any coding expertise to make your
    own blog? Any help would be greatly appreciated!

  4. Heya! I just wanted to ask if you ever have any issues with hackers?
    My last blog (wordpress) was hacked and I ended up losing months
    of hard work due to no backup. Do you have any solutions to prevent hackers?

  5. I loved as much as you’ll receive carried out right here. The sketch is attractive, your authored subject matter stylish.
    nonetheless, you command get bought an shakiness over that you wish be delivering the following.
    unwell unquestionably come further formerly again as
    exactly the same nearly very often inside case you shield this hike.

  6. Magnificent goods from you, man. I’ve understand your stuff previous to and you’re just
    extremely great. I really like what you’ve acquired here, really like what you’re stating and the way in which you say it.
    You make it enjoyable and you still take care of to keep
    it smart. I cant wait to read far more from you. This is actually a great site.

  7. The other day, while I was at work, my cousin stole my iPad and tested to see if it can survive a thirty
    foot drop, just so she can be a youtube sensation. My iPad is now broken and she has 83 views.
    I know this is completely off topic but I had to share it with someone!

  8. Hello, I think your site might be having browser compatibility issues.
    When I look at your blog site in Chrome, it looks
    fine but when opening in Internet Explorer, it has some overlapping.
    I just wanted to give you a quick heads up! Other then that, amazing blog!

  9. wonderful submit, very informative. I’m wondering
    why the other specialists of this sector don’t notice this.
    You should continue your writing. I am sure, you have a great readers’ base already!

  10. I was wondering if you ever considered changing the structure of your blog?
    Its very well written; I love what youve got to say. But maybe you could a little more
    in the way of content so people could connect with it better.

    Youve got an awful lot of text for only having one or two images.
    Maybe you could space it out better?

  11. Everything is very open with a clear description of
    the issues. It was really informative. Your site is extremely helpful.
    Thank you for sharing!

  12. Please let me know if you’re looking for a article writer for your blog.
    You have some really good articles and I believe
    I would be a good asset. If you ever want to take some of
    the load off, I’d really like to write some material for your blog in exchange for a link back to
    mine. Please blast me an email if interested. Cheers!

  13. Thanks for another informative blog. Where else could I am getting that kind of information written in such
    an ideal method? I have a undertaking that I am just now running on,
    and I’ve been at the glance out for such info.

  14. My spouse and I stumbled over here from a different
    web page and thought I should check things out.
    I like what I see so now i am following you. Look forward to looking over your
    web page yet again.

  15. Heya i am for the first time here. I came across this board and I find It truly useful & it helped me
    out much. I hope to give something back and help others like you aided
    me.

  16. Wonderful beat ! I wish to apprentice while you amend your site, how could i subscribe for a blog website?
    The account helped me a acceptable deal. I had been a little bit acquainted of this your broadcast offered bright clear idea

  17. Hi! I simply want to offer you a huge thumbs up for the great info you have
    got here on this post. I am coming back to your site for more soon.

  18. Definitely believe that which you said. Your favorite justification seemed to
    be on the net the easiest thing to be aware of. I say to you,
    I certainly get irked while people consider worries that
    they just do not know about. You managed to hit the nail upon the
    top as well as defined out the whole thing without having side effect , people can take a signal.

    Will likely be back to get more. Thanks

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Neueste Beiträge

Themen: