设为首页 收藏本站
查看: 1865|回复: 0

[经验分享] 【捷哥浅谈PHP】第十四弹---NoSQL数据库之PHP连接MongoDB

[复制链接]

尚未签到

发表于 2017-4-1 08:16:27 | 显示全部楼层 |阅读模式
大家好,我又来跟大家啰嗦了,今天外面的天气由于阴天好像不是很热,相比前几天的持续高温,今天已经凉爽了很多,不过出门要记得带伞哦!

好了,今天我们就来完成唐僧师徒的取经大业!


上一回我们讲了MongoDB的游标,索引和聚合,本回我们接着来搞定我们的PHP连接MongoDB数据库!

今天我们来搞定MongoDB的4个核心类:

1,针对mongoDB连接的操作:Mongo
2,针对mongoDB中数据库的操作:MongoDB
3,针对mongoDB中collection的操作:MongoCollection
4,针对查询结果集的操作:MongoCursor

大家还记得我们用PHP使用PDO,使用memcache,是不是都需要在环境下给php打模块,扩展包!

MongoDB同样需要PHP来打模块,编译扩展包:

好,我们来看下编译的步骤:

1)首先下载最新的php mongodb扩展源码,源码可以在http://pecl.php.net/package/mongo下载.
2)然后解压出来
tar zxvf mongo-1.2.6.tgz
DSC0000.jpg



3)进入文件夹后,首先运行phpize来准备编译扩展的环境
/usr/local/php/bin/phpize
DSC0001.jpg


4)运行后,我们运行./configure脚本来进行配置
./configure --with-php-config=/usr/local/php/bin/php-config
DSC0002.jpg



--with-php-config这个参数是告诉配置脚本php-config这个程序的路径

5)这时用make来编译扩展
DSC0003.jpg
make && make install
正确编译执行结果如下(下图是编译输出的最后几行)

6)完成后,请编辑你php.ini文件增加一行
extension=mongo.so
一般默认的编译php的ini文件/usr/local/php/etc/php.ini
DSC0004.jpg

重启Apache 打开phpinfo
看到mongo模块,证明MongoDB的php扩展安装成功

好,我们来看这四个核心类:
首先,来看第一个类:Mongo(连接)类
先看它的构造方法:

public Mongo::__construct([ string $server = "mongodb://localhost:27017" [, array $options = array("connect" => TRUE) ]] )

通过它的构造方法我们可以看出,实例化的时候可以填写用户名密码,还有主机地址,第二个参数为选项,可以指明主从复制等一些选项,这里不过多去讲了!

好,我们来看以下代码:

复制代码

  • <?php
  • //连接localhost:27017
  • $conn = new Mongo();
  • //连接远程主机默认端口
  • $conn = new Mongo('test.com');
  • //连接远程主机22011端口
  • $conn = new Mongo('test.com:22011');
  • //MongoDB有用户名密码
  • $conn = new Mongo("mongodb://${username}:${password}@localhost");
  • //MongoDB有用户名密码并指定数据库blog
  • $conn = new Mongo("mongodb://${username}:${password}@localhost/blog");
  • //多个服务器
  • $conn = new Mongo("mongodb://localhost:27017,localhost:27018");
  • ?>


通过以上事例,我们可以看到,在实例化Mongo类的时候,我们可以指定连接的用户名,密码,地址,端口,要选择的数据库;

还可以什么都不写,不写的情况下,默认进入的是test数据库,如果我们要选择其他数据库,我们这里可以使用以下方法进行选择:

public MongoDB Mongo::selectDB ( string $name )

也就是:

复制代码

  • <?php
  • //选择数据库
  • $db = $conn->selectDB('dahuaxiyou');
  • ?>



MongoDB选择数据库还有一种很简单的方法,那就是直接使用连接对象调用数据库名称即可:

复制代码

  • <?php
  • //通过数据库名称直接选择数据库
  • $db = $conn->dahuaxiyou;
  • ?>



我们还可以使用listDBs()方法查看数据库列表:

public array Mongo::listDBs ( void )

这里返回的是一个数组,返回所有数据库的名称等信息!

除此之外还可以使用dropDB方法来删除数据库

public array Mongo::dropDB ( mixed $db )

最后,Mongo类还有一个很有用的方法,关闭数据库连接的方法:

public bool Mongo::close ( void )

好,我们再来看第二个类------MongoDB(数据库)类

给数据库用户授权的方法:

public array authenticate ( string $username , string $password )

执行数据库命令的方法:

public array command ( array $command [, array $options = array() ] )

