主要内容:
- 认识PDO及config.php文件配置
- 通过sql语句进行基本的操作
- sql语句占位符、PDO prepare、PDO bindParam、bindValue、fetchAll返回值
1. 认识PDO及config.php文件配置、连接数据库
- PHP 数据对象 (PDO) 扩展为PHP访问数据库定义了一个轻量级的一致接口。
- PDO 提供了一个数据访问抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据。
- PDO随PHP5.1发行,在PHP5.0的PECL扩展中也可以使用,无法运行于之前的PHP版本。
- config.php文件配置。配置的目的就是为了后面方便连接。
<?php
define('DB_HOST','localhost');//主机名
define('DB_USER', 'root');//连接数据库的用户名
define('DB_PWD','zhoujielun521');//连接数据库密码
define('DB_NAME', 'apple');//数据库名称
define('DB_PORT', '3306');//数据库端口号
define('DB_TYPE', 'mysql');//数据库的型号
define('DB_CHARSET', 'utf8');//数据库的编码方式
define('DB_DSN', DB_TYPE.":host=".DB_HOST.";dbname=".DB_NAME.";charset=".DB_CHARSET);
//定义PDO的DSN,数据源名,包括主机名,端口号和数据库名称。
$dsn='mysql:host=localhost;dbname=apple';
//PDO驱动程序的名称,后面为一个冒号,再后面是可选的驱动程序连接数据库变量信息,
//如主机名、端口和数据库名。
- 连接数据库。连接前需要先设置好数据库,否则也无法连接。
<?php
//使用PDO进行mysql类型的数据库连接
require "config.php";
try {
////数据库连接,得到一个PDO对象
$pdo = new PDO(DB_DSN,DB_USER,DB_PWD);
// var_dump($pdo);
//捕捉特定于数据库信息的PDOEXCEPTION 异常
} catch(PDOException $e) {
echo $e->getMessage();
//捕捉拥有Throwable接口的错误或者其他异常
} catch (Throwable $e) {
echo $e->getMessage();
}
2. 通过sql语句进行基本的操作
- 查询
$sql="SELECT * FROM `user` WHERE `id`=18";
//query() — 执行 SQL 语句,以 PDOStatement 对象形式返回结果集
$stmt = $pdo->query($sql);
foreach($stmt as $k => $v){
var_dump($v['username']);
}
- 执行update等
//sql语句
$sql = "UPDATE `user` SET `age`= 36 WHERE `id`=1";
//exec()执行一条 UPDATE,DELETE,INSERT SQL 语句,并返回受影响的行数
$res = $pdo->exec($sql);
if ($res == 0) {
//errorCode() — 获取跟数据库句柄上一次操作相关的 SQLSTATE码
var_dump($pdo->errorcode());
echo "<br>";
//获取上一次句柄上一次操作的错误信息数组
var_dump($pdo->errorInfo());
}
3. sql语句占位符、PDO prepare、PDO bindParam、bindValue、fetchAll返回值
- bindParam
//使用问号参数占位符的sql预处理语句
$sql = "SELECT * FROM `user` WHERE `username`=? AND `password`=?";
//prepare() — 准备要执行的语句,并返回PDOStatement语句对象
$stmt = $pdo->prepare($sql);
$username="Chloe1";
$password="Chloe1";
//PDOStatement::bindParam — 绑定一个参数到指定的变量名
$stmt->bindParam(1,$username);
$stmt->bindParam(2,$password);
//也可以用下面这种方式
// $stmt->bindParam(":username",$username);
// $stmt->bindParam(":password",$password);
//执行一条预处理语句
$stmt->execute();
//PDOStatement::rowCount — 返回受上一个 SQL 语句影响的行数
echo $stmt->rowCount();
- bindValue
$sql = "SELECT * FROM `user` WHERE `username`=? AND `password`=?";
//prepare() — 准备要执行的语句,并返回PDOStatement语句对象
$stmt = $pdo->prepare($sql);
$username="Chloe";
$password="Chloe";
//PDOStatement::bindValue — 把一个值绑定到一个参数
$stmt->bindValue(1,$username);
$stmt->bindValue(2,$password);
$stmt->execute();
echo $stmt->rowCount();
- bindValue另外一个示例
$sql = "SELECT * FROM `user` WHERE `id`>?";
$stmt = $pdo->prepare($sql);
//PDOStatement::bindValue — 把一个值绑定到一个参数
$stmt->bindValue(1,4);
$stmt->execute();
//PDOStatement::fetchAll — 返回一个包含结果集中所有行的数组
// $res = $stmt->fetchAll(PDO::FETCH_ASSOC);
// print_r($res);
$res = $stmt->fetch();
print_r($res);
// echo $stmt->rowCount();
$sql = "SELECT * FROM `user` WHERE `age`>?";
$stmt = $pdo->prepare($sql);
$age = 12;
$stmt->bindValue(1,$age);
$age = 18; //后加的应该无效。
$stmt->execute();
//PDOStatement::fetchAll — 返回一个包含结果集中所有行的数组
// $res = $stmt->fetchAll(PDO::FETCH_ASSOC);
// print_r($res);
// $res = $stmt->fetch();
// print_r($res);
echo $stmt->rowCount();
bindParam()与bindValue()的比较;
PDOStatement::bindValue — 把一个值绑定到一个参数,PDOStatement::bindParam — 绑定一个参数到指定的变量名
PDOStatement::bindParam()的第二个参数是按引用传递,所以只能提供变量作为参数,只有PDOStatement::execute()被执行的时候才取其值。
PDOStatement::bindValue()为占位符参数绑定值,只要绑定成功,就不会再变了。
$sql = "SELECT * FROM `user` WHERE `age`>?";
$stmt = $pdo->prepare($sql);
$age = 12;
$age=25;
// 这种情况下面的18重新赋值应该是管用的。但之前的value就是不行的。
$stmt->bindParam(1,$age);
// $stmt->bindParam(2,$password);
$age = 18;
$stmt->execute();
echo $stmt->rowCount();
4. 作业实战
- 使用pdo类的对象去连接数据库,然后使用PDO对象中的prepare()方法获取PDOStatement对象
require "myconfig.php";
try {
$pdo = new PDO(DB_DSN,DB_USER,DB_PWD);
} catch(PDOException $e) {
echo $e->getMessage();
} catch (Throwable $e) {
echo $e->getMessage();
}
$sql = "SELECT * FROM `my_list`";
$stmt = $pdo->query($sql);
//$stmt->execute(); 有了上面的,这个就不用执行了。
$res = $stmt->fetchAll(PDO::FETCH_ASSOC);
//注意这个地方是fetchAll,如果只是fetch的话,就只返回第一行。
- 接着使用PDOStatement对象的成员方法将获得的结果集中的数据(二维数组)遍历出来,
渲染到表格中。
//var_dump,这部分非必要部分
echo '这个是var_dump的结果:<br><br>';
var_dump($res);
echo '<hr><br>';
//table结果
echo '这个是做table的结果:<br><br>';
if (!empty($res)) {
$table =<<<ABC
<table border='1' align = 'left'>
<tr>
<td>id</td>
<td>name</td>
<td>age</td>
<td>phone</td>
</tr>
ABC;
foreach ($res as $k => $v) {
$table .= "<tr>";
$table .= "<td>{$v['id']}</td>";
$table .= "<td>{$v['name']}</td>";
$table .= "<td>{$v['age']}</td>";
$table .= "<td>{$v['phone']}</td>";
$table .= "</tr>";
}
$table .="</table>";
echo $table;
}
结果如图:
" class="reference-link">
5. 数据库中的二维数据遍历方法汇总(foreach)
- 总结了下共三大类,六小类。当然并非所有都是最小单元的遍历。
- 关于读出来的二维数组的结果展示分为三种方式,每一个里面又有一些小分支:
- ① 整体全部打印(array)。
- ② 整体二级打印(array)。
- ③ 分项二级打印(key->value)。
<?php
require "myconfig.php";
try {
$pdo = new PDO(DB_DSN,DB_USER,DB_PWD);
} catch(PDOException $e) {
echo $e->getMessage();
} catch (Throwable $e) {
echo $e->getMessage();
}
$sql = "SELECT * FROM `my_list`";
$stmt = $pdo->query($sql);
$res = $stmt->fetchAll(PDO::FETCH_ASSOC);
/*关于读出来的二维数组的结果展示分为三种方式,每一个里面又有一些小分支:
① 整体全部打印(array)。
② 整体二级打印(array)。
③ 分项二级打印(key->value)。
*/
- ① 整体全部打印(array)。
//var_dump
echo '① 整体全部打印(array)。<br><br>';
echo '这个是var_dump的结果:<br><br>';
var_dump($res);
echo '<hr><br>';
结果如图:
② 整体二级打印(array)。
echo '② 整体二级打印(array)。<br><br>';
echo '     ②-a:这个是foreach1的结果:<br><br>';
foreach ($res as $user) {
print_r($user);
echo '<br>';
}
echo '<hr><br>';
结果如图:
//foreach2:二级内没有展开
echo '     ②-b:这个是foreach2的结果:<br><br>';
foreach ($res as $key => $value) {
printf('<pre>%s</pre>',print_r($value,true));
//notice:print_r中如果写$res,则会显示四遍。
}
echo '<hr><br>';
结果如图:
③ 分项二级打印(key->value)。
echo '③ 分项二级打印(key->value)。<br><br>';
echo '     ③-a:这个是foreach3的结果:<br><br>';
foreach ($res as $user) {
foreach ($user as $key => $value) {
echo "['{$key}'] => $value <br>";
}
echo '<br>';
}
echo '<hr><br>';
结果如图:
echo '     ③-b:这个是foreach4的结果:<br><br>';
foreach ($res as $key => $value) {
foreach ($value as $k => $v) {
printf('<pre>%s</pre>',print_r($v,true));
//从大的res到value,再从value推进到v。当然主要是在value这条线。key这条线上没有对应的值。
}
}
echo '<hr><br>';
结果如图:
echo '     ③-c:这个是foreach5的结果:<br><br>';
foreach ($res as $user) {
printf('%s, %s, %s, %s<br>', $user['id'], $user['name'], $user['age'], $user['phone']);
}
echo '<hr><br>';
结果如图: