PHP Win7 - Kein Zugriff mit PHP auf MongoDB - MongoClient not found

Endless Storm

Commander
Registriert
Dez. 2008
Beiträge
2.137
Hallo zusammen,

nachdem ich erfolgreich auf meine mysql-DB eine Verbindung aufbauen konnte, wollte ich zurück zu meinen eigentlichen Aufgaben und über PHP mit MongoDB arbeiten.
Das Thema mit dem HTML-Code und der später auch funktionierenden mysql-Anbindung ist hier zu finden: Link.

Folgendes ist geschehen:
- Win7x64
- XAMPP V3.2.2 mit PHP7.0 installiert und eingerichtet
- MongoDB 3.4.1 installiert
- PHP-Treiber für Mongo heruntergeladen. PHPinfo sagt: PHP Version 7.0.13, Architecture: x86, Thread Safty: enabled
- Folgender Treiber wurde also heruntergeladen: php_mongodb-1.2.2-7.0-ts-vc14-x86, die DLL nach ext kopiert und die Zeile "extension=php_mongodb.dll" über "Module Settings" eingefügt.
- MongoDB und XAMPP\PHP sind dem Path hinzugefügt.
- Die PHPinfo sagt nun folgendes (im Internet sinds wesentlich mehr Infos zur MongoDB zu finden in der PHPinfo, warum fehlen diese bei mir? Z.B. fehlen Infos zum host und port usw.):
Code:
mongodb
mongodb support	enabled
mongodb version 	1.2.2
mongodb stability 	stable
libmongoc version 	1.5.0
libbson version 	1.5.0
Directive	Local Value	Master Value
mongodb.debug	no value	no value
- Über die cmd-Console kann ich mongod starten:
Code:
C:\Program Files\MongoDB\Server\3.4\bin>mongod
2017-01-01T18:06:59.447+0100 I CONTROL  [initandlisten] MongoDB starting : pid=1
516 port=27017 dbpath=C:\data\db\ 64-bit host=*MeinPC*
2017-01-01T18:06:59.448+0100 I CONTROL  [initandlisten] targetMinOS: Windows Vis
ta/Windows Server 2008
2017-01-01T18:06:59.448+0100 I CONTROL  [initandlisten] db version v3.4.1
2017-01-01T18:06:59.448+0100 I CONTROL  [initandlisten] git version: 5e103c4f558
3e2566a45d740225dc250baacfbd7
2017-01-01T18:06:59.448+0100 I CONTROL  [initandlisten] allocator: tcmalloc
2017-01-01T18:06:59.448+0100 I CONTROL  [initandlisten] modules: none
2017-01-01T18:06:59.448+0100 I CONTROL  [initandlisten] build environment:
2017-01-01T18:06:59.448+0100 I CONTROL  [initandlisten]     distarch: x86_64
2017-01-01T18:06:59.448+0100 I CONTROL  [initandlisten]     target_arch: x86_64
2017-01-01T18:06:59.448+0100 I CONTROL  [initandlisten] options: {}
2017-01-01T18:06:59.450+0100 I -        [initandlisten] Detected data files in C
:\data\db\ created by the 'wiredTiger' storage engine, so setting the active sto
rage engine to 'wiredTiger'.
2017-01-01T18:06:59.450+0100 I STORAGE  [initandlisten] wiredtiger_open config:
create,cache_size=7654M,session_max=20000,eviction=(threads_max=4),config_base=f
alse,statistics=(fast),log=(enabled=true,archive=true,path=journal,compressor=sn
appy),file_manager=(close_idle_time=100000),checkpoint=(wait=60,log_size=2GB),st
atistics_log=(wait=0),
2017-01-01T18:06:59.699+0100 I CONTROL  [initandlisten]
2017-01-01T18:06:59.699+0100 I CONTROL  [initandlisten] ** WARNING: Access contr
ol is not enabled for the database.
2017-01-01T18:06:59.699+0100 I CONTROL  [initandlisten] **          Read and wri
te access to data and configuration is unrestricted.
2017-01-01T18:06:59.700+0100 I CONTROL  [initandlisten]
2017-01-01T18:06:59.700+0100 I CONTROL  [initandlisten] Hotfix KB2731284 or late
r update is not installed, will zero-out data files.
2017-01-01T18:06:59.701+0100 I CONTROL  [initandlisten]
2017-01-01T18:06:59.812+0100 W FTDC     [initandlisten] Failed to initialize Per
formance Counters for FTDC: WindowsPdhError: PdhExpandCounterPathW failed with '
Das angegebene Objekt wurde nicht auf dem Computer gefunden.' for counter '\Memo
ry\Available Bytes'
2017-01-01T18:06:59.812+0100 I FTDC     [initandlisten] Initializing full-time d
iagnostic data capture with directory 'C:/data/db/diagnostic.data'
2017-01-01T18:06:59.818+0100 I NETWORK  [thread1] waiting for connections on por
t 27017
- Über eine weitere cmd-Console starte ich mongo:
Code:
C:\Program Files\MongoDB\Server\3.4\bin>mongo
MongoDB shell version v3.4.1
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.1
Server has startup warnings:
2017-01-01T18:06:59.699+0100 I CONTROL  [initandlisten]
2017-01-01T18:06:59.699+0100 I CONTROL  [initandlisten] ** WARNING: Access contr
ol is not enabled for the database.
2017-01-01T18:06:59.699+0100 I CONTROL  [initandlisten] **          Read and wri
te access to data and configuration is unrestricted.
2017-01-01T18:06:59.700+0100 I CONTROL  [initandlisten]
2017-01-01T18:06:59.700+0100 I CONTROL  [initandlisten] Hotfix KB2731284 or late
r update is not installed, will zero-out data files.
2017-01-01T18:06:59.701+0100 I CONTROL  [initandlisten]
> use datenbank
switched to db datenbank
> show users
{
        "_id" : "datenbank.user1",
        "user" : "user1",
        "db" : "datenbank",
        "roles" : [
                {
                        "role" : "readWrite",
                        "db" : "datenbank"
                }
        ]
}
- Ein User mit Name/PW: "user1/user1password" ist angelegt. Auf Inhalte der DB kann ich über die Console zugreifen und Datensätze ergänzen, ändern und entfernen.
- Nun versuche ich mit meiner PHP auf die DB zuzugreifen, bitte korrigiert mich, falls hier Fehler enthalten sind:
PHP:
<?php
$db_host = 'localhost';
$db_port = '27017';
$db_name = 'datenbank';
$db_user = 'user1';
$db_pass = 'user1password';