构造方法

public__construct ( Mongo $conn , string $name )

创建集合的方法:

public MongoCollection createCollection ( string $name [, bool $capped = FALSE [, int $size = 0 [, int $max = 0 ]]] )

删除数据库的方法:

public array drop ( void )

删除集合的方法:

public array dropCollection ( mixed $coll )

返回上一条Mongo错误的方法:

public array lastError ( void )

选择集合的方法:

public MongoCollection selectCollection ( string $name )


第三个类------MongoCollection(集合)类:

构造方法:

public__construct ( MongoDB $db , string $name )

获取文档总数

public int count ([ array $query = array() [, int $limit = 0 [, int $skip = 0 ]]] )

删除集合内的索引

public array deleteIndex ( string|array $keys )

删除集合内的所有索引

public array deleteIndexes ( void )

删除当前集合

public array drop ( void )

创建索引

public bool ensureIndex ( string|array $key|keys [, array $options = array() ] )

查询集合内的文档

public MongoCursor find ([ array $query = array() [, array $fields = array() ]] )

查询集合内满足条件的一条文档

public array findOne ([ array $query = array() [, array $fields = array() ]] )

新增一条文档

public bool|array insert ( array $a [, array $options = array() ] )

移除文档

public bool|array remove ([ array $criteria = array() [, array $options = array() ]] )

新增或更新文档

public mixed save ( array $a [, array $options = array() ] )

更新文档

public bool|array update ( array $criteria , array $new_object [, array $options = array() ] )


第四个类------MongoCursor(游标)类

获取下一个游标:

public array getNext ( void )

判断是否有下一个游标:

public bool hasNext ( void )

显示几条文档:

public MongoCursor limit ( int $num )

将游标向后移一位:

public void next ( void )

将游标跳过N个文档:

public MongoCursor skip ( int $num )

将文档排序:

public MongoCursor sort ( array $fields )

好,通过这四个类,我们就可以写一个简单的新闻发布系统:

index.php 首页列表
复制代码

  • <?php
  • include 'header.php';
  • if(!empty($_GET['info'])){
  • echo "<script>alert('".$_GET['info']."')</script>";
  • }
  • //$result = $collection->find(array(),array("title"=>1,"ptime"=>1))->sort(array("ptime"=>-1));
  • //var_dump($result);
  • ?>

  • <div id='content'>
  • <?php
  • //定义页大小
  • $page_size = 10;

  • //计算文档总数
  • $count = $collection->count();

  • //当前页码
  • $page_num = empty($_GET['page'])?'1':$_GET['page'];

  • //查询出当前页
  • $doc = $collection->find(array(),array("title"=>1,"ptime"=>1))->limit($page_size)->skip(($page_num-1)*$page_size)->sort(array("ptime"=>-1));


  • //总页数
  • $page_count = ceil($count/$page_size);

  • //遍历游标,输出结果集
  • while($doc->hasNext()){
  • $res = $doc->getNext();
  • //var_dump($res);
  • echo '<div class="doc" >※';
  • echo $res['title'];
  • echo '<span>发表时间:'.date('Y-m-d H:i:s',$res['ptime']->sec).'</span></div>';
  • }

  • ?>
  • <script>
  • function show(id){
  • window.location.href='show.php?id='+id;
  • }
  • </script>
  • <div class="page">

  • <!--分页的链接-->

  • <a href='index.php?page=1'>第一页</a>
  • <a href='index.php?page=<?php echo (($page_num-1)<=1)?1:($page_num-1);?>'>上一页</a>
  • <a href='index.php?page=<?php echo (($page_num+1)>=$page_count)?$page_count:($page_num+1);?>'>下一页& lt;/a>
  • <a href='index.php?page=<?php echo $page_count;?>'>最后一页</a>
  • 共<?php echo $page_count?>页
  • 总计<?php echo $count?>条新闻
  • 当前第<?php echo $page_num?>页

  • </div>
  • </div>
  • <?php include 'footer.php'; ?>



