【捷哥浅谈PHP】第十四弹---NoSQL数据库之PHP连接MongoDB

2024-06-19 06:48

本文主要是介绍【捷哥浅谈PHP】第十四弹---NoSQL数据库之PHP连接MongoDB,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

大家好,我又来跟大家啰嗦了,今天外面的天气由于阴天好像不是很热,相比前几天的持续高温,今天已经凉爽了很多,不过出门要记得带伞哦!

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


上一回我们讲了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




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



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




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

5)这时用make来编译扩展

make && make install
正确编译执行结果如下(下图是编译输出的最后几行)

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


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

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

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

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

好,我们来看以下代码:

复制代码
  1. <?php
  2. //连接localhost:27017
  3. $conn = new Mongo();
  4. //连接远程主机默认端口
  5. $conn = new Mongo('test.com');
  6. //连接远程主机22011端口
  7. $conn = new Mongo('test.com:22011');
  8. //MongoDB有用户名密码
  9. $conn = new Mongo("mongodb://${username}:${password}@localhost");
  10. //MongoDB有用户名密码并指定数据库blog
  11. $conn = new Mongo("mongodb://${username}:${password}@localhost/blog");
  12. //多个服务器
  13. $conn = new Mongo("mongodb://localhost:27017,localhost:27018");
  14. ?>

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

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

public MongoDB Mongo::selectDB ( string $name )

也就是:

复制代码
  1. <?php
  2. //选择数据库
  3. $db = $conn->selectDB('dahuaxiyou');
  4. ?>


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

复制代码
  1. <?php
  2. //通过数据库名称直接选择数据库
  3. $db = $conn->dahuaxiyou;
  4. ?>


