当前位置:编程学习 > php >>

PHP通过PDO连接mysql数据库,增加删除修改数据库代码

问题:如何在php里面用pdo连接mysql数据库

答案:首先修改php.in启用pdo和mysql

extension=php_pdo.dll
extension=php_pdo_mysql.dll


2、PDO连接数据库:

<?php
class Index
{  
    private $config = [
         // 数据库类型
        'type'            => 'mysql',
        // 服务器地址
        'hostname'        => '127.0.0.1',
        // 数据库名
        'database'        => 'zzzyk.com',
        // 用户名
        'username'        => 'root',
        // 密码
        'password'        => 'root',
        // 端口
        'hostport'        => '3306',
        // 数据库编码默认采用utf8
        'charset'         => 'utf8',
    ];
    private $pdo;
    public function __construct()
    {
        $dsn = "{$this->type}:host={$this->hostname};port={$this->hostport};";
        $dsn.= "dbname={$this->database};charset={$this->charset}";
        $pdo = new PDO($dsn, $this->username, $this->password);
        $pdo->setAttribute(PDO::ATTR_CASE, PDO::CASE_LOWER);
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $this->pdo = $pdo;
        unset($dsn);
    }
    public function demo()
    {
        $sql = 'select id,name from goods';
        $goods = $this->pdo->query($sql);
        $goods = $goods->fetchAll(PDO::FETCH_ASSOC);
 
        #  打印输出数据
        print_r($goods);
    }
}

3、PDO设置属性:

 PDO有三种错误处理方式:

1、PDO::ERrmODE_SILENT 不显示错误信息,只设置错误码

2、PDO::ERrmODE_WARNING 显示警告错

3、PDO::ERrmODE_EXCEPTION 抛出异常

$pdo->setAttribute(\PDO::ATTR_ERrmODE, \PDO::ERrmODE_EXCEPTION);

1) :当设置为PDO::ERrmODE_SILENT时可以通过调用errorCode() 或errorInfo()来获得错误信息,当然其他情况下也可以。

2) :因为不同数据库对返回的字段名称大小写处理不同,所以PDO提供了PDO::ATTR_CASE设置项(包括PDO::CASE_LOWER,PDO::CASE_NATURAL,PDO::CASE_UPPER),来确定返回的字段名称的大小写。

3) :通过设置PDO::ATTR_ORACLE_NULLS类型(包括PDO::NULL_NATURAL,PDO::NULL_EmpTY_STRING,PDO::NULL_TO_STRING)来指定数据库返回的NULL值在php中对应的数值。

4、PDO常用方法及其应用:


PDO::query() 主要是用于有记录结果返回的操作,特别是SELECT操作

PDO::exec() 主要是针对没有结果易做图返回的操作,如INSERT、UPDATE等操作

PDO::prepare() 主要是预处理操作,需要通过$rs->execute()来执行预处理里面的SQL语句,这个方法可以绑定参数,功能比较强大(防止sql注入就靠这个)

PDO::lastInsertId() 返回上次插入操作,主键列类型是自增的最后的自增ID

PDOStatement::fetch() 是用来获取一条记录

PDOStatement::fetchAll() 是获取所有记录集到一个易做图

PDOStatement::fetchColumn() 是获取结果指定第一条记录的某个字段,缺省是第一个字段

PDOStatement::rowCount() 主要是用于PDO::query()和PDO::prepare()进行DELETE、INSERT、UPDATE操作影响的结果集,对PDO::exec()方法和SELECT操作无效。


5、PDO操作实例:

【示例6,说明】,防sql注入操作:

1、使用PDO访问MySQL数据库时,真正的real prepared statements 默认情况下是不使用的。

为了解决这个问题,你必须禁用 prepared statements的仿真效果。

2、设置禁用prepared statements:$pdo->setAttribute(\PDO::ATTR_EMULATE_PREPARES, false); 

它会告诉PDO禁用模拟预处理语句,并使用 real parepared statements 。

这可以确保SQL语句和相应的值在传递到mysql服务器之前是不会被PHP解析的(禁止了所有可能的恶意SQL注入攻击)。

虽然你可以配置文件中设置字符集的属性(charset=utf8),但是需要格外注意的是,老版本的 PHP( < 5.3.6)在DSN中是忽略字符参数的。