header.php 页头
复制代码

  • <?php include 'Mongoconn.php';?>
  • <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  • <html>
  • <head>
  • <title>MongoDB微型新闻发布系统</title>
  • <link rel="stylesheet" type="text/css" href="ueditor/themes/default/ueditor.css"/>
  • <meta http-equiv='Content-Type' content='text/html;charset=utf-8'>
  • <style>
  • body{
  • font-family:微软雅黑;
  • }
  • #main{
  • margin:0 auto;
  • width:960px;
  • }
  • #header{
  • height:100px;
  • line-height:100px;
  • border:1px solid #999;
  • text-align:center;
  • font-size:30px;
  • }
  • #content{
  • margin-top:10px;
  • border:1px solid #999;
  • padding-top:20px;
  • }
  • #content .doc{
  • height:45px;
  • line-height:45px;
  • border-bottom:1px dashed #999;
  • width:90%;
  • margin:0px auto;
  • font-size:13px;
  • padding:0 15px;
  • cursor:pointer;
  • }
  • #content .page{
  • margin:10px 0;
  • text-align:center;
  • height:50px;
  • line-height:50px;
  • }
  • #footer{
  • height:60px;
  • line-height:60px;
  • text-align:center;
  • margin-top:10px;
  • border:1px solid #999;
  • }
  • .doc span{
  • float:right;
  • }
  • #menu{
  • height:50px;
  • border:1px solid #999;
  • margin-top:10px;
  • }
  • #menu ul{
  • float:right;
  • }
  • #menu li{
  • float:left;
  • list-style:none;
  • margin-right:20px;
  • }
  • #post{
  • height:500px;
  • border:1px solid #999;
  • margin:10px auto;
  • padding:30px;
  • }
  • #title{
  • margin-bottom:10px;
  • }
  • #sub{
  • margin-top:10px;
  • }
  • #sub input{
  • width:60px;
  • height:25px;
  • margin-right:10px;
  • }
  • #show{
  • border:1px solid #999;
  • padding:15px;
  • margin-top:10px;
  • }
  • #show_title{
  • margin:0 auto;
  • text-align:center;
  • font-weight:700;
  • font-size:20px;
  • color:green;
  • }
  • #show_content{
  • padding: 5px 20px;
  • font-size:14px;
  • }

  • </style>
  • <script src="jquery.js" type="text/javascript" charset="utf-8"></script>
  • <script type="text/javascript" charset="utf-8" src="./ueditor/editor_config.js"></script>
  • <script type="text/javascript" charset="utf-8" src="./ueditor/editor_all.js"></script>
  • <script type="text/javascript">
  • $(function(){
  • $('.doc').hover(function(){
  • $(this).css("background",'#ddd');
  • },function(){
  • $(this).css("background","white");
  • });
  • });
  • </script>
  • </head>
  • <body>
  • <div id='main'>
  • <div id='header'>基于MongoDB的新闻发布系统</div>
  • <div id='menu'>
  • <ul>
  • <li><a href='index.php'>查看新闻</a></li>
  • <li><a href='add.php'>添加新闻</a></li>
  • </ul>
  • </div>




Mongoconn.php 连接MongoDB数据库文件
复制代码

  • <?php
  • header('Content-Type:text/html;charset=utf-8');
  • try{
  • $conn = new Mongo("mongodb://news:news27017@192.168.88.89/news");
  • }catch(MongoException $e){
  • exit("数据库连接错误!".$e->getMessage());
  • }
  • $db = $conn->news;
  • $collection = $db->news;
  • ?>




add.php 添加页面

复制代码

  • <?php
  • include 'header.php';
  • $_POST['ptime']=new MongoDate();
  • //var_dump($_POST);
  • if(!empty($_POST['title'])){
  • if($collection->insert($_POST)){
  • header("location:index.php?id=".$_GET['id']."&info=发表成功!");
  • }
  • }
  • ?>
  • <div id='post'>
  • <form action='' method='post'>
  • <div id='title'>
  • <label name='title'>标题:</lable><input type='text' name='title' style='width:700px' />
  • </div>
  • <div id='con'>
  • <textarea name='content' id='news_content'></textarea>
  • <script type="text/javascript">
  • var editor_a = new baidu.editor.ui.Editor();

  • //渲染编辑器
  • //function render(){
  • editor_a.render('news_content');
  • //}
  • </script>
  • </div>
  • <div id='sub'>
  • <input type='submit' value='提交' />
  • <input type='reset' value='重填' />
  • </div>
  • </form>
  • </div>
  • <?php include 'footer.php';?>



del.php 删除页面

复制代码

  • <?php
  • include 'mongoconn.php';
  • if($_GET['id']){
  • if($collection->remove(array('_id'=>new MongoID($_GET['id'])))){
  • header('location:index.php?info=删除成功!');
  • }else{
  • header('location:index.php?info=删除失败!');
  • }
  • }
  • ?>