我们还可以使用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 首页列表
复制代码
  1. <?php
  2. include 'header.php';
  3. if(!empty($_GET['info'])){
  4. echo "<script>alert('".$_GET['info']."')</script>";
  5. }
  6. //$result = $collection->find(array(),array("title"=>1,"ptime"=>1))->sort(array("ptime"=>-1));
  7. //var_dump($result);
  8. ?>
  9. <div id='content'>
  10. <?php
  11. //定义页大小
  12. $page_size = 10;
  13. //计算文档总数
  14. $count = $collection->count();
  15. //当前页码
  16. $page_num = empty($_GET['page'])?'1':$_GET['page'];
  17. //查询出当前页
  18. $doc = $collection->find(array(),array("title"=>1,"ptime"=>1))->limit($page_size)->skip(($page_num-1)*$page_size)->sort(array("ptime"=>-1));
  19. //总页数
  20. $page_count = ceil($count/$page_size);
  21. //遍历游标,输出结果集
  22. while($doc->hasNext()){
  23. $res = $doc->getNext();
  24. //var_dump($res);
  25. echo '<div class="doc" οnclick="show(\''.$res['_id'].'\')">※';
  26. echo $res['title'];
  27. echo '<span>发表时间:'.date('Y-m-d H:i:s',$res['ptime']->sec).'
';
  • }
  • ?>
  • <script>
  • function show(id){
  • window.location.href='show.php?id='+id;
  • }
  • </script>
  • <div class="page">
  • <!--分页的链接-->
  • <a href='index.php?page=1'>第一页
  • <a href='index.php?page=<?php echo (($page_num-1)<=1)?1:($page_num-1);?>'>上一页
  • <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;?>'>最后一页
  • 共<?php echo $page_count?>页
  • 总计<?php echo $count?>条新闻
  • 当前第<?php echo $page_num?>页
  • <?php include 'footer.php'; ?>


  • header.php 页头
    复制代码
    1. <?php include 'Mongoconn.php';?>
    2. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    3. <html>
    4. <head>
    5. <title>MongoDB微型新闻发布系统</title>
    6. <link rel="stylesheet" type="text/css" href="ueditor/themes/default/ueditor.css"/>
    7. <meta http-equiv='Content-Type' content='text/html;charset=utf-8'>
    8. <style>
    9. body{
    10. font-family:微软雅黑;
    11. }
    12. #main{
    13. margin:0 auto;
    14. width:960px;
    15. }
    16. #header{
    17. height:100px;
    18. line-height:100px;
    19. border:1px solid #999;
    20. text-align:center;
    21. font-size:30px;
    22. }
    23. #content{
    24. margin-top:10px;
    25. border:1px solid #999;
    26. padding-top:20px;
    27. }
    28. #content .doc{
    29. height:45px;
    30. line-height:45px;
    31. border-bottom:1px dashed #999;
    32. width:90%;
    33. margin:0px auto;
    34. font-size:13px;
    35. padding:0 15px;
    36. cursor:pointer;
    37. }
    38. #content .page{
    39. margin:10px 0;
    40. text-align:center;
    41. height:50px;
    42. line-height:50px;
    43. }
    44. #footer{
    45. height:60px;
    46. line-height:60px;
    47. text-align:center;
    48. margin-top:10px;
    49. border:1px solid #999;
    50. }
    51. .doc span{
    52. float:right;
    53. }
    54. #menu{
    55. height:50px;
    56. border:1px solid #999;
    57. margin-top:10px;
    58. }
    59. #menu ul{
    60. float:right;
    61. }
    62. #menu li{
    63. float:left;
    64. list-style:none;
    65. margin-right:20px;
    66. }
    67. #post{
    68. height:500px;
    69. border:1px solid #999;
    70. margin:10px auto;
    71. padding:30px;
    72. }
    73. #title{
    74. margin-bottom:10px;
    75. }
    76. #sub{
    77. margin-top:10px;
    78. }
    79. #sub input{
    80. width:60px;
    81. height:25px;
    82. margin-right:10px;
    83. }
    84. #show{
    85. border:1px solid #999;
    86. padding:15px;
    87. margin-top:10px;
    88. }
    89. #show_title{
    90. margin:0 auto;
    91. text-align:center;
    92. font-weight:700;
    93. font-size:20px;
    94. color:green;
    95. }
    96. #show_content{
    97. padding: 5px 20px;
    98. font-size:14px;
    99. }
    100. </style>
    101. <script src="jquery.js" type="text/javascript" charset="utf-8"></script>
    102. <script type="text/javascript" charset="utf-8" src="./ueditor/editor_config.js"></script>
    103. <script type="text/javascript" charset="utf-8" src="./ueditor/editor_all.js"></script>
    104. <script type="text/javascript">
    105. $(function(){
    106. $('.doc').hover(function(){
    107. $(this).css("background",'#ddd');
    108. },function(){
    109. $(this).css("background","white");
    110. });
    111. });
    112. </script>
    113. </head>
    114. <body>
    115. <div id='main'>
    116. <div id='header'>基于MongoDB的新闻发布系统
  • <div id='menu'>
  • <ul>
  • <a href='index.php'>查看新闻
  • <a href='add.php'>添加新闻
  • </ul>



  • Mongoconn.php 连接MongoDB数据库文件
    复制代码
    1. <?php
    2. header('Content-Type:text/html;charset=utf-8');
    3. try{
    4. $conn = new Mongo("mongodb://news:news27017@192.168.88.89/news");
    5. }catch(MongoException $e){
    6. exit("数据库连接错误!".$e->getMessage());
    7. }
    8. $db = $conn->news;
    9. $collection = $db->news;
    10. ?>



    add.php 添加页面

    复制代码
    1. <?php
    2. include 'header.php';
    3. $_POST['ptime']=new MongoDate();
    4. //var_dump($_POST);
    5. if(!empty($_POST['title'])){
    6. if($collection->insert($_POST)){
    7. header("location:index.php?id=".$_GET['id']."&info=发表成功!");
    8. }
    9. }
    10. ?>
    11. <div id='post'>
    12. <form action='' method='post'>
    13. <div id='title'>
    14. <label name='title'>标题:</lable><input type='text' name='title' style='width:700px' />
  • <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 id='sub'>
  • <input type='submit' value='提交' />
  • <input type='reset' value='重填' />
  • </form>
  • <?php include 'footer.php';?>


  • del.php 删除页面

    复制代码
    1. <?php
    2. include 'mongoconn.php';
    3. if($_GET['id']){
    4. if($collection->remove(array('_id'=>new MongoID($_GET['id'])))){
    5. header('location:index.php?info=删除成功!');
    6. }else{
    7. header('location:index.php?info=删除失败!');
    8. }
    9. }
    10. ?>


    mod.php修改页面
    1. <?php
    2. include 'header.php';
    3. if(!empty($_POST['title'])){
    4. if(!empty($_GET['id'])){
    5. if($collection->update(array("_id"=>new MongoID($_GET['id'])),array('$set'=>$_POST))){
    6. header("location:show.php?id=".$_GET['id']."&info=修改成功!");
    7. }
    8. }
    9. }
    10. $result = $collection->findOne(array("_id"=>new MongoID($_GET['id'])),array("title"=>1,"content"=>1));
    11. ?>
    12. <div id='post'>
    13. <form action='' method='post'>
    14. <div id='title'>
    15. <label name='title'>标题:</lable><input type='text' name='title' style='width:92%;' value='<?php echo $result['title']?>' />
  • <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 id='sub'>
  • <input type='submit' value='提交' />
  • <input type='reset' value='重填' />
  • </form>
  • <?php include 'footer.php';?>


  • show.php新闻详情页

    复制代码
    1. <?php
    2. include 'header.php';
    3. //var_dump($_GET);
    4. if(!empty($_GET['info'])){
    5. echo "<script>alert('".$_GET['info']."')</script>";
    6. }
    7. if($_GET['id']){
    8. //$collection->remove(array('_id'=>new MongoID($_GET['id'])));
    9. $result = $collection->findOne(array("_id"=>new MongoID($_GET['id'])));
    10. //var_dump($result);
    11. }
    12. ?>
    13. <div id='show'>
    14. <div id='show_title'>
    15. <?php echo $result['title']?>
  • <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 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']?>'>编辑 | <span><a href='del.php?id=<?php echo $result['_id']?>'>删除
  • <?php include 'footer.php'?>


  • footer.php 页脚

    复制代码
    1. <div id='footer'>版权归LAMP兄弟连所有
  • </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
    <script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/buttonLite.js#style=-1&uuid=&pophcol=3&lang=zh"></script> <script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/bshareC0.js"></script>
    阅读(181) | 评论(0) | 转发(0) |
    0

    上一篇:项目感受

    下一篇:循环

    相关热门文章
    • 中国的ADP汽车市场
    • 《数字技术与应用》征稿**投稿...
    • 上海律师事务所
    • 关于分库分表(Mysql篇)
    • 数据库性能监控工具ORATOP...
    • IP Sec VPN与NAT破镜重圆
    • 网站导航
    • GoAgent图文设置教程
    • UT2.0正式版下载
    • tomcat6.0配置(含配置视频下载...
    • 大家都是用什么来管理hadoop集...
    • 网站被人挂了吗,添加了些程序...
    • Nginx如何保证不走宕机的那个...
    • 大家谈谈MYSQL客户端和服务器...
    • 以下代码运行后为何会输出5?...
    给主人留下些什么吧!~~
    评论热议

这篇关于【捷哥浅谈PHP】第十四弹---NoSQL数据库之PHP连接MongoDB的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1074299

相关文章

【Altium】查找PCB上未连接的网络

【更多软件使用问题请点击亿道电子官方网站】 1、文档目标: PCB设计后期检查中找出没有连接的网络 应用场景:PCB设计后期,需要检查是否所有网络都已连接布线。虽然未连接的网络会有飞线显示,但是由于布线后期整板布线密度较高,虚连,断连的网络用肉眼难以轻易发现。用DRC检查也可以找出未连接的网络,如果PCB中DRC问题较多,查找起来就不是很方便。使用PCB Filter面板来达成目的相比DRC

JAVA读取MongoDB中的二进制图片并显示在页面上

1:Jsp页面: <td><img src="${ctx}/mongoImg/show"></td> 2:xml配置: <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001

Java面试题:通过实例说明内连接、左外连接和右外连接的区别

在 SQL 中,连接(JOIN)用于在多个表之间组合行。最常用的连接类型是内连接(INNER JOIN)、左外连接(LEFT OUTER JOIN)和右外连接(RIGHT OUTER JOIN)。它们的主要区别在于它们如何处理表之间的匹配和不匹配行。下面是每种连接的详细说明和示例。 表示例 假设有两个表:Customers 和 Orders。 Customers CustomerIDCus

关于如何更好管理好数据库的一点思考

本文尝试从数据库设计理论、ER图简介、性能优化、避免过度设计及权限管理方面进行思考阐述。 一、数据库范式 以下通过详细的示例说明数据库范式的概念,将逐步规范化一个例子,逐级说明每个范式的要求和变换过程。 示例:学生课程登记系统 初始表格如下: 学生ID学生姓名课程ID课程名称教师教师办公室1张三101数学王老师101室2李四102英语李老师102室3王五101数学王老师101室4赵六103物理陈

数据库期末复习知识点

A卷 1. 选择题(30') 2. 判断范式(10') 判断到第三范式 3. 程序填空(20') 4. 分析填空(15') 5. 写SQL(25') 5'一题 恶性 B卷 1. 单选(30') 2. 填空 (20') 3. 程序填空(20') 4. 写SQL(30') 知识点 第一章 数据库管理系统(DBMS)  主要功能 数据定义功能 (DDL, 数据定义语

给数据库的表添加字段

周五有一个需求是这样的: 原来数据库有一个表B,现在需要添加一个字段C,我把代码中增删改查部分进行了修改, 比如insert中也添入了字段C。 但没有考虑到一个问题,数据库的兼容性。因为之前的版本已经投入使用了,再升级的话,需要进行兼容处理,当时脑子都蒙了,转不过来,后来同事解决了这个问题。 现在想想,思路就是,把数据库的表结构存入文件中,如xxx.sql 实时更新该文件: CREAT

SQL Server中,查询数据库中有多少个表,以及数据库其余类型数据统计查询

sqlserver查询数据库中有多少个表 sql server 数表:select count(1) from sysobjects where xtype='U'数视图:select count(1) from sysobjects where xtype='V'数存储过程select count(1) from sysobjects where xtype='P' SE

SQL Server中,添加数据库到AlwaysOn高可用性组条件

1、将数据添加到AlwaysOn高可用性组,需要满足以下条件: 2、更多具体AlwaysOn设置,参考:https://msdn.microsoft.com/zh-cn/library/windows/apps/ff878487(v=sql.120).aspx 注:上述资源来自MSDN。

SQL Server中,用Restore DataBase把数据库还原到指定的路径

restore database 数据库名 from disk='备份文件路径' with move '数据库文件名' to '数据库文件放置路径', move '日志文件名' to '日志文件存放置路径' Go 如: restore database EaseWe from disk='H:\EaseWe.bak' with move 'Ease

【杂记-浅谈DHCP动态主机配置协议】

DHCP动态主机配置协议 一、DHCP概述1、定义2、作用3、报文类型 二、DHCP的工作原理三、DHCP服务器的配置和管理 一、DHCP概述 1、定义 DHCP,Dynamic Host Configuration Protocol,动态主机配置协议,是一种网络协议,主要用于在IP网络中自动分配和管理IP地址以及其他网络配置参数。 2、作用 DHCP允许计算机和其他设备通