// Verschiedene getestete Varianten zum Verbinden, alle schlagen fehl. Codes alle aus dem Internet
$connection = new MongoClient();
// $connection = new MongoClient("mongodb://localhost");
// $connection = new MongoClient("mongodb:///tmp/mongodb-" . $db_port . ".sock");
// $connection = new MongoClient("mongodb://" . $db_user . ":" . $db_pass . "@/tmp/mongodb-" . $db_port . ".sock/" . $db_name);
// $connection = new MongoClient("mongodb://${username}:${password}@localhost:27017");
if ($connection->connected) {
    echo "verbunden";
} else {
    echo "nicht verbunden";
}

// connects to dbs "datenbank" | Create new datebases by selecting them
$database = $connection->datenbank;
// select a collection:
$collection = $database->datenbank;
// directly select a database and collection:
// Hinweis: ich kann in MongoDB keine Collection anlegen?! mycoll ist nur eine Idee
//$collection = $connection->datenbank->mycoll;

// Codezeilen um die Datenfelder aus der HTML mit AngularJS auszulesen
$data = json_decode(file_get_contents("php://input"));
$empno = $data->empno;
$fname = $data->fname;
$lname = $data->lname;
$dept = $data->dept;

// Erzeuge Array mit den Datenfeldern
$doc = array(
	"emp_no" => $empno,
	"first_name" => $fname,
	"last_name" => $lname,
	"dept_name" => $dept
	);
$collection->insert($doc);

// Übergangsweise ein Dummy, falls die Codezeilen oben für das Auslesen nicht funktionieren
$doc2 = array(
	"emp_no" => "123",
	"first_name" => "John",
	"last_name" => "Deere",
	"dept_name" => "IT"
	);
$collection->insert($doc2);
?>

Die apache-error-log sagt folgende Zeile zum aktuellen Request an:
Code:
[Sun Jan 01 18:33:44.604570 2017] [:error] [pid 7784:tid 1724] [client ::1:54508] PHP Fatal error:  Uncaught Error: Class 'MongoClient' not found in C:\\xampp\\htdocs\\company\\mongodb\\test2.php:9\nStack trace:\n#0 {main}\n  thrown in C:\\xampp\\htdocs\\company\\mongodb\\test2.php on line 9, referer: http://localhost/company/mongodb/test.html

Jetzt finde ich im Internet, dass mein Versuch, die PHP-Treiber zu installieren, wohl fehlerhaft ist. Aber ich weiß nicht mehr weiter, wie ich das einrichten muss, dass es klappt...

Hoffe ihr wisst Rat.
 
