分类: php

  • PHP连接MySQL数据库

     PHP为什么要连接数据库呢?

    如果首次接触PHP,会有这样的疑问。

    当然,也可以不连接数据库,PHP程序也可以正常运行。

    PHP程序代码,只负责业务逻辑的处理,对于输入的数据进行计算并输出结果。

    比如,你给一段计算和值的代码输入1,2….10,程序计算完并返回结果55。

    此时,如果想把这个计算过程中,输入数据和输出数据存储下来,就需要数据库了。

    PHP可以连接哪些数据库?

    只要数据库和程序之间有相应的统一接口,就可以连接,常见的MySQL, PostgreSQL,SQL Server,Oracle,MongoDB,Redis都可以连接,其中以MySQL使用最为广泛。

    PHP程序如何与MySQL数据库交互?

    PHP与MySQL是互相独立的软件,两者若要进行数据交互,

    就必须相互暴露相关的API,这些API通常是基于各自源码开发的扩展程序。

    PHP与数据库进行数据交互,主要有以下三种扩展:

    1) mysql扩展

    2) mysqli扩展

    3) PDO_MYSQL扩展

    上面3种扩展都是基于PHP核心代码编写的扩展库, 都有对应的库函数和类。

    上面3种扩展连接数据库服务器,可以使用以下2种数据库驱动:

    1. MySQL Client Library [ libmysql ]
    2. MySQL Native Driver  [mysqlnd ]

    注意,这两个库是底层的,直接和数据库服务器交互的,没有提供PHP代码编程接口,是安装PHP的时候就指定的。

    php扩展-libmysql关系图[1]

    注意:

    自PHP5.4.x,默认的驱动由libmysql变为mysqlnd,自PHP 5.5.0 libmysql被废弃,自PHP 7.0.0 libmysql开始被移除,这是因为mysqlnd是由PHP官方发布的新一代驱动程序,之前的libmysql的由MySQL AB发布,从而规避了版权问题,这只是一方面的原因,mysqlnd是直接集成在PHP源码中的,使用PHP的内存管理系统,支持PHP的内存限制,比libmysql有更快执行速度和更少的内存使用率。

    PHP mysqlnd数据库驱动结构图

    php mysqlnd结构图[2]

    mysqlnd和libmysql在内存占用上的对比:

    limysql和mysqlnd在内存占用上的对比[3]

    可以看到,libmysql查询的数据在内存中存储了2份,而mysqlnd只存储了一份。

    使用mysqlnd,运行PHP的主机可以不用安装数据库,而之前使用libmysql这是必须的。

    mysqlnd还有更多特性,例如,增强的持续连接,SSL支持等,所以是时候抛弃libmysql了。

    PHP连接MySQL数据库代码示例:

    <?php
    // mysqli
    $mysqli = new mysqli("example.com", "user", "password", "database");
    $result = $mysqli->query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL");
    $row = $result->fetch_assoc();
    echo htmlentities($row['_message']);
    
    // PDO
    $pdo = new PDO('mysql:host=example.com;dbname=database', 'user', 'password');
    $statement = $pdo->query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL");
    $row = $statement->fetch(PDO::FETCH_ASSOC);
    echo htmlentities($row['_message']);
    
    // mysql
    $c = mysql_connect("example.com", "user", "password");
    mysql_select_db("database");
    $result = mysql_query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL");
    $row = mysql_fetch_assoc($result);
    echo htmlentities($row['_message']);
    ?>
    • mysqli扩展提供了丰富的面向对象编程模式来操作数据库的方式,比只支持函数式编程的mysql扩展好很多。
    • PDO方式虽然在编程上稍复杂一点,程序效率稍慢点,但是当业务的数据库类型变化时,基本上不用修改代码,因为它为各个不同的数据库定义了一个统一的接口。
    • mysql_connect方式的连接已经淘汰了。

    参考资料
    [1] http://jpauli.github.io/2014/07/21/php-and-mysql-communication-mysqlnd.html
    [2] http://jpauli.github.io/2014/07/21/php-and-mysql-communication-mysqlnd.html
    [3] Andrey Hristov <andrey@mysql.com>

  • PHP中constant用法举例

    如果define定义的常量的名字在程序中是个变量,可以使用constant()函数来获取常量的值。

    <?php
    defind('Windows_Browser', 'InternetExploer');
    defind('Mac_Browser', 'Safari');
    defind('Windows_Slide', 'PowerPoint');
    defind('Windows_Slide', 'Keynote');
    $os = 'Windows';
    $software = 'Slide';
    echo constant($os.'_'.$software);

     

     

  • PHP函数set_exception_handler在各个版本中的差异

    PHP函数set_exception_handler用来设置用户自定义的异常处理函数,

    此函数的参数在PHP5和PHP7之间存在一些差异,

    PHP7对传入 exception_handler 的参数从 Exception 改为 Throwable

    <?php
    // PHP 5 写法
    function handler(Exception $e) { ... }
    set_exception_handler('handler');
    
    // 兼容 PHP 5 and 7
    function handler($e) { ... }
    
    // PHP 7 写法
    function handler(Throwable $e) { ... }
    ?>

    这个错误存在于Codeigniter 3.06以前的版本。

    参考资料:

    http://stackoverflow.com/questions/36982769/codeigniter-ci-exceptionsshow-exception-error-after-updating-to-php-7

    https://secure.php.net/manual/zh/language.exceptions.php

    https://github.com/bcit-ci/CodeIgniter/issues/4137

  • ubuntu 16.04 安装PHP Redis 扩展步骤

    git clone https://github.com/phpredis/phpredis.git
    cd phpredis
    git fetch origin
    git checkout php7
    phpize
    ./configure
    make && make install
    如果没有phpize,需要先安装

    apt-get install php7.0-dev

  • PHP计算时间间隔

    <?php
    /**
     * 计算时间间隔
     */
    $start = new DateTime('2015-1-11 8:04:00');
    $end   = new DateTime('2019-8-31 9:30:10');
    $interval = $start->diff($end);
    echo $interval->format('%Y Years %m Months %d Days, %h Hours  %i minutes %s Seconds.');  
    
    //04 Years 7 Months 20 Days, 1 Hours  26 minutes 10 Seconds.
    

    版本要求:

    PHP 5 >= 5.2.0

    此版本及之后 Datetime 类和相关函数作为PHP核心发布,无需额外安装。

     

  • 设计模式单例示例【PHP】

    <?php
    class Car {
        private static $instance;
        private function __clone(){}
        private function __construct() {}
        public static function getInstance()
        {
            if ( self::$instance instanceof self ) {
                return self::$instance;
            } else {
                return self::$instance = new self();
            }
        }
        public function getColor()
        {
            return 'red';
        }
    }
    $car = Car::getInstance();
    echo $car->getColor();

     

  • PHP array_walk使用类方法

    array_walk($content, array($this, 'wrap'), 'p');
    
    public function wrap(&$item, $key, $tag) {
       $item = '<'.$tag.'>'.$item.'';
    }