【捷哥浅谈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

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

W外链微信推广短连接怎么做?

制作微信推广链接的难点分析 一、内容创作难度 制作微信推广链接时,首先需要创作有吸引力的内容。这不仅要求内容本身有趣、有价值,还要能够激起人们的分享欲望。对于许多企业和个人来说,尤其是那些缺乏创意和写作能力的人来说,这是制作微信推广链接的一大难点。 二、精准定位难度 微信用户群体庞大,不同用户的需求和兴趣各异。因此,制作推广链接时需要精准定位目标受众,以便更有效地吸引他们点击并分享链接

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

浅谈主机加固,六种有效的主机加固方法

在数字化时代,数据的价值不言而喻,但随之而来的安全威胁也日益严峻。从勒索病毒到内部泄露,企业的数据安全面临着前所未有的挑战。为了应对这些挑战,一种全新的主机加固解决方案应运而生。 MCK主机加固解决方案,采用先进的安全容器中间件技术,构建起一套内核级的纵深立体防护体系。这一体系突破了传统安全防护的局限,即使在管理员权限被恶意利用的情况下,也能确保服务器的安全稳定运行。 普适主机加固措施:

Java 连接Sql sever 2008

Java 连接Sql sever 2008 /Sql sever 2008 R2 import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class TestJDBC

实例:如何统计当前主机的连接状态和连接数

统计当前主机的连接状态和连接数 在 Linux 中,可使用 ss 命令来查看主机的网络连接状态。以下是统计当前主机连接状态和连接主机数量的具体操作。 1. 统计当前主机的连接状态 使用 ss 命令结合 grep、cut、sort 和 uniq 命令来统计当前主机的 TCP 连接状态。 ss -nta | grep -v '^State' | cut -d " " -f 1 | sort |

深入理解数据库的 4NF:多值依赖与消除数据异常

在数据库设计中, "范式" 是一个常常被提到的重要概念。许多初学者在学习数据库设计时,经常听到第一范式(1NF)、第二范式(2NF)、第三范式(3NF)以及 BCNF(Boyce-Codd范式)。这些范式都旨在通过消除数据冗余和异常来优化数据库结构。然而,当我们谈到 4NF(第四范式)时,事情变得更加复杂。本文将带你深入了解 多值依赖 和 4NF,帮助你在数据库设计中消除更高级别的异常。 什么是

DM8数据库安装后配置

1 前言 在上篇文章中,我们已经成功将库装好。在安装完成后,为了能够更好地满足应用需求和保障系统的安全稳定运行,通常需要进行一些基本的配置。下面是一些常见的配置项: 数据库服务注册:默认包含14个功能模块,将这些模块注册成服务后,可以更好的启动和管理这些功能;基本的实例参数配置:契合应用场景和发挥系统的最大性能;备份:有备无患;… 2 注册实例服务 注册了实例服务后,可以使用系统服务管理,

速了解MySQL 数据库不同存储引擎

快速了解MySQL 数据库不同存储引擎 MySQL 提供了多种存储引擎,每种存储引擎都有其特定的特性和适用场景。了解这些存储引擎的特性,有助于在设计数据库时做出合理的选择。以下是 MySQL 中几种常用存储引擎的详细介绍。 1. InnoDB 特点: 事务支持:InnoDB 是一个支持 ACID(原子性、一致性、隔离性、持久性)事务的存储引擎。行级锁:使用行级锁来提高并发性,减少锁竞争

开源分布式数据库中间件

转自:https://www.csdn.net/article/2015-07-16/2825228 MyCat:开源分布式数据库中间件 为什么需要MyCat? 虽然云计算时代,传统数据库存在着先天性的弊端,但是NoSQL数据库又无法将其替代。如果传统数据易于扩展,可切分,就可以避免单机(单库)的性能缺陷。 MyCat的目标就是:低成本地将现有的单机数据库和应用平滑迁移到“云”端