方法一:mysql扩展【这种方式php7已经淘汰】
方法二:mysqli扩展
方法三:PDO扩展
PDO(PHP Data Object)扩展为PHP访问各种数据库提供了一个轻量级,一致性的接口。无论访问什么数据库,都可以通过一致性的接口去操作。
开启PDO连接MySQL扩展,在php.ini文件里面.
extension=pdo_mysql
1、PDO类:表示PHP和数据库之间的一个连接
2、PDOStatement 类
? 第一:表示执行数据查询语句(select ,show)后的相关结果集
? 第二:预处理对象
3、PDOException类:表示PDO的异常
语法
DSN:data source name,数据源名称,包含的是连接数据库的信息,格式如下:
$dsn=数据库类型:host=主机地址;port=端口号;dbname=数据库名称;charset=字符集
数据库类型:
MySQL数据库 => mysql:
oracle数据库 => oci:
SQL Server =>sqlsrv:
具体驱动类型参见手册“PDO驱动”
实例化PDO的过程就是连接数据库的过程
<?php
$dsn='mysql:host=localhost;port=3306;dbname=dbalisys;charset=utf8';
$pdo=new PDO($dsn,'root','a56');
var_dump($pdo); //object(PDO)#1 (0) { }
?>
1、如果连接的是本地数据库,host可以省略
<?php
$dsn='mysql:port=3306;dbname=data;charset=utf8';
$pdo=new PDO($dsn,'root','root');
var_dump($pdo); //object(PDO)#1 (0) { }
2、如果使用的是3306端口,port可以省略
<?php
$dsn='mysql:dbname=data;charset=utf8';
$pdo=new PDO($dsn,'root','root');
var_dump($pdo); //object(PDO)#1 (0) { }
3、charset也省略,如果省略,使用的是默认字符编码
<?php
$dsn='mysql:dbname=data';
$pdo=new PDO($dsn,'root','root');
var_dump($pdo);
4、dbname也可以省略,如果省略就没有选择数据库
<?php
$dsn='mysql:';
$pdo=new PDO($dsn,'root','root');
var_dump($pdo);
5、host、port、dbname、charset不区分大小写,没有先后顺序
6、驱动名称不能省略,冒号不能省略(因为冒号是驱动名组成部分),数据库驱动只能小写
1.5 使用PDO
1.5.1 执行数据操作语句
方法:p d o ? > e x e c ( pdo->exec(pdo?>exec(sql),执行数据增、删、改语句,执行成功返回受影响的记录数,如果SQL语句错误返回false。
?
1.5.2 执行数据查询语句
方法:p d o ? > q u e r y ( pdo->query(pdo?>query(sql),返回的是PDOStatement对象
?
<?php
$dsn='mysql:dbname=mysql;charset=utf8';
$pdo=new PDO($dsn,'root','alibaba123456');
//1、执行数据查询语句
$stmt=$pdo->query('select * from user');
//var_dump($stmt); //object(PDOStatement)
//2、获取数据
//2.1 获取二维数组
//$rs=$stmt->fetchAll(); //默认返回关联和索引数组
//$rs=$stmt->fetchAll(PDO::FETCH_BOTH); //返回关联和索引数组
//$rs=$stmt->fetchAll(PDO::FETCH_NUM); //返回索引数组
//$rs=$stmt->fetchAll(PDO::FETCH_ASSOC); //返回关联数组
//$rs=$stmt->fetchAll(PDO::FETCH_OBJ); //返回对象数组
//2.2 获取一维数组,匹配完成后指针下移一条
//$rs=$stmt->fetch(); //关联和索引数组
//$rs=$stmt->fetch(PDO::FETCH_NUM); //索引数组
//例题:通过while循环获取所有数据
/*
while($row=$stmt->fetch(PDO::FETCH_ASSOC)){
$rs[]=$row;
}
echo '<pre>';
var_dump($rs);
*/
//3.3 匹配列:匹配当前行的第n列,列的编号从0开始,匹配完毕后指针下移一条
//echo $stmt->fetchColumn(); //获取当前行的第0列
//echo $stmt->fetchColumn(1); //获取当前行的第1列
//3.4 总行数,总列数
/*
echo '总行数:'.$stmt->rowCount(),'<br>';
echo '总列数:'.$stmt->columnCount();
*/
//3.5 遍历PDOStatement对象(PDOStatement对象是有迭代器的)
foreach($stmt as $row){
echo $row['Host'],'-',$row['User'],'<br>';
}
1、单例模式
2、初始化参数
3、连接数据库
4、执行增删改
5、执行查询
? a)返回二维数组
? b)返回一维数组
? c)返回一行一列
第一部分:单例、初始化参数、实例化PDO
<?php
class MyPDO{
private $type; //数据库类别
private $host; //主机地址
private $port; //端口号
private $dbname; //数据库名
private $charset; //字符集
private $user; //用户名
private $pwd; //密码
private $pdo; //保存PDO对象
private static $instance;
private function __construct($param) {
$this->initParam($param);
$this->initPDO();
}
private function __clone() {
}
public static function getInstance($param=array()){
if(!self::$instance instanceof self)
self::$instance=new self($param);
return self::$instance;
}
//初始化参数
private function initParam($param){
$this->type=$param['type']??'mysql';
$this->host=$param['host']??'127.0.0.1';
$this->port=$param['port']??'3306';
$this->dbname=$param['dbname']??'data';
$this->charset=$param['charset']??'utf8';
$this->user=$param['user']??'root';
$this->pwd=$param['pwd']??'alibaba123456';
}
//初始化PDO
private function initPDO(){
try{
$dsn="{$this->type}:host={$this->host};port={$this->port};dbname={$this->dbname};charset={$this->charset}";
$this->pdo=new PDO($dsn, $this->user, $this->pwd);
} catch (PDOException $ex) {
echo '错误编号:'.$ex->getCode(),'<br>';
echo '错误行号:'.$ex->getLine(),'<br>';
echo '错误文件:'.$ex->getFile(),'<br>';
echo '错误信息:'.$ex->getMessage(),'<br>';
exit;
}
}
//显示异常
private function showException($ex,$sql=''){
if($sql!=''){
echo 'SQL语句执行失败<br>';
echo '错误的SQL语句是:'.$sql,'<br>';
}
echo '错误编号:'.$ex->getCode(),'<br>';
echo '错误行号:'.$ex->getLine(),'<br>';
echo '错误文件:'.$ex->getFile(),'<br>';
echo '错误信息:'.$ex->getMessage(),'<br>';
}
//设置异常模式
private function initException(){
$this->pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
}
//执行增、删、改操作
public function exec($sql){
try{
return $this->pdo->exec($sql);
} catch (PDOException $ex) {
$this->showException($ex, $sql);
exit;
}
}
//获取自动增长的编号
public function lastInsertId(){
return $this->pdo->lastInsertId();
}
//判断匹配的类型
private function fetchType($type){
switch ($type){
case 'num':
return PDO::FETCH_NUM;
case 'both':
return PDO::FETCH_BOTH;
case 'obj':
return PDO::FETCH_OBJ;
default:
return PDO::FETCH_ASSOC;
}
}
//获取所有数据 ,返回二维数组
public function fetchAll($sql,$type='assoc'){
try{
$stmt=$this->pdo->query($sql); //获取PDOStatement对象
$type= $this->fetchType($type); //获取匹配方法
return $stmt->fetchAll($type);
} catch (Exception $ex) {
$this->showException($ex, $sql);
}
}
//获取一维数组
public function fetchRow($sql,$type='assoc'){
try{
$stmt=$this->pdo->query($sql); //获取PDOStatement对象
$type= $this->fetchType($type); //获取匹配方法
return $stmt->fetch($type);
} catch (Exception $ex) {
$this->showException($ex, $sql);
exit;
}
}
//返回一行一列
public function fetchColumn($sql){
try{
$stmt=$this->pdo->query($sql);
return $stmt->fetchColumn();
} catch (Exception $ex) {
$this->showException($ex, $sql);
exit;
}
}
}
//测试
$param=array(
);
$mypdo= MyPDO::getInstance($param);
//echo $mypdo->exec('delete from news where id=6');
/*
if($mypdo->exec("insert into news values (null,'11','1111',unix_timestamp())"))
echo '自动增长的编号是:'.$mypdo->lastInsertId ();
*/
//$list=$mypdo->fetchAll('select * from news');
//$list=$mypdo->fetchRow('select * from news where id=1');
$list=$mypdo->fetchColumn('select count(*) from news');
echo '<pre>';
var_dump($list);