본문 바로가기

PHP/MongoDB CRUD

PHP with MongoDB CRUD

Autoset 기반에서 PHP와 MongoDB 연동한 CRUD 예


개요

Autoset은 Windows 운영체제에 Apache Webserver, PHP, MySQL을 한꺼번에 간편하게 설치하고 관리할 수 있는 프로그램이며 무료로 배포되고 있다. 윈도우 시스템에 Autoset을 설치하면 간단하게 PHP 개발환경이 구성되기 때문에 WordPress, PHP, MySQL, MongoDB등을 학습하거나 개발할 때 도움이 될 것이다. 여기서는 Autoset 기반의 PHP환경에 MongoDB 드라이버를 설치하여 PHP에서 MongoDB와 연동하여 CRUD작업을 하는 예를 보이고자 한다


테스트 환경

Windows 7

Autoset 9 ( Apache 2.4.1, PHP 5.6, MySQL 5.6 )

MongoDB 3.0

PHP MongoDB Extension ( php mongodb driver )


Autoset 설치 참조

MongoDB 설치 참조


Autoset 기반 시스템에 MongoDB Driver 설치하기

참고: https://docs.mongodb.org/ecosystem/drivers/php/


https://pecl.php.net/package/mongodb/1.0.1/windows 에서 다운로드 링크를 제시하고 있지만 테스트해보니 

MongoClient 클래스를 찾지 못하는 오류가 발생하는 문제가 있었다

이 사이트에서는 DLL 리스트 에서 PHP 5.6, 5.5 버전과 x86, x64별로 구분하고 Non Thread Safe(NTS), Thread Safe 별로 구분된 드라이버가 링크되어 있다

현재 시스템의 운영체제와 PHP 버전에 맞는 드라이버를 다운로드한다

다음은 위의 사이트에서 제공하는 다운로드 링크의 주소이다

http://windows.php.net/downloads/pecl/releases/mongodb/1.0.1/php_mongodb-1.0.1-5.6-ts-vc11-x64.zip


인터넷을 몇시간 검색하여 찾은 아래의 링크에서는 많은 DLL 파일을 다운로드할 수 있었는데

그 중 가장 마지막에 테스트했던 파일만이 오류 없이 작동하는 것을 확인할 수 있었다

http://fatkhanfauzi.com/mongo-db-installation-on-wamp-server-windows-environment/

https://s3.amazonaws.com/drivers.mongodb.org/php/index.html


현재 오토셋의 PHP 버전이 5.6 인데 php_mongo-1.6.8.zip (최신파일)을 다운로드하여 압축을 해제하면

16개의 DLL 파일들이 있는데 PHP 5.4 버전부터 5.6버전에 해당하는 DLL 파일이 있다

그 중 가장 마지막에 php_mongo-1.6.8-5.6-vc11-x86_64.dll 파일을 테스트해보니 정상적으로 실행되는 것을 확인했다

php_mongo-1.6.8-5.6-vc11-x86_64.dll

위의 파일을 다운로드 및 압축해제 후 dll 파일을 ext 폴더 내에 복사한다

D:\AutoSet9\server\bin\ext


오토셋이 설치된 폴더의 server/conf/php.ini 편집

D:\AutoSet9\server\conf\php.ini

Windows Extensions가 설정되는 위치에 다음과 같이 추가한다

extension=php_mongo-1.6.8-5.6-vc11-x86_64.dll


서버를 다시 시동하여 다음과 같이 접속하여 스크롤해보면 mongodb가 제대로 로드되었는지 확인할 수 있다

http://127.0.0.1/index.php?action=phpinfo


MongoDB 드라이버가 로드된 것을 아래처럼 확인할 수 있다


mongodb_crud.php

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>PHP MongoDB 테스트</title>
</head>
<body>
<?php
	
try {
    // $m = new MongoClient();
    $m = new MongoClient('mongodb://localhost:27017');
    // $m = new MongoClient('mongodb://호스트명', array("username"=>"admin", "password"=>"비밀번호"));
	
	//echo "PHP에서 MongoDB 접속 성공!";
	$db = $m->mydb;			// 'mydb' 에 연결
	$collection = $db->emp;	// 'emp' 컬렉션에 연결

	// ename필드에 인덱스 설정(오름차순)
	$collection->ensureIndex( array( "ename" => 1 ) );

	// ename필드에 내림차순 인덱스, dept필드에 오름차순 인덱스 설정
	$collection->ensureIndex( array( "ename" => -1, "dept" => 1 ) );

	echo "Doc 수: ". $collection->count();
	echo "<p>";

	// INSERT
	
	$document = array("ename"=>"Andy","job"=>"Development","dept"=>"Dev");
	$resultArr = $collection->insert($document);

	$keys = array_keys($resultArr);
	for($i=0;$i<count($keys);$i++) {
		echo $keys[$i]." : ". $resultArr[$keys[$i]]."<br>";
	}

	/*	ok : 1
		n : 0
		err : 
		errmsg : 
	*/
	echo "<p>";

	// FIND
	
	$cursor = $collection->find();

	foreach ($cursor as $document) {
		printf("%d %s %s %s <br>", 
			$document["_id"],$document["ename"],$document["job"],$document["dept"]
			);
	}

	// 조건문 dept 필드에 Sales 값이 있는 Document만 검색
	
	$query = array( 'dept'=>'Sales' );
	$cursor = $collection->find( $query );

	while ( $cursor->hasNext() )
	{
		$doc = $cursor->getNext();
		echo $doc["_id"]." ".$doc["ename"]." ".$doc["job"]." ".$doc["dept"]."<br>";
	}

	// _id로 검색
	
	//$query = array("_id"=>101); // 일반 정수가 입력된 경우
	// MongoDB에서 자동으로 생성해준 아이디 값을 이용하여 검색하는 경우
	$query = array("_id"=>new MongoId("5667e08fbe1f338812000029"));
	$cursor = $collection->find( $query );
	$doc = $cursor->getNext();
	var_dump( $doc);
	

	//특정 필드만 가져오기
	
	$doc = $collection->findOne(array('ename'=>'Andy'), array('dept'));
	var_dump($doc);
	
	//$document = $collection->findOne(); 가장 위에 있는 한개의 Document 가져오기
	//$cursor->skip(3);
	//$cursor->limit(5);
	//$cursor->sort(array('x'=>1));					x필드 오름차순 정렬
	//$cursor->sort(array('date'=>1,'age'=>-1));	age 필드 내림차순 정렬
	
	// UPDATE
	
	$newdata = array('$set' => array("dept" => "Account"));
	$result = $collection->update(array("ename" => "Jone"), $newdata); // 한개의 Doc 만 갱신됨
	// $result = $collection->update(array("ename" => "Jone"), $newdata, array('multiple' => true)); // 조건 내의 모든 Doc 갱신
	var_dump($result);
	

	// UPSERT (동일한 Document가 없으면 새로 생성하고 있으면 갱신한다)

	$result = $collection->update(
		array("ename"=>"Smith"), // 검색조건
		// 저장 혹은 변경될 데이터
		array("ename"=>"Smith", "job"=>"Clerk", "dept"=>"Personnel"), 
		array("upsert"=>true)
	);
	var_dump($result);

	// DELETE
	
	$query = array("_id"=>new MongoId("5667e7c3be1f33881200002a"));
	$result = $collection->remove($query);
	if($result["n"]==1){
		echo "삭제 성공";
	}

}
catch (MongoException $e){
    echo "error message: ".$e->getMessage()."\n";
    echo "error code: ".$e->getCode()."\n";
}

$m->close();
?>
</body>
</html>