Du brauchst eine shared lib für PHP die dir MongoClient zur Verfügung stellt. Für mysql z.B. ist das Teil der PHP Installation von xampp. Für MongoDB wohl nicht.
Was für ein Versuch war das genau? was hast du da versucht zu installieren.?

Imho, ich würde niemals xampp verwenden, für gar nix. Wenn du lokal einen Web-PHP Stack brauchst: VM mit kleinem Linux.

https://www.google.de/search?q=xampp+php+mongoclient da gibts viele Leute die das gleiche Problem haben.
 
Mein: "Versuch, die PHP-Treiber zu installieren" bezieht sich darauf, dass es offensichtlich nicht so geklappt hat, wie es sollte. Darum "Versuch" ;)

Die Idee mit der VM ist ganz nett, aber aktuell bisl aufwändig von der Zeit her. Eigentlich sollte das alles sehr viel schneller gehen... :( Falls ich Mongo nicht zum laufen bewegen kann, würde ich wieder auf mysql zurück greifen und damit weiterarbeiten, um überhaupt zu einem Ergebnis kommen zu können.

Da jedoch explizit "MongoDB" erwünscht war, möchte ich das eigentlich auch damit machen.
 
WAS hat nicht geklappt? Was genau hast du versucht und wo scheiterte es dann? Wo hast du welche Datei hinkopiert, welche Dateien wie editiert, etc.
Ergänzung ()

Ein Debian ist in einer Viertelstunde installiert. Apache, php, mongodb, mysql dann ein einzelner apt-get install Aufruf.
 
Die Seite ist zwar schon etwas älter (10/2015) Link: [url]www.thegeekstuff.com...[/URL], aber ich denke, das Prinzip ist noch das selbe wie ich den Treiber einrichten muss. Allerdings erscheint bei mir kein Mongo-Treiber, sondern nur MongoDB. Ich finde auch keinen Mongo-Client-Treiber im Netz den ich downloaden kann/müsste.

Das Bild der fertigen PHPinfo der o.g. Internetseite zeigt auch deutlich mehr Infos als bei mir (siehe Codezeilen im ersten Post).

Habe ich vielleicht einfach nur einen falschen Treiber erwischt? Nur, wo finde ich den richtigen?

Im Grunde habe ich dasselbe Problem wie auf: Link: stackoverflow.com..., nur dass es auch hier keine Lösung gibt...
Ergänzung ()

2017-01-01 19_38_29-phpinfo().png
So sieht der Eintrag meiner PHPinfo aus über den MongoDB-Treiber... Nicht so, wie erwartet, es fehlen Werte für host usw.

Alle Benötigten Werte aus der PHPinfo über die PHP-Version passen zu meinem heruntergeladenen Treiber: x86, PHP7.0, VC14, thread safty.

Der Path ist gesetzt: C:\Program Files\nodejs\;C:\Program Files\MongoDB\Server\3.4\bin;C:\xampp\php (um einen Ausschnitt zu zeigen).

Die PHP.ini wurde so geändert (Zeile 3 ist hier neu):
PHP:
;extension=php_xmlrpc.dll
;extension=php_xsl.dll
extension=php_mongodb.dll

;;;;;;;;;;;;;;;;;;;
; Module Settings ;


Eigentlich scheiterte es nirgendwo. Alles lies sich kopieren, editieren, etc. Das Problem ist nur, dass ich nach den gemachten Schritten noch immer keine Verbindung habe...
 
@Batti
Leider helfen mir deine Links nicht weiter... Ich bekomme weiterhin keinen Zugriff, genau genommen verstehe ich auch nicht so ganz, was ich jetzt anders machen muss/soll.

Ich habe nun versucht, in meiner VMLite Workstation V3.2.6 Debian V8.6 einzurichten... sagen wir es mal so, laufen tut es, nachdem ich den Netzwerk-Adapter einmal auf NAT und den zweiten auf Brücke gestellt habe, komme ich auch von innen raus ins Internet.
Dazu muss ich sagen, dass ich zwar kein absoluter Neuling, aber dennoch ein Anfänger in Sachen Linux bin.

Über (diese Website) habe ich versucht, alles zum laufen zu bekommen. Jedoch erhalte ich bei dem Punkt, an dem ich über den Host auf den Guest-Apache zugreifen versuche, keinen Zugriff. Von daher habe ich bisher vergebens versucht, irgendwas doch noch zum laufen zu bewegen...

Wenn das so einfach sein soll, hilf mir bitte, wie ich Debian in der VM dazu bewegen kann, angesprochen zu werden... :(

Schon die tatsache, dass ich 3 DVD-ISOs herunterladen musste und ich für jede apt-get-Installation mind. eine der drei DVDs einbinden muss, ist die Einrichtung von Debian nicht wirklich einfach oder schnell. Geschweige denn, dass ich die VBoxGuestAdditions gescheit installieren konnte, ich habe nicht einmal die Möglichkeit, einen gemeinsam genutzten Ordner einzurichten (vermutlich wegen der fehlenden Additions)... Irgendwie nicht mein Tag heute :(
 
Hey,

versuch mal bitte einfach folgendes:

PHP:
$connection = new MongoDB\Driver\Manager('mongodb://'.$db_user.':'.$db_pass.'@'.$db_host.':'.$db_port);
var_dump($connection);

Was spuckt er dir da aus?
 
Hier mein Ergebnis:

Code:
object(MongoDB\Driver\Manager)#1 (2) { ["uri"]=> string(45) "mongodb://user1:user1password@localhost:27017" ["cluster"]=> array(0) { } }

Der getestete PHP-Code, gestartet via "http://localhost/company/mongodb/test3.php"
PHP:
<?php
require '../../../vendor/autoload.php';

$db_user = 'user1';
$db_pass = 'user1password';
$db_host = 'localhost';
$db_port = '27017';
$db_name = 'datenbank';
$db_coll = 'mycoll';

echo "Test 1: Connection via MongoDB\Driver\Manager:<br/>";
$connection = new MongoDB\Driver\Manager('mongodb://'.$db_user.':'.$db_pass.'@'.$db_host.':'.$db_port);
var_dump($connection);

echo "<br/><br/>Test 2: Connection via MongoDB\Client:<br/>";
$client = new MongoDB\Client("mongodb://localhost:27017");
var_dump($client);

echo "<br/><br/>Collection of Test1-Connection:<br/>";
$collection = $connection->datenbank->mycoll;
var_dump($collection);

echo "<br/><br/>Collection of Test2-Connection:<br/>";
$collection2 = $client->datenbank->mycoll;
var_dump($collection2);

$doc = array(
	"emp_no" => "123",
	"first_name" => "John",
	"last_name" => "Deere",
	"dept_name" => "IT"
	);
echo "<br/><br/>var dump from created doc:<br/>";
var_dump($doc);

echo "<br/><br/>Insert doc to Test1-Connection:<br/>";
$collection->insert($doc);
echo "<br/><br/>After insert to Test1-Connection<br/>";

echo "<br/><br/>Insert doc to Test2-Connection:<br/>";
$collection2->insert($doc);
echo "<br/><br/>After insert to Test2-Connection<br/>";
?>

Diese Datei ausgeführt ergibt folgende Ausgabe:
Code:
Test 1: Connection via MongoDB\Driver\Manager:
object(MongoDB\Driver\Manager)#3 (2) { ["uri"]=> string(45) "mongodb://user1:user1password@localhost:27017" ["cluster"]=> array(0) { } }

Test 2: Connection via MongoDB\Client:
object(MongoDB\Client)#2 (4) { ["manager"]=> object(MongoDB\Driver\Manager)#4 (2) { ["uri"]=> string(25) "mongodb://localhost:27017" ["cluster"]=> array(0) { } } ["uri"]=> string(25) "mongodb://localhost:27017" ["typeMap"]=> array(3) { ["array"]=> string(23) "MongoDB\Model\BSONArray" ["document"]=> string(26) "MongoDB\Model\BSONDocument" ["root"]=> string(26) "MongoDB\Model\BSONDocument" } ["writeConcern"]=> object(MongoDB\Driver\WriteConcern)#5 (0) { } }

Collection of Test1-Connection:

Notice: Undefined property: MongoDB\Driver\Manager::$datenbank in C:\xampp\htdocs\company\mongodb\test3.php on line 20

Notice: Trying to get property of non-object in C:\xampp\htdocs\company\mongodb\test3.php on line 20
NULL

Collection of Test2-Connection:
object(MongoDB\Collection)#10 (7) { ["collectionName"]=> string(6) "mycoll" ["databaseName"]=> string(9) "datenbank" ["manager"]=> object(MongoDB\Driver\Manager)#4 (2) { ["uri"]=> string(25) "mongodb://localhost:27017" ["cluster"]=> array(0) { } } ["readConcern"]=> object(MongoDB\Driver\ReadConcern)#7 (0) { } ["readPreference"]=> object(MongoDB\Driver\ReadPreference)#8 (1) { ["mode"]=> string(7) "primary" } ["typeMap"]=> array(3) { ["array"]=> string(23) "MongoDB\Model\BSONArray" ["document"]=> string(26) "MongoDB\Model\BSONDocument" ["root"]=> string(26) "MongoDB\Model\BSONDocument" } ["writeConcern"]=> object(MongoDB\Driver\WriteConcern)#9 (0) { } }

var dump from created doc:
array(4) { ["emp_no"]=> string(3) "123" ["first_name"]=> string(4) "John" ["last_name"]=> string(5) "Deere" ["dept_name"]=> string(2) "IT" }

Insert doc to Test1-Connection:

Fatal error: Uncaught Error: Call to a member function insert() on null in C:\xampp\htdocs\company\mongodb\test3.php:37 Stack trace: #0 {main} thrown in C:\xampp\htdocs\company\mongodb\test3.php on line 37

Nun stehe ich auf dem Schlauch, ob ich die Connection aus Test1 oder Test2 nehmen soll :rolleyes: Offenbar scheint der Test 2 erfolgreicher zu sein.
Nun muss ich nurnoch Daten eingeben können^^ Ich suche weiter im Netz und probiere weiter... Ideen sind herzlich willkommen! :D

Stimmt eigentlich mein gesetzter Path in Zeile 2 der PHP? Oder muss ich eine vor/zurück? Lasse ich eine ../ weg oder füge eine hinzu, passiert nix. Lasse ich alle weg, gibts eine Fehlermeldung...
Ergänzung ()

Geschafft!!

Ich poste den fertigen Code gleich, ich schnippel die gerade zusammen!! :D
Ergänzung ()

Finale Version, die funktioniert:

HTML:
<html>
<head>
	<meta charset="utf8" />
	<meta name="author" content="EndlessStorm"/>
	<title>Employee-Test</title>
	<link rel="stylesheet" href="https://netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css">
	<link rel="stylesheet" href="style.css">
	<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.0/angular.js"></script>
</head>
<body>
  <div ng-app="myapp" ng-controller="empcontroller">
		
		<form>
			Employee No. <input type="text" ng-model="empno"/><br />
			First Name <input type="text" ng-model="fname"/><br />
			Last Name <input type="text" ng-model="lname"/><br />
			Department <input type="text" ng-model="dept"/><br />
			<input type="button" value="submit" ng-click="insertdata()"/><br />
		</form>	
		
		<script>
			var app= angular.module('myapp',[]);
				app.controller('empcontroller',function($scope,$http){
					$scope.insertdata=function(){
						$http.post("test2.php",
							{'empno':$scope.empno,'fname':$scope.fname,'lname':$scope.lname,'dept':$scope.dept}
						)
						.success(function(data,status,headers,config){
							console.log("data inserted successfully");
						});
					}
				});
		</script>
	</div>
</body>
</html>

PHP:
<?php
require '../../../vendor/autoload.php';

$db_user = 'user1';
$db_pass = 'user1password';
$db_host = 'localhost';
$db_port = '27017';
$db_name = 'datenbank';
$db_coll = 'mycoll';

// Funktioniert nicht, aber da ich eh lokal arbeite, ist das vorerst nicht so wichtig:
//$connection = new MongoDB\Client('mongodb://'.$db_user.':'.$db_pass.'@'.$db_host.':'.$db_port);

$client = new MongoDB\Client("mongodb://localhost:27017");
$collection = $client->$db_name->$db_coll;

// Codezeilen um die Datenfelder aus der HTML mit AngularJS auszulesen
$data = json_decode(file_get_contents("php://input"));
$empno = $data->empno;
$fname = $data->fname;
$lname = $data->lname;
$dept = $data->dept;

// Erzeuge Array mit den Datenfeldern
$doc = array(
	"emp_no" => $empno,
	"first_name" => $fname,
	"last_name" => $lname,
	"dept_name" => $dept
	);
$collection->insertOne($doc);
?>

Ausgabe der MongoDB:
Code:
> db.mycoll.find().pretty()
{
        "_id" : ObjectId("586d4afe5cdaa407080072c3"),
        "emp_no" : "123",
        "first_name" : "John",
        "last_name" : "Deere",
        "dept_name" : "IT"
}
{
        "_id" : ObjectId("586d4e865cdaa407080072cb"),
        "emp_no" : "123456",
        "first_name" : "Benny",
        "last_name" : "Hill",
        "dept_name" : "King"
}

Nun bin ich erstmal super zufrieden. Da ich zunächst nur lokal auf der DB arbeiten werde, brauche ich die korrekte authentifizierung vorerst nicht.

Vielen Dank an alle Helfer für eure Hilfe! :cool_alt:
 
Zuletzt bearbeitet:
Zurück
Oben