轶哥

📚 Having fun with AI Agent. Always learning.

    PHP连接数据库进行增删查改-PDO方法-以MySQL为例
    •   更新:2017-05-03 17:51:21
    •   首发:2015-11-28 13:50:46
    •   源代码
    •   11841

      由于PHP6中将默认以PDO方法连接数据库,而PDO方法优点很多,因此此文仅介绍PDO方法连接数据库进行操作。需要注意,从 PHP 5.1 开始附带了 PDO,在 PHP 5.0 中是作为一个 PECL 扩展使用,在生产环境中强烈建议升级到PHP5.4+版本。

    PDO操作数据库的主要优点

    • 支持多种数据库(只要提供正确的数据源,其它的数据库操作是一样的)。
    • 开发效率更高,便于移植。
    • 对事务处理支持更好,特别是事务回滚。
    • 更为安全。

    典型连接代码

    /**
     * 数据库连接文件
     *
     * PDO连接MySQL数据库
     * @author      王轶<a@wyr.me>
     * @version     0.4
     * @copyright   BSD
     */
    try {
        $db_ip = "localhost";   //数据库IP地址
        $db_port = "3306";          //数据库端口号
        $db_name = "";          //数据库名称
        $db_user = "";          //数据库用户名
        $db_pass = "";          //数据库密码
        $PDO = new PDO('mysql:host='.$db_ip.';port='.$db_por.';dbname='.$db_name.';charset=utf8', $db_user, $db_pass, array(
                    PDO::ATTR_PERSISTENT => true , // 设置数据库连接为持久连接
                    PDO::ATTR_EMULATE_PREPARES => false , // 防止SQL注入
                    PDO::ATTR_ORACLE_NULLS => true , // 设置当字符串为空转换为 SQL 的 NULL
                    PDO::ATTR_ERRMODE , // 设置抛出错误
                    PDO::ERRMODE_EXCEPTION // 设置抛出错误
        ));//PDO数据库连接代码
    } catch (PDOException $e) {
        print "Error!: " . $e->;getMessage() . "<br/>";
        die();
    }
    

    注释已经说明了一切,然而这里还要强调一些东西:

      “PDO::ATTR_EMULATE_PREPARES =>; false”,这句代码的含义是:是否在本地进行参数转义。一般来说,由MySQL进行变量处理能够避免SQL注入,但会负面影响——部分汉字或符号无法正常写入数据库。这个问题在PHP5.4+版本中被解决,高版本的MySQL6.5+数据库也处理了一部分这类问题。

      需要注意的是,在编写SQL语句时需要符合其变量规则。可用以下函数进行处理:

    /**
     * 格式化SQL数据类型
     *
     * @param string $theValue 目标SQL数据类型
     * @param mixed $theType 传入需要变更类型的数据
     * @return mixed
     */
    function GetSQLValueString($theValue, $theType)
    {
        switch ($theType) {
            case "text":
                $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
                break;
            case "long":
            case "int":
                $theValue = ($theValue != "") ? intval($theValue) : "NULL";
                break;
            case "double":
                $theValue = ($theValue != "") ? doubleval($theValue) : "NULL";
                break;
            case "date":
                $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
                break;
        }
        return $theValue;
    }
    

    PDO常用函数

    PDO错误与错误处理

      这里推荐大家学习一下在构造函数中设置错误模式的方法。以下是官方的例子:

    <php
    $dsn = 'mysql:dbname=test;host=127.0.0.1';
    $user = 'googleguy';
    $password = 'googleguy';
    
    /*
        使用 try/catch 围绕构造函数仍然有效,即使设置了 ERRMODE 为 WARNING,
        因为如果连接失败,PDO::__construct 将总是抛出一个  PDOException 异常。
    */
    try {
        $dbh = new PDO($dsn, $user, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
    } catch (PDOException $e) {
        echo 'Connection failed: ' . $e->getMessage();
        exit;
    }
    
    // 这里将导致 PDO 抛出一个 E_WARNING 级别的错误,而不是 一个异常 (当数据表不存在时)
    $dbh->query("SELECT wrongcolumn FROM wrongtable");
    ?>
    

    //以插入用户名和密码为例:
    require_once("connect.php");//加载数据库连接文件,即本文第一个代码框中的代码
    $insertSQL = sprintf("INSERT INTO `admin` SET username = %s, password = %s",
                GetSQLValueString($username, "text"),
                GetSQLValueString($password, "text"));
            $Result = $PDO->exec($insertSQL);//执行数据库写入操作
            $back_id = $PDO->lastInsertId();//获取写入的数据id
            if ($Result == "1") {
                //如果成功写入一条数据
            } else {
    
            }
    $PDO = null;//关闭数据库链接
    

    require_once("config.php");//引入数据库连接文件
    
    $Result = $PDO->exec("DELETE FROM 表名称 WHERE 列名称 = 值");
    if ($Result != "0") {
        //删除成功$Result是受影响的条数
    }
    

      返回一条数据以json字符串的形式。

    require_once('config.php');//引入数据库
    
    $info = $PDO->query("SELECT * FROM `order` WHERE `id` = 1");
    $Foundinf = $info->fetch(PDO::FETCH_ASSOC);
    $PDO = null;//注销数据库
    $json = json_encode($Foundinf);
    echo $json;
    

      返回所有数据以json字符串数组的形式。

    require_once('config.php');//引入数据库
    
    $info = $PDO->query("SELECT * FROM `order`");
    $Foundinf = $info->fetchAll(PDO::FETCH_ASSOC);
    $PDO = null;//注销数据库
    $json = json_encode($Foundinf);
    echo $json;
    

      可以看到,上面两个代码的区别除了SQL语句不同外,只有fetch/fetchAll的区别。其中“PDO::FETCH_ASSOC”的含义是:以字段索引的方式返回数据。如果去除fetch()或fetchAll()中的参数,那么返回结果数字和字段两者同时返回(不太明白的同学请亲自试验一下)。在很多情况下是不必要的。

    require_once("config.php");//引入数据库连接文件
    
    $Result = $PDO->exec("UPDATE `admin` SET `username`='admin' WHERE id =1");
    if ($Result != "0") {
        //修改成功$Result是受影响的条数,如果要修改的数据和欲修改数据一样也会返回0
    }
    

    最后说一句

      本人能力有限,如有错误之处望大家不吝赐教,谢谢!

    打赏
    交流区

    暂无内容

    尚未登陆
    发布
      上一篇 (平板电脑安装Ubuntu教程-以V975w为例,Z3735系列CPU通用)
    下一篇 (C#扫描在线IP源代码-多媒体教室、公司内网管理IP搜索)  

    评论回复提醒