PHP连接到mysql的方法--mysqli和PDO

php连接到mysql数据库,经典的方式就是使用mysql_connect(),但此扩展自 PHP 5.5.0 起已废弃,之后被移除,因此本文介绍另外2种扩展方式
1、mysqli
mysqli是对mysql的一个增强版,出现在PHP 5 及以后的版本。它主要在一下几方面比mysql增强了:
(1)、面向对象接口;(2)、prepared语句支持(译注:关于prepare请参阅mysql相关文档);(3)、多语句执行支持;(4)、事务支持;(5)、增强的调试能力;(6)、嵌入式服务支持

    <?php   
    $link = mysqli_connect("localhost","root","123456","test") or die("Error " . mysqli_error($link)); //连接,test为数据库的名称  
    $query = "SELECT name FROM userInfo" or die("Error in the consult.." . mysqli_error($link));//查询  
    $result = mysqli_query($link, $query);//查询的结果  
    while($row = mysqli_fetch_array($result)) {   
        echo $row["name"] . "<br>";   
    }  
    ?>  

上面的这段代码是一个完整的从连接到查询再到关闭数据库的一个例子。mysqli的连接数据库方法中除了使用上述(又称之为面向过程)之外,另外一种就是面向对象方式:

    <?php  
    $mysqli = new mysqli("localhost","root","123456","test") //填写mysql用户名、密码及数据库的名称  
        or die("Could not connect to MySQL server!");  
    $mysqli->query("set names utf8"); //设置数据库内数据的编码,相当于同时设置客户端、服务器端和脚本编码方式。  
        $sql  = "select * from userInfo";  
    $result = $mysqli->query($sql);  
    if($result){  
        if($result->num_rows>0){  
            while($row =$result->fetch_array()){//循环输出结果集中的记录  
                echo ($row[0])." ";  
                echo ($row[1])." ";  
                echo ($row[2])." ";  
                echo "<br/>";  
            }  
        }  
    }else{  
        echo "Sorry!";  
    }  
    $result=NULL;   
    $mysqli->close();  
    ?>  

这种用法中,使用mysqli之前要先new一个对象,然后使用该实例对象进行操作。
2、PDO
PHP的一个数据对象,它提供了一个统一的连接数据库的API,它代表的是和数据库之间的一个连接,类似于java中的jdbc。
简单举例如下:

    <?php  
    $pdo = new PDO('pgsql:host=192.168.1.111;port=5432;dbname=anydb', 'anyuser', 'pw');//连接到数据库  
    sleep(5);  
    $stmt = $pdo->prepare('SELECT * FROM sometable');  
    $stmt->execute();  
    $pdo = null;//关闭连接  
    ?>  

PS:
由于从PHP 6 开始要完全使用PDO方式而非其他方式连接数据库,所以接下来对PDO简单介绍一下:

1)、为什么要用PDO,用PDO有什么好处?
PDO(PHP数据对象),是PHP访问数据库的一个轻量级的统一接口。它提供了一个数据访问抽象层,这也就是说无论什么数据库都能用相同的方法进行查询或读取。需要注意的是PDO本身并不能实现任何的数据库功能,而是必须要使用一个具体数据库的PDO驱动进行访问数据库服务。

2)、怎么用PDO?
这里我们就以PHP的黄金搭档mysql作为例子看看:
PDO_MYSQL:PDO_MYSQL是PDO接口能够完成连接mysql数据库的驱动(注:仅使用于mysql 3.x以上版本)。
安装:打开php.ini文件,可以找到如下代码,这里可以看到mysql的驱动默认已经打开(前面没有用于注释的分号),如有连接其他数据库的需要,自行添加其他数据库的驱动程序(取出相应的项前面的分号,没有的添上)。

    //各数据库的PDO驱动  
    extension=php_pdo.dll   
    extension=php_pdo_firebird.dll //Firebird  
    extension=php_pdo_informix.dll //Informix  
    extension=php_pdo_mssql.dll    //sql server  
    extension=php_pdo_mysql.dll    //mysql  
    extension=php_pdo_oci.dll      //Oracle  
    extension=php_pdo_oci8.dll   
    extension=php_pdo_odbc.dll     //DB2  
    extension=php_pdo_pgsql.dll    //PostgreSQL  
    extension=php_pdo_sqlite.dll   //SQLite  

连接:通过创建PDO基类的实例创建连接。

//连接到数据库  
//$db = new PDO('mysql:host=localhost;dbname=test', $user, $pass); 
    //处理连接错误  
    try {  
        $db = new PDO('mysql:host=localhost;dbname=test', $user, $pass);  
        //查询  
        foreach($db->query('SELECT * from FOO') as $row) {  
            print_r($row);  
        }  
        $dbh = null;  
    } catch (PDOException $e) {  
        print "Error!: " . $e->getMessage() . "<br/>";  
        die();  
    }  
//关闭连接  
$db = null; 