但是我们需要注意以下几种情况,PDO并不能帮助我们防范SQL注入的:

1、你不能让占位符 ? 代替一组值,如:

select * from xc_company where id in( ? );
2、你不能让占位符代替数据表名或列名,如:

select * from yizuotu.net order by ?;
3、你不能让占位符 ? 代替任何其他SQL语法,如:

select EXTRACT( ? from date) as times from xc_company;

查看PDO都有那些方法

echo '<pre>';
print_r(get_class_methods('PDO'));
echo '</pre>';
结果:

Array
(
    [0] => __construct
    [1] => prepare
    [2] => beginTransaction
    [3] => commit
    [4] => rollBack
    [5] => inTransaction
    [6] => setAttribute
    [7] => exec
    [8] => query
    [9] => lastInsertId
    [10] => errorCode
    [11] => errorInfo
    [12] => getAttribute
    [13] => quote
    [14] => __wakeup
    [15] => __sleep
    [16] => getAvailableDrivers
)


常用实例源码:

<?php
# 【PDO连接mysql数据库】(数据库名:lmgg ,账户:root,密码:root)
$pdo = new \PDO('mysql:host=localhost;dbname=lmgg;charset=utf8','root','root'); 
# 设置数据库编码为utf-8(防止乱码)当然上面的连接设置了。
# 上面可设置也可不设置,有没有charset=utf8都可以连接上数据库
$pdo->exec('set names utf8'); 
 
# 【示例1:查询数据】:查询company表中的id和name字段。存到$data数组中去
$res = $pdo->query("select id,name from xc_company"); 
$data = [];
 
# 1:FETCH_ASSOC   关联数组形式返回 
# 2:FETCH_NUM     数字索引数组形式返回
# 设置返回数据类型方法1:
$res->setFetchMode(\PDO::FETCH_NUM); 
while($row = $res->fetch()){
    $data[] = $row;
}
echo '<pre>';
print_r($data);
echo '</pre>';
 
# 设置返回数据类型方法2:
while($row = $res->fetch(\PDO::FETCH_ASSOC)){
    $data[] = $row;
}
echo '<pre>';
print_r($data);
echo '</pre>';
 
# 【示例2:添加数据】:添加数据到company表中,并返回数据在表中的ID是多少!
$res = $pdo->exec("insert into xc_company(name) values('站长资源库添加111')");
if($res){
    echo '11添加成功数据ID为:'.$pdo->lastinsertid().'<br/>';
}
$res = $pdo->query("insert into xc_company(name) values('站长资源库添加222')");
if($res){
    echo '22添加成功数据ID为:'.$pdo->lastinsertid().'<br/>';
}
 
# 【示例3:更新数据】:
$res = $pdo->exec("update xc_company set name='站长资源库更新111' where id=26");
if($res){
    echo '更新数据成功<br/>';
}
$res = $pdo->query("update xc_company set name='站长资源库更新222' where id=26");
if($res){
    echo '成功更新数据【'.$res->rowCount().'】条<br/>';
}
 
# 【示例4:删除数据】:
$res = $pdo->exec("delete from xc_company where id=38");
if($res){
    echo '删除数据成功<br/>';
}
$res = $pdo->query("delete from xc_company where id=38");
if($res){
    echo '成功删除数据【'.$res->rowCount().'】条<br/>';
}
 
# 【示例5:统计数据】:统计company表有多少条数据
$num = $pdo->query("select count(*) from xc_company");
echo '共有数据:【'.$num->fetchColumn().'】条';
 
# 【示例6:防sql注入】:实例,使用前先看文字说明,会理解的更透彻!
#  PDO连接mysql数据库(数据库名:lmgg ,账户:root,密码:root)
$pdo = new \PDO("mysql:host=localhost; dbname=lmgg", "root", "root");
#  禁用prepared statements的仿真效果
$pdo->setAttribute(\PDO::ATTR_EMULATE_PREPARES, false); 
$pdo->query("set names 'utf8'");
$sql="select * from xc_company where name = ?";
$res = $pdo->prepare($sql);
$name = '站长资源库';
$exeres = $res->execute(array($name));
$data = [];
if($exeres){
    while ($row = $res->fetch(\PDO::FETCH_ASSOC)){
       $data[] = $row;
    }
}
echo '<pre>';
print_r($data);
echo '</pre>';
$pdo = null;
 
?>


CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,