PHP PDO 学习笔记

 更新时间:2016年11月25日 16:09  点击:1379

■PDO为何物?
POD(PHP Data Object)扩展在PHP5中加入,PHP6中将默认识用PDO连接数据库,所有非PDO扩展将会在PHP6被从扩展中移除。该扩展提供PHP内置类 PDO来对数据库进行访问,不同数据库使用相同的方法名,解决数据库连接不统一的问题。
我是配置在windows下做开发用的。
■PDO的目标
  • 提供一种轻型、清晰、方便的 API
  • 统一各种不同 RDBMS 库的共有特性,但不排除更高级的特性。
  • 通过 PHP 脚本提供可选的较大程度的抽象/兼容性。
  • ■PDO的特点:
  • 性能。PDO 从一开始就吸取了现有数据库扩展成功和失败的经验教训。因为 PDO 的代码是全新的,所以我们有机会重新开始设计性能,以利用 PHP 5 的最新特性。
  • 能力。PDO 旨在将常见的数据库功能作为基础提供,同时提供对于 RDBMS 独特功能的方便访问。
  • 简单。PDO 旨在使您能够轻松使用数据库。API 不会强行介入您的代码,同时会清楚地表明每个函数调用的过程。
  • 运行时可扩展。PDO 扩展是模块化的,使您能够在运行时为您的数据库后端加载驱动程序,而不必重新编译或重新安装整个 PHP 程序。例如,PDO_OCI 扩展会替代 PDO 扩展实现 Oracle 数据库 API。还有一些用于 MySQL、PostgreSQL、ODBC 和 Firebird 的驱动程序,更多的驱动程序尚在开发。

    ■安装PDO
    我这里是WINDOWS下开发用的PDO扩展,要是你要在Linux下安装配置,请到别的地方寻找。
    版本要求:
    php5.1以及以后版本的程序包里已经带了;
    php5.0.x则要到pecl.php.net下载,放到你的扩展库,就是PHP所在的文件夹的ext文件夹下;
    手册上说5.0之前的版本不能运行PDO扩展。

    配置:
    修改你的php.ini配置文件,使它支持pdo.(php.ini这个东西没有弄懂的话,先弄清楚,要修改调用你的phpinfo()函数所显示的那个php.ini)

    extension=php_pdo.dll前面的分号去掉,分毫是php配置文件注释符号,这个扩展是必须的。
    往下还有
    ;extension=php_pdo.dll
    ;extension=php_pdo_firebird.dll
    ;extension=php_pdo_informix.dll
    ;extension=php_pdo_mssql.dll
    ;extension=php_pdo_mysql.dll
    ;extension=php_pdo_oci.dll
    ;extension=php_pdo_oci8.dll
    ;extension=php_pdo_odbc.dll
    ;extension=php_pdo_pgsql.dll
    ;extension=php_pdo_sqlite.dll

    各各扩展所对应的数据库是:



    关键字:apache+mysql+php apache mysql php 配置 lamp 服务器 web


    Linux+Apache+Mysql+PHP典型配置

    调试环境:Redhat9.0 Apache1.3.29 Mysql3.23.58 PHP4.3.4

    Linux系统的安装我就不讲了,这是基本功,其实这篇文章在类似Redhat的其他linux也应该通用,大家只要掌握我提供的方法就行。记得安装Redhat9。0的时候不要安装系统默认的apache,mysql和php以及相关的软件。已经安装的请用rpm -e * 删除已经安装的包。

    1.安装Mysql3.23.58

    其实老实说直接安装Mysql官方网站提供的rpm包也是一个比较可行的办法,他的官方网站的rpm包的提供基本跟tar包发行是同步的,这点我比较喜欢,至少安装rpm包的在后面的调试中不会出现mysql库文件找不到的情况。但这里还是有必要讲一下自定义安装的步骤,毕竟网友自定义安装的还说挺多的。

    软件获取:http://www.mysql.com/downloads/index.html

    安装步骤:

    tar zxvf mysql-3.23.58.tar.gz
    cd mysql-3.23.58

    ./configure --prefix=/usr/local/mysql --sysconfdir=/etc --localstatedir=/var/lib/mysql

    make

    make install

    #prefix=/usr/local/mysql mysql安装的目标目录

    #sysconfdir=/etc my.ini配置文件的路径

    #localstatedir=/var/lib/mysql 数据库存放的路径

    安装完以后要初始化数据库,当然你是升级的话不用做这步;

    /usr/local/mysql/bin/mysql_install_db


    如果系统没有mysql这个用户的话,最好做以下这步:

    useradd -M -o -r -d /var/lib/mysql -s /bin/bash -c "MySQL Server" -u 27 mysql

    然后我启动mysql

    /usr/local/mysql/bin/safe_mysqld &

    ok,先看看mysql能否正常工作

    mysql -uroot mysql

    一般情况下都是不能正常链接数据库,错误提示一般为:

    ERROR 2002: Can''t connect to local MySQL server through socket ''/var/lib/mysql/mysql.sock'' (2)

    其实网上大家问的最多的都是整个问题,说什么链接不到mysqld.sock,其实大家不妨看看mysql的错误日志就明白怎么回事,我这里的错误日志是在

    /var/lib/mysql/*.err 你会发现mysql只所以不能启动,是因为/var/lib/mysql的权限不允许mysql服务访问,英文mysql默认是调用mysql用户来启动服务的,好了,既然知道是什么原因找到不能启动,那就简单了。我们只要

    chown -R mysql:mysql /var/lib/mysql 就行,如果还是启动不了,再慢慢调试权限,反正一般启动不了都是权限的问题。

    如果大家还是不能启动不了的话,那就用我的比较繁琐的权限的设置,反正我每次都是这么做的,一般不会有问题,见下:

    chown -R root /usr/local/mysql
    chgrp -R mysql /usr/local/mysql
    chown -R root /usr/local/mysql/bin
    chgrp -R mysql /usr/local/mysql/bin
    chgrp -R mysql /var/lib/mysql
    chmod 777 /var/lib/mysql
    chown -R root /var/lib/mysql/mysql
    chgrp -R mysql /var/lib/mysql/mysql
    chmod 777 /var/lib/mysql/mysql
    chown -R root /var/lib/mysql/mysql/*
    chgrp -R mysql /var/lib/mysql/mysql/*
    chmod 777 /var/lib/mysql/mysql/*
    chmod 777 /usr/local/mysql/lib/mysql/libmysqlclient.a


    做完上面的步骤,然后把你编译目录的一个脚本COPY过去

      Server+Client+WSDL

     

    声明:很简单!!!!!!

    参考了如下:

     

    先建Server,然后使用wsdl工具来生成wsdl,我用的是zend development environment,

    zde中的tools中的wsdl generator wizard

    第一页是名字,和输出地址(输出后直接挪过去就OK)

    第二页是类和地址,类挑上勾,URL那里添server那个文件的地址

    第三页 finish

    别忘了拷那个wsdl过去...

     

    记得server引用的那个类文件里不要有输出.

     

    一共有两个需要添地址的地方

    一个是wsdl中的描述http://127.0.0.1/test/CulculatorServer.php

    一个是client中的连接http://127.0.0.1/test/Culculator.wsd

     

    类文件

     

    <?php

    /**

     * @name Culculator.php

     * @date Fri Jan 25 12:43:40 CST 2008

     * @copyright 马永占(MyZ)

     * @author 马永占(MyZ)

     * @link http://blog.111cn.net/mayongzhan/

     */

     

    class Culculator

    {

           /**

            * 求和

            *

            * @param float $x

            * @param float $y

            * @return float

            */

           public function add($x, $y)

           {

                  return $x + $y;

           }

    }

    ?>

     

    Server

     

    <?php

    /**

     * @name CulculatorServer.php

     * @date Fri Jan 25 12:44:04 CST 2008

     * @copyright 马永占(MyZ)

     * @author 马永占(MyZ)

     * @link http://blog.111cn.net/mayongzhan/

     */

     

    include(''./Culculator.php'');

    $server = new SoapServer(''./Culculator.wsdl'');

    $server->setClass(''Culculator'');

    $server->handle();

    ?>

     

    Client

     

    <?php

    /**

     * @name CulculatorClient.php

     * @date Fri Jan 25 12:43:54 CST 2008

     * @copyright 马永占(MyZ)

     * @author 马永占(MyZ)

     * @link http://blog.111cn.net/mayongzhan/

     */

     

    $soap = new SoapClient(''http://127.0.0.1/test/Culculator.wsdl'');

    echo $soap->add(1, 2);

    ?>

     

    WSDL

     

    <?xml version=''1.0'' encoding=''UTF-8''?>

     

    <!-- WSDL file generated by Zend Studio. -->

     

    <definitions name="math" targetNamespace="urn:math" xmlns:typens="urn:math" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/">

           <message name="add">

                  <part name="x" type="xsd:float"/>

                  <part name="y" type="xsd:float"/>

           </message>

           <message name="addResponse">

                  <part name="addReturn" type="xsd:float"/>

           </message>

           <portType name="CulculatorPortType">

                  <operation name="add">

                         <documentation>

                                求和

                         </documentation>

                         <input message="typens:add"/>

                         <output message="typens:addResponse"/>

                  </operation>

           </portType>

           <binding name="CulculatorBinding" type="typens:CulculatorPortType">

                  <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>

                  <operation name="add">

                         <soap:operation soapAction="urn:CulculatorAction"/>

                         <input>

                                <soap:body namespace="urn:math" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>

                         </input>

                         <output>

                                <soap:body namespace="urn:math" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>

                         </output>

                  </operation>

           </binding>

           <service name="mathService">

                  <port name="CulculatorPort" binding="typens:CulculatorBinding">

                         <soap:address location="http://127.0.0.1/test/CulculatorServer.php"/>

                  </port>

           </service>

    </definitions>

    Driver name Supported databases
    PDO_DBLIB FreeTDS / Microsoft SQL Server / Sybase
    PDO_FIREBIRD Firebird/Interbase 6
    PDO_INFOR

    Server+Client

     

    上篇用了wsdl这个写不用wsdl.

     

    声明:很简单!!!!!!

    参考了如下:

    http://blog.111cn.net/phphot/archive/2007/07/15/1692109.aspx

     

    类文件

     

    <?php

    /**

    * 实现业务逻辑的类,此类是一个普通类

    *

    */

    class Basic {

           /**

            * 返回一个字符串:Hello World!

            *

            * @return string

            */

           public function returnString($test){

                   return "Hello World!".$test;

           }

    }

    ?>

    Server

     

    <?php

    /**

    * Web ServiceServer端,包含类文件。

    */

    require_once("basic.php");

    /**

    * 创建Server对象

    */

    $arrOptions = array(''uri''=>''checkAPI'');    //设置命名空间

    $objSoapServer = new SoapServer(null,$arrOptions);

    /**

    * 注册Basic类的所有方法

    */

    $objSoapServer->setClass("Basic");

    /**

    * 处理请求

    */

    $objSoapServer->handle();

    ?>

     

    Client

     

    <?php

    /**

    * Client端,首先创建Client对象

    */

    $arrOptions = array(''uri''=>''checkAPI'',                     //设置命名空间

                           ''location''=>''http://localhost/user/soaptest.php'',        //设置Server地址

                           ''trace''=>true);

    $objSoapClient = new SoapClient(null,$arrOptions);

    /**

    * 远程调用

    */

    $test=''ok123'';

    try{

       $strReturn = $objSoapClient->returnString($test);

    }catch(Exception $e){

    }

    /**

    * 打印结果

    */

    echo $strReturn;

    ?>

     fsockopen

    socket方式打开一个连接

    我最常用的是模拟post

    这个是小李挖掘的到的...不错

    至于要模拟get方式....直接file_get_content就行了.

    代码见后面

     

    stream_socket_client, 代码见后面

    这个和fsockopenfsockopen一样.socket方式打开一个连接,只是参数不同

     

    stream_socket_server

    建立一个socket server, 代码见后面

    如果是建立的是tcpserver 就用stream_socket_accept进行通讯

    如果是建立的是udpserver 就用stream_socket_recvfromstream_socket_sendto进行通讯,而且stream_socket_server中需要加个参数STREAM_SERVER_BIND

     

    还有个socket扩展,这个是最基础的建立socket,但是从5.3.0开始就放到pecl中了.

    这里就不介绍了.

     

    ---------------------------- stream_socket client---------------------------

     

    <?php

    /**

     * @name test.php

     * @date Sun Jan 27 00:49:00 CST 2008

     * @copyright 马永占(MyZ)

     * @author 马永占(MyZ)

     * @link http://blog.111cn.net/mayongzhan/

     */

     

    $xport = "tcp";

    $port = "8001";

    $ip = "127.0.0.1";

    $address = "{$xport}://{$ip}:{$port}";

    $fp = stream_socket_client($address, $errno, $errstr, 1);

    if (!$fp) {

        echo "$errstr ($errno)<br /> ";

    } else {

        fwrite($fp, " ");

        echo fread($fp, 1024);

        fclose($fp);

    }

    ?>

     

    ---------------------------- streamSocketServer---------------------------

     

    <?php

    /**

     * @name test2.php

     * @date Sun Jan 27 00:45:57 CST 2008

     * @copyright 马永占(MyZ)

     * @author 马永占(MyZ)

     * @link http://blog.111cn.net/mayongzhan/

     */

    header("Content-type: text/html;charset=utf-8");

    //设置不超时.服务端当然不能超时

    set_time_limit(0);

    //得到可用socket

    $xportlist = stream_get_transports();

    echo "transports: ";

    foreach ($xportlist as $value) {

           echo "{$value} ";

    }

    //定义一些东西

    $xport = "tcp";

    $port = "8001";

    $address = "{$xport}://0.0.0.0:{$port}";

    //建立socketserver

    if ($xport==''tcp'') {

           $socket = stream_socket_server($address, $errno, $errstr);

    }

    elseif ($xport==''udp'') {

           $socket = stream_socket_server($address, $errno, $errstr, STREAM_SERVER_BIND);

    }

    if (!$socket) {

           echo "{$errstr} ({$errno}) ";

    }

    else {

           echo "listening {$xport}:{$port} ... ";

           if ($xport==''tcp'') {

                  //许可一个socket连接,-1超时

                  while ($conn = stream_socket_accept($socket,-1)) {

                         //得到访问的端口

                         $peer = stream_socket_get_name($conn,true);

                         echo "$peer ";

                      fwrite($conn, ''The local time is '' . date("Y-m-d H:i:s "));

                      fclose($conn);

                  }

           }

           elseif ($xport==''udp'') {

                  do {

                         //得到访问的端口

                      $pkt = stream_socket_recvfrom($socket, 1, 0, $peer);

                      echo "$peer ";

                      stream_socket_sendto($socket, date("Y-m-d H:i:s "), 0, $peer);

                  } while ($pkt !== false);

           }

           //关闭socket

           fclose($socket);

    }

    ?>

     

    ---------------------------- fsockopen(post)---------------------------

     

    <?php

    /**

     * @name test.php

     * @date Sat Jan 26 23:01:23 CST 2008

     * @copyright 马永占(MyZ)

     * @author 马永占(MyZ)

     * @link http://blog.111cn.net/mayongzhan/

     */

     

    /**

     * php 发送POST请求

     *

     * @param string $url 提交到的地址

     * @param array $data 要提交的参数 array(''a''=>'''',''b''=>'''');

     * @return string

     */

    function virtualPost($url, $data) {

           $url = parse_url($url);

           if (!$url) return "URL不能解析";

           if (!isset($url[''port'']))  $url[''port''] = "";

           if (!isset($url[''query''])) $url[''query''] = ""; 

           $encoded = "";

           while (list($k,$v) = each($data)) {

                  $encoded .= ($encoded ? "&" : "");

                  $encoded .= rawurlencode($k)."=".rawurlencode($v);

           }

           //$fp = stream_socket_client($url[''host''].":".($url[''port''] ? $url[''port''] : 80));

           $fp = fsockopen($url[''host''], $url[''port''] ? $url[''port''] : 80);

           if (!$fp) return "不能打开到$url[host]的连接";

           //发送

           fputs($fp, sprintf("POST %s%s%s HTTP/1.0 ", $url[''path''], $url[''query''] ? "?" : "", $url[''query'']));

           fputs($fp, "Host: $url[host] ");

           fputs($fp, "Content-type: application/x-www-form-urlencoded ");

           fputs($fp, "Content-length: " . strlen($encoded) . " ");

           fputs($fp, "Connection: close ");

           fputs($fp, "$encoded ");

           //接受

           $line = fgets($fp,1024);

           if (!eregi("^HTTP/1.. 200", $line)) return "返回结果错误";

           //滤掉空行

           $results = "";

           $inheader = 1;

           while(!feof($fp)) {

                  $line = fgets($fp,1024);

                  //把剩余的头信息过滤掉

                  if ($inheader && ($line == " " || $line == " ")) {

                         $inheader = 0;

                  }elseif (!$inheader) {

                         $results .= $line;

                  }

           }

           fclose($fp);

           return $results;

    }

    echo virtualPost(''http://127.0.0.1/test/test2.php'',array(myz=>''马永占''));

     

    ?>

  • [!--infotagslink--]

    相关文章

    • PyTorch一小时掌握之迁移学习篇

      这篇文章主要介绍了PyTorch一小时掌握之迁移学习篇,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-08
    • php上传图片学习笔记与心得

      我们在php中上传文件就必须使用#_FILE变量了,这个自动全局变量 $_FILES 从 PHP 4.1.0 版本开始被支持。在这之前,从 4.0.0 版本开始,PHP 支持 $HTTP_POST_FILES 数组。这...2016-11-25
    • Smarty模板学习笔记之Smarty简介

      1、简介Smarty是一个使用PHP写出来的模板PHP模板引擎,是目前业界最著名的PHP模板引擎之一。它分离了逻辑代码和外在的内容,提供了一种易于管理和使用的方法,用来将原本与HTML代码混杂在一起PHP代码逻辑分离。简单的讲,目...2014-05-31
    • php Observer观察者模式之学习笔记

      当我们在星际中开地图和几家电脑作战的时候,电脑的几个玩家相当于结盟,一旦我们出兵进攻某一家电脑,其余的电脑会出兵救援。 那么如何让各家电脑知道自己的盟友被攻击了...2016-11-25
    • PHP 日期函数 学习笔记介绍

      举一个简单的date例子 我将使用echo命令把内容输出到我们的客户端(浏览器)。我将使用下面的代码做为基础代码。 代码如下 复制代码 <!DOCTY...2016-11-25
    • 学习 Vue.js 遇到的那些坑

      这篇文章主要介绍了学习 Vue.js 遇到的那些坑,帮助大家更好的理解和使用vue框架,感兴趣的朋友可以了解下...2021-02-04
    • 开启BootStrap学习之旅

      当下最流行的前端开发框架Bootstrap,可大大简化网站开发过程,从而深受广大开发者的喜欢,你如果也喜欢Bootstrap前端开发框架,不要错过这次旅行...2016-05-05
    • 值得分享和收藏的Bootstrap学习教程

      这绝对是一套值得分享和大家收藏的Bootstrap学习教程,完整的知识体系,系统的学习资料,帮助大家开启Bootstrap学习之旅,享受Bootstrap带给大家的奇妙乐趣...2016-05-14
    • AI:如何训练机器学习的模型

      这篇文章主要介绍了是如何进行机器学习的模型的训练,全文逻辑清晰,简单易懂,如果您正在学习机器学习那么可以参考下,说不定会有不一样的收货...2021-04-16
    • Android学习笔记之多界面切换实例

      一篇Android学习笔记之多界面切换实例,希望对各位朋友有所帮助。 用过VB 、 VC#的朋友都知道,在VB或VC#里要进行窗口(界面)切换很容易 例如在VB、C#里: 有 Fom1、...2016-09-20
    • php中的变量引用传值学习笔记

      引用:意思是将原始对象在内存中的地址传递给目标对象,就相当于原始对象和目标对象指向的是同一个内存地址。此时,如果对目标对象或者原始对象进行修改,内存中的数据也会改...2016-11-25
    • PHP中的cURL请求及示例学习笔记

      cURL是php中一个很强大的功能,可以模仿各种用户请求,如模仿用户登录,发送php cookie等等操作,下面我来整理一些相关的方法与各位同学看看 备注:使用curl_init函数,必须...2016-11-25
    • 那些年,我还在学习C# 学习笔记

      那些年学了ASP.NET后,才开始学习C#,说来也怪,怎么学了ASP.NET才来学习C#,其实没有什么的...2020-06-25
    • YII2 WIDGET的学习笔记

      CWidget是所有Widget的基类。CWidget是自包含组件,可以看出是MVC的简略版,CWidget相比Controller,既没有actions,也没有filters widget,英文意思为小工具,小挂件,在程序...2016-11-25
    • metasploit调用nexpose扫描学习笔记

      Metasploit是一个免费的、可下载的框架,通过它可以很容易地获取、开发并对计算机软件漏洞实施攻击。它本身附带数百个已知软件漏洞的专业级漏洞攻击工具 nexpose安...2016-11-25
    • php学习笔记之PHP扩展开发教程

      PHP扩展开发不是所有开发者都会操作的一个东西,下面我来演示一个关于PHP扩展开发实现过程,各位同学有需要可进入参考。 我们先假设需要这样一个扩展,提供一个叫tao_s...2016-11-25
    • Yii2学习笔记之汉化yii设置表单的描述

      小编推荐的这篇文章介绍了Yii2学习笔记之汉化yii设置表单的描述,非常实用,有兴趣的同学快来看看吧。 一:汉化框架&#8195;&#8195;框架汉化在这里设置,如果不生效,前台后...2017-07-06
    • php Builder建造器模式学习笔记

      星际里面有不少的任务关,也可以自己编辑地图,画面上有各种地形,建筑和部队,存在一个问题,初始化画面的流程很乱。待解决的问题:完成初始化画面的工作,同时尽量减少各种绘制...2016-11-25
    • php中session学习笔记

      Session指的就是用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览这个网站所花费的时间。从上述的定义中我们可以看到,Session实际上是一个...2016-11-25
    • 学习使用PHP数组

      PHP4.0中共有超过30个新的数组相关函数。其中很多通用函数答应你检查给定数组中是否存在特定对象、对数组元素计数、增加或删除元素,或对元素排序。 假如你有很大的...2016-11-25