mod.php修改页面

  • <?php
  • include 'header.php';
  • if(!empty($_POST['title'])){
  • if(!empty($_GET['id'])){
  • if($collection->update(array("_id"=>new MongoID($_GET['id'])),array('$set'=>$_POST))){
  • header("location:show.php?id=".$_GET['id']."&info=修改成功!");
  • }
  • }
  • }
  • $result = $collection->findOne(array("_id"=>new MongoID($_GET['id'])),array("title"=>1,"content"=>1));
  • ?>
  • <div id='post'>
  • <form action='' method='post'>
  • <div id='title'>
  • <label name='title'>标题:</lable><input type='text' name='title' style='width:92%;' value='<?php echo $result['title']?>' />
  • </div>
  • <div id='con'>
  • <textarea name='content' id='news_content'><?php echo $result['content']?></textarea>
  • <script type="text/javascript">
  • var editor_a = new baidu.editor.ui.Editor();

  • //渲染编辑器
  • //function render(){
  • editor_a.render('news_content');
  • //}
  • </script>
  • </div>
  • <div id='sub'>
  • <input type='submit' value='提交' />
  • <input type='reset' value='重填' />
  • </div>
  • </form>
  • </div>
  • <?php include 'footer.php';?>



show.php新闻详情页

复制代码

  • <?php
  • include 'header.php';
  • //var_dump($_GET);
  • if(!empty($_GET['info'])){
  • echo "<script>alert('".$_GET['info']."')</script>";
  • }
  • if($_GET['id']){
  • //$collection->remove(array('_id'=>new MongoID($_GET['id'])));
  • $result = $collection->findOne(array("_id"=>new MongoID($_GET['id'])));
  • //var_dump($result);
  • }
  • ?>
  • <div id='show'>
  • <div id='show_title'>
  • <?php echo $result['title']?>
  • </div>
  • <div style='height:10px;border-top:1px dashed #999;margin:15px 0;text-align:right;font-size:12px;line-height:30px'>
  • 发表于:<?php echo date("Y-m-d H:i:s",$result['ptime']->sec) ?>
  • </div>
  • <div id='show_content'>
  • <?php echo $result['content']?>
  • <div style='font-size:13px;text-align:right'><span><a href='mod.php?id=<?php echo $result['_id']?>'>编辑</a> | </span><span><a href='del.php?id=<?php echo $result['_id']?>'>删除</a> </span></div>
  • </div>
  • </div>

  • <?php include 'footer.php'?>



footer.php 页脚

复制代码

  • <div id='footer'>版权归LAMP兄弟连所有</div>
  • </div>
  • </body>
  • </html>



注意:在MongoDB当中传递_id的时候,需要使用new MongoId($_GET['id']),把_id转为Mongo对象的ID,才能找到数据库中的文档!
分页的原理如果还是不明白,可以查看【捷哥浅谈PHP】第五弹---分页之九阳神功
至此,我们的MongoDB就全部学完,如学习过程当中有什么不明白的,可以跟帖留言,或者跟我QQ交流:86267659,或者进我的微博:http://weibo.com/u/1372373023

MongoDB系列文章:
【捷哥浅谈PHP】第九弹---NoSQL数据库之MongoDB的介绍及安装
【捷哥浅谈PHP】第十弹---NoSQL数据库之MongoDB的CURD操作(一)
【捷哥浅谈PHP】第十一弹---NoSQL数据库之MongoDB的CURD操作(二)
【捷哥浅谈PHP】第十二弹---NoSQL数据库之MongoDB的CURD操作(三)
【捷哥浅谈PHP】第十三弹---NoSQL数据库之MongoDB的CURD操作(四)

更多精彩,请猛击:
【捷哥浅谈PHP】第一弹---php位运算符”|”和逻辑运算符”||”遇到的问题
【捷哥浅谈PHP】第二弹---经典算法的运用(冒泡排序和快速排序)
【捷哥浅谈PHP】第三弹---使用二分查找法查找数组中的元素位置
【捷哥浅谈PHP】第四弹---递归函数
【捷哥浅谈PHP】第五弹 --- 分页之九阳神功
【捷哥浅谈PHP】第六弹 ---- 使用for循环输出九九乘法表

【捷哥浅谈PHP】第七弹 ---- 基于角色的访问控制RBAC
【捷哥浅谈PHP】第八弹---使用PHP的date函数输出日历

原文地址:http://bbs.lampbrother.net/read-htm-tid-120215.html

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-358363-1-1.html 上篇帖子: 选择java还是php?《Java和PHP的web开发技术比较》 下篇帖子: [PHP]进阶教程:PHP中Cookies与Sessions的创建和使用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表