pdo

pdo对象的使用。pdo是一个统一抽象层,各种具体的数据库,依赖具体的驱动,如pdo_mysqlpdo_pgsqpdo_sqlite等等。虽然安装依赖,但是,放心,php7以上,它们都已经在标准库了,可能是编译php的时候,并没有编译而已,所以,从标准的php源码中,拷贝即可(注意:一定要版本对应,才行,否则,各种报错等等)

golang也有统一的抽象层,java呢,对应的是jdbc。

配置

mysql


$db = [
    'dsn'=>'mysql:host=;port=3403;dbname=;charset=utf8',
    'user'=>'root',
    'pass'=>'passwd',
];
$pdo = new \PDO($db['dsn'], $db['user'], $db['pass'], array(
    \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION
));

pg

$db = [
    'dsn'=> 'pgsql:host=uat-ydalg.yundasys.com;port=5432;dbname=gpdb;',
    'user'=> 'gpadmin',
    'pass'=> 'gpadmin',
];
$pdo = new \PDO($db['dsn'], $db['user'], $db['pass'], array(
    \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION
));

sqlite

\define('DB_DSN','sqlite:dipain.db');
\define('DB_USER',null);
\define('DB_PASS',null);

字符集

如果不配置,则可能会出现,乱码或者全是?

\define('DB_DSN','mysql:host=10.172.58.20;port=3404;dbname=yii_uat2;charset=utf8');

参数

//fetch 参数
\PDO::FETCH_COLUMN  //返回一个字段
PDO::FETCH_ASSOC  // 返回一个关联数组,常用
PDO::FETCH_NUM  // 返回一个以0开始的数组,即普通的数组

增删改查

初始化

$pdo = new \PDO($db['dsn'], $db['user'], $db['pass'], array(
    \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION
));

方式1:直接查询

//方式1:
$stat = $pdo->query("select column_name from information_schema.columns where table_schema='yunchou' and table_name='td_msg_json';");
$data = $stat->fetchAll(PDO::FETCH_ASSOC);

方式2:变量绑定

适合查询、更新、删除等等。

//
$sql = 'SELECT ' . $field . ' FROM ' . $table . ' WHERE ' . $where;
$stat = $pdo->prepare($sql);
$stat->execute($param);   //注意,返回true或false  所以,不能链式调用
//  查询时,获取数据  或fetchAll
$stat->fetch(\PDO::FETCH_ASSOC); 

方式3:直接执行sql

$int_number = $pdo->exec($sql);  //返回 int 

方式4:逐行获取

本意是不想本地缓存数据,逐行读取,貌似,依然是一次读取到内存的样子。

$stat = $pdo->query($sql);
while($row = $stat->fetch(\PDO::FETCH_NUM)){
    fputcsv($fd,$row);
}