PDO方式连接数据库mysql的实例:

    <?php  
        $dbms='mysql';       //数据库 mysql  
        $host='localhost';   //数据库主机名  
        $dbName='test';      //数据库名  
        $user='root';        //连接用户名  
        $pass='';            //密码  
        $dsn="$dbms:host=$host;dbname=$dbName";  
        class db extends PDO{  
           public function __construct(){  
                try{  
                    parent::__construct("$GLOBALS[dsn]",$GLOBALS['user'],$GLOBALS['pass']);  
                 }catch(PDOException$e){  
                     die("Error: ".$e->__toString()."<br/>");  
                }  
           }  
           public final function query($sql){  
                try{  
                    return parent::query($this->setString($sql));  
                }catch(PDOException$e){  
                    die("Error: ".$e->__toString()."<br/>");  
                }  
           }  
           private final function setString($sql){  
                echo"处理查询";  
                return $sql;  
           }  
        }  
        $db=new db();  
        $db->setAttribute(PDO::ATTR_CASE,PDO::CASE_UPPER);  
        foreach($db->query('select * from table_name') as $row){  
           print_r($row);  
        }  
        $db->exec('delete from table_name where id=11');  
    ?>  

3)、更多的PDO方法:

PDO::beginTransaction — 启动一个事务  
PDO::commit — 提交一个事务  
PDO::__construct — 创建一个表示数据库连接的 PDO 实例  
PDO::errorCode — 获取跟数据库句柄上一次操作相关的 SQLSTATE  
PDO::errorInfo — Fetch extended error information associated with the last operation on the database handle  
PDO::exec — 执行一条 SQL 语句,并返回受影响的行数  
PDO::getAttribute — 取回一个数据库连接的属性  
PDO::getAvailableDrivers — 返回一个可用驱动的数组  
PDO::inTransaction — 检查是否在一个事务内  
PDO::lastInsertId — 返回最后插入行的ID或序列值  
PDO::prepare — Prepares a statement for execution and returns a statement object  
PDO::query — Executes an SQL statement, returning a result set as a PDOStatement object  
PDO::quote — Quotes a string for use in a query.  
PDO::rollBack — 回滚一个事务  
PDO::setAttribute — 设置属性 
PDOStatement::bindColumn — 绑定一列到一个 PHP 变量  
PDOStatement::bindParam — 绑定一个参数到指定的变量名  
PDOStatement::bindValue — 把一个值绑定到一个参数  
PDOStatement::closeCursor — 关闭游标,使语句能再次被执行。  
PDOStatement::columnCount — 返回结果集中的列数  
PDOStatement::debugDumpParams — 打印一条 SQL 预处理命令  
PDOStatement::errorCode — 获取跟上一次语句句柄操作相关的 SQLSTATE  
PDOStatement::errorInfo — 获取跟上一次语句句柄操作相关的扩展错误信息  
PDOStatement::execute — 执行一条预处理语句  
PDOStatement::fetch — 从结果集中获取下一行  
PDOStatement::fetchAll — 返回一个包含结果集中所有行的数组  
PDOStatement::fetchColumn — 从结果集中的下一行返回单独的一列。  
PDOStatement::fetchObject — 获取下一行并作为一个对象返回。  
PDOStatement::getAttribute — 检索一个语句属性  
PDOStatement::getColumnMeta — 返回结果集中一列的元数据  
PDOStatement::nextRowset — 在一个多行集语句句柄中推进到下一个行集  
PDOStatement::rowCount — 返回受上一个 SQL 语句影响的行数  
PDOStatement::setAttribute — 设置一个语句属性  
PDOStatement::setFetchMode — 为语句设置默认的获取模式。  
Exception::getMessage — 获取异常消息内容。  
Exception::getPrevious — 返回异常链中的前一个异常  
Exception::getCode — 获取异常代码  
Exception::getFile — 获取发生异常的程序文件名称  
Exception::getLine — 获取发生异常的代码在文件中的行号  
Exception::getTrace — 获取异常追踪信息  
Exception::getTraceAsString — 获取字符串类型的异常追踪信息  
Exception::toString — 将异常对象转换为字符串  
Exception::clone — 异常克隆 
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,158评论 4 370
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,600评论 1 307
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,785评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,655评论 0 220
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,075评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,002评论 1 225
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,146评论 2 318
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,918评论 0 211
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,671评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,838评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,318评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,636评论 3 263
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,343评论 3 244
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,187评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,982评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,126评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,934评论 2 279

推荐阅读更多精彩内容

  • Welcome 目前网络上充斥着大量的陈旧信息,让PHP新手误入歧途,传播着错误的实践和糟糕的代码,这必须得到纠正...
    layjoy阅读 21,601评论 7 118
  • pdo类PDO是一个“数据库访问抽象层”,作用是统一各种数据库的访问接口,与mysql和mysqli的函数库相比,...
    桖辶殇阅读 826评论 0 0
  • 更改ip和dnsVi /etc/sysconfig/network-scripts/ifcfg-eth0vi /...
    Xwei_阅读 1,769评论 0 3
  • 1. 说明  美年健康也是一个认真打的比赛,初赛B榜最高分0.0279,排名15. 最初是想用它实践一下自然...
    xieyan0811阅读 361评论 1 0
  • 短颈鹿与千层酥 黎棠始终忘不了初见那个男孩的场景。 父亲黎海在潮禾镇上有一家小店,叫海棠小店。母亲过世早,...
    短颈鹿与千层酥阅读 260评论 0 1