width-pdo-mysql=/usr/local/mysql
后面是mysql的目录。
在 php.ini
中开启:
# PDO驱动程序共享扩展必须有
extension=php_pdo.dll
# MySQL扩展
extension=php_pdo_mysql.dll
# SQL Server扩展
extension=php_pdo_mssql.dll
# Oracle扩展
extension=php_pdo_oci.dll
$pdo = new PDO($dsn[, $user, $password, $driver_options]);
$dsn
:字符串,表示连接参数。$driver_options
:数组,驱动器配置。不过建议通过在后期设置 PDO 属性来设置。$dsn
写法有 3 种写法。
"mysql:host=$server;dbname=$db"
其中 $server
为服务器地址,$db
是数据库名。如:
try {
$pdo = new PDO("mysql:host=localhost;dbname=hyerp", 'root', '');
} catch(PDOException $e) {
die("数据库连接失败" . $e -> getMessage());
}
把 $dsn
的字符串写入一个文件(以下记为 $path
)中,然后在初始化时的 $dsn
位置处填上 "uri:$path"
。如:
# pdo.ini
mysql:host=localhost;dbname=hyerp
try {
$pdo = new PDO("uri:pdo.ini", 'root', '');
} catch(PDOException $e) {
die("数据库连接失败" . $e -> getMessage());
}
php.ini
中在初始化时的 $dsn
位置处填上 "mysqlpdo"
。如:
# php.ini
[PDO]
pdo.dsn.mysqlpdo = "mysql:host=localhost;dbname=hyerp"
完成后需要重启 HTTP 服务器。在 PHP 文件中这样写:
try {
$pdo = new PDO("mysqlpdo", 'root', '');
} catch(PDOException $e) {
die("数据库连接失败" . $e -> getMessage());
}
// 获取 PDO 属性
$pdo -> getAttribute($type)
// 设置 PDO 属性
$pdo -> setAttribute($type, $val)
其中 $type
为整数。PDO有以下常量供使用:
PDO::ATTR_AUTOCOMMIT
:是否开启了自动提交PDO::ATTR_CASE
:是否是大写PDO::ATTR_CLIENT_VERSION
:客户端版本PDO::ATTR_DRIVER_NAME
:驱动器名称PDO::ATTR_SERVER_INFO
:服务器信息PDO::ATTR_SERVER_VERSION
:服务器版本PDO::ATTR_ERRMODE
:异常处理方式,为整数$pdo -> query($sql)
返回 PDOStatement(预处理)对象(下文为 $stmt
)。
$pdo -> exec($sql)
返回影响行数。
$stmt -> fetchAll([$opt])
返回数组。
如果不设置 $opt
,返回的数组包括数字的索引和键值对的部分:
Array
(
[0] => Array
(
[name] => 'haha'
[0] => 'haha'
[desp] => 'gege'
[1] => 'gege'
)
[1] => Array
(
[name] => 'papa'
[0] => 'papa'
[desp] => 'tete'
[1] => 'tete'
)
)
如果只想返回键值对的结果,设置 $opt
为 PDO::FETCH_ASSOC
。
$stmt = null;
$pdo = null;
需要将预处理对象和PDO对象设为 null
。
try {
$pdo = new PDO("mysql:host=localhost;dbname=hyerp", 'root', '');
} catch(PDOException $e) {
die("数据库连接失败" . $e -> getMessage());
}
$sql = "select * from stu";
$stmt = $pdo -> query($sql);
$list = $stmt -> fetchAll(PDO::FETCH_ASSOC);
foreach($list as $val) {
echo $val['id'] . "-----" . $val['name'] . "<br>";
}
$stmt = null;
$pdo = null;
$sql = "select * from stu";
foreach($pdo -> query($sql) as $val) {
echo $val['id'] . "-----" . $val['name'] . "<br>";
}
但是不代表 $stmt = $pdo -> query($sql);
之后,$stmt
可迭代。
PDO 默认不提示错误信息,需要用下面的命令得到:
$pdo -> errorCode()
得到的值为 SQLSTATE 错误代码,为字符串。当大于 0
时,表示出错。
若执行:
$pdo -> errorInfo()
返回错误信息,为数组:
Array (
[0] => SQLSTATE 错误代码
[1] => 驱动错误码
[2] => 驱动错误信息
)
下面每一组的上下两行代码功能相同,只需要写一个即可。
// 默认:不提示
$pdo -> setAttrbute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
$pdo -> setAttrbute(PDO::ATTR_ERRMODE, 0);
// 警告模式
$pdo -> setAttrbute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
$pdo -> setAttrbute(PDO::ATTR_ERRMODE, 1);
// 异常模式
$pdo -> setAttrbute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo -> setAttrbute(PDO::ATTR_ERRMODE, 2);
$pdo -> prepare($sql)
返回 PDOStatement 对象。$sql
中的未确定量用 ?
或 :var
代替。
$stmt -> bindValue($index, $val)
$index
从 1
开始,或为对应的 "var"
。
$stmt -> bindParam($index, $var)
为上面的预处理对象绑定一个变量 $var
。$index
从 1
开始,或为对应的 "var"
。在此之后或之前对 $var
赋值。
$stmt -> execute()
执行上面的预处理对象。
$stmt -> rowCount()
整数。
$stmt -> bindColumn($index, $var)
为预处理对象返回的查询结果的指定列绑定一个变量 $var
。$index
从 1
开始,或为对应的 "var"
。在此之后或之前对 $var
赋值。
将SQL语句中未定义项以问号代替,再在后面绑定参数。参数绑定方式有三种:
//预处理SQL语句
$sql = "insert into stu(id, name, sex, age) values (?, ?, ?, ?)";
$stmt = $pdo -> prepare($sql);
//对问号处参数绑定
$stmt -> bindValue(1, null);
$stmt -> bindValue(2, 'test');
$stmt -> bindValue(3, 'w');
$stmt -> bindValue(4, 22);
//执行
$stmt -> execute();
echo $stmt -> rowCount();
//预处理SQL语句
$sql = "insert into stu(id, name, sex, age) values (?, ?, ?, ?)";
$stmt = $pdo -> prepare($sql);
//对问号处参数绑定
$stmt -> bindParam(1, $id);
$stmt -> bindParam(2, $name);
$stmt -> bindParam(3, $sex);
$stmt -> bindParam(4, $age);
$id = null;
$name = 'test';
$sex = 'w';
$age = 22;
//执行
$stmt -> execute();
echo $stmt -> rowCount();
//预处理SQL语句
$sql = "insert into stu(id, name, sex, age) values (?, ?, ?, ?)";
$stmt = $pdo -> prepare($sql);
//执行
$stmt -> execute(array(null, 'test', 'w', 22));
echo $stmt -> rowCount();
将问号以 :var
形式的别名(和列名无关)代替。
参数绑定时,$index
为对应的 "var"
。
上面的三种绑定方式同样适用于此(以直接绑定值为例):
//预处理SQL语句
$sql = "insert into stu(id, name, sex, age) values (:id, :nm, :sex, :age)";
$stmt = $pdo -> prepare($sql);
//对问号处参数绑定
$stmt -> bindValue("id", null);
$stmt -> bindValue("nm", 'test');
$stmt -> bindValue("sex", 'w');
$stmt -> bindValue("age", 22);
//执行
$stmt -> execute();
echo $stmt -> rowCount();
在执行时通过数组赋值时,要写上下标:
$stmt -> execute(array("id" => null, "nm" => 'test', "sex" => 'w', "age" => 22));
在 $stmt -> execute();
后,使用 $stmt -> bindColumn($index, $var)
对列进行绑定:
$stmt -> execute();
$stmt -> bindColumn(1, $id);
$stmt -> bindColumn(2, $name);
$stmt -> bindColumn("sex", $sex);
$stmt -> bindColumn("age", $age);
while($row = $stmt -> fetch(PDO::FETCH_COLUMN)) {
echo "{$id}:{$name}:{$sex}:{$age}<br>";
}
数据表要用 InnoDB 类型。
(做一个回滚点)
$pdo -> beginTransaction()
$pdo -> commit()
$pdo -> rollBack()