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

时间:2021-07-05 19:23:27

    php连接到mysql数据库,经典的方式就是使用mysql_connect(),具体代码如下:

mysql_connect($db_host, $db_user, $db_pass) or die(mysql_error());
mysql_select_db($db_name);

     浏览器提示: 本扩展自 PHP 5.5.0 起已废弃,并在将来会被移除。应使用 MySQLi 或 PDO_MySQL 扩展来替换之。于是一通搜索,就有了接下来这篇文章的来源。
         这里的 mysql是一个扩展的API ,目的是为了简化php对mysql数据库的 操作
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>"; 
}
?>

        上面的这段代码是一个完整的从连接到查询再到关闭数据库的一个例子。从该例子中可以看到,mysql_connect()和mysqli_connect()函数的用法上的小区别。

//mysql
mysql_connect("localhost","root","123456");
mysql_select_db("userInfo");

//mysqli
mysqli_connect("localhost","root","123456","test");

     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一个对象,然后使用该实例 对象 进行操作。

​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;//关闭连接
?>

           由于从PHP 6 开始要完全使用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的驱动默认已经打开(前面没有用于注释的分号),如有连接其他数据库的需要,自行添加其他数据库的驱动程序(取出相应的项前面的分号,没有的添上)。

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

//各数据库的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";
    classdbextendsPDO{
       publicfunction__construct(){
            try{
                parent::__construct("$GLOBALS[dsn]",$GLOBALS['user'],$GLOBALS['pass']);
             }catch(PDOException$e){
                 die("Error: ".$e->__toString()."<br/>");
            }
       }
       publicfinalfunctionquery($sql){
            try{
                returnparent::query($this->setString($sql));
            }catch(PDOException$e){
                die("Error: ".$e->__toString()."<br/>");
            }
       }
       privatefinalfunctionsetString($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 — 异常克隆