2019-02-25
PDO写操作与用户管理一2019年2月25日22点20分
作业要求
- 使用PDO进行数据表的新增,更新与删除操作练习
- 独立完成员工管理系统中的用户更新操作, 体会Ajax在前后端交互的作用
- 查询js手册, 对json数据格式做一个了解
- 对今晚提到的php函数, 查询手册, 了解它的参数,用途
逐一作答
- 1、使用PDO进行数据表的新增,更新与删除操作练习
- 无论新增、更新或者删除,操作数据库的开始步骤都是一样的,即:
1.连接数据库,创建PDO对象
2.准备SQL语句
3.执行SQL
4.处理执行结果
5.关闭数据库连接
新增操作
附一个简化的操作版本
代码
```$xslt
<?php
// 1.连接数据库,创建PDO对象
$pdo = new PDO(‘mysql:host=localhost;dbname=php’,’root’,’root’);
//2.准备SQL语句,创建预处理对象
$sql = ‘INSERT INTO staff
(name
,age
, sex
, position
, mobile
, hiredate
) ‘;
//sql较长的情况下,可以拼接,如下
$sql .= ‘ VALUES (:name, :age, :sex, :position, :mobile, :hiredate)’;
$stmt = $pdo->prepare($sql);
//3. 参数绑定,执行SQL语句
$name = ‘春丽’;
$age = 18;
$sex = 1;
$position = ‘游戏角色’;
$mobile = ‘18987654321’;
$hiredate = time();
//绑定到SQL语句占位符上
$stmt->bindParam(‘name’,$name,PDO::PARAM_STR, 20);
$stmt->bindParam(‘age’, $age, PDO::PARAM_INT);
$stmt->bindParam(‘sex’, $sex, PDO::PARAM_INT);
$stmt->bindParam(‘position’, $position, PDO::PARAM_STR, 20);
$stmt->bindParam(‘mobile’, $mobile, PDO::PARAM_STR, 11);
$stmt->bindParam(‘hiredate’, $hiredate, PDO::PARAM_INT);
//执行sql语句
$stmt->execute();
//简化方法:因为有6个参数,逐一绑定太麻烦,我们通过数组来简单这一操作
// 创建二个数组分别保存参数的键和值
$key = [‘name’, ‘age’, ‘sex’, ‘position’, ‘mobile’, ‘hiredate’];
$value = [‘蓝玉’,45,1,’明朝名将’,’18929999992’,time()];
//// array_combine()将键数组与值数组合并成新数组
$data = array_combine($key,$value);
//执行execute(),参数为数组,默认全部字符类型
$stmt->execute($data);
//4. 对执行结果进行处理,对返回受影响的记录数量进行判定
if($stmt->rowCount()>0){
echo ‘添加了’. $stmt->rowCount() . ‘条记录’;
}
//5. 断开连接
$pdo = null;
### 更新操作
* 无论新增、更新或者删除,操作数据库的开始步骤都是一样的,更新操作无非就是重新编辑了SQL为更新操作
* 附更新操作的简便方法
> 代码
```$xslt
<?php
// 1.连接数据库,创建PDO对象
$pdo = new PDO('mysql:host=localhost;dbname=php','root','root');
//2.准备SQL语句,创建预处理对象
$sql = 'UPDATE `staff` SET `position` = :position WHERE `id` = :id ';
$stmt = $pdo->prepare($sql);
//3. 参数绑定,绑定到SQL语句占位符上,执行SQL语句
$stmt->bindValue('position','天文台', PDO::PARAM_STR);
$stmt->bindValue('id', 7, PDO::PARAM_INT);
//执行sql语句
$stmt->execute();
//简化的操作
$stmt->execute(['position'=>'科学馆', 'id'=>6]);
//4. 对执行结果进行处理,对返回受影响的记录数量进行判定
if($stmt->rowCount()>0){
echo '更新了'. $stmt->rowCount() . '条记录';
}else {
echo '没有更新记录';
}
//5. 断开连接
$pdo = null;
删除操作
- 无论新增、更新或者删除,操作数据库的开始步骤都是一样的,删除操作无非就是重新编辑了SQL为更新操作
代码
```$xslt
<?php
// 1.连接数据库,创建PDO对象
$pdo = new PDO(‘mysql:host=localhost;dbname=php’,’root’,’root’);
//2.准备SQL语句,创建预处理对象
$sql = ‘DELETE FROM staff
WHERE id
= :id ‘;
$stmt = $pdo->prepare($sql);
//3.执行sql语句
// 添加检测机制,让代码更加的健壮
if ($stmt->execute([‘id’=>10])) {
// 4. 处理执行结果
if ($stmt->rowCount() > 0) {
echo ‘成功删除了’ . $stmt->rowCount() . ‘条记录’;
} else {
echo ‘没有记录被删除’;
}
} else {
echo print_r($stmt->errorInfo(),true);
}
// 4. 断开连接
$pdo = null;
* 2、独立完成员工管理系统中的用户更新操作, 体会Ajax在前后端交互的作用
* Ajax 使用异步的方式调用,更加友好的给用户体验
+ Ajax 练习,使用Ajax 完成GET请求、POST请求
+ 1.创建Ajax对象
+ 2.创建请求事件的回调,获取响应数据,执行DOM操作
+ 3.创建URL请求
+ 4.发送URL请求
+get请求的url地址,可以带参数,用&分割,也可以不带参数
> 代码
//user_edit.php代码
<?php
//echo $_GET[‘id’];
$id = intval(trim($_GET[‘id’]));
$pdo = new PDO(‘mysql:dbname=php’, ‘root’, ‘root’);
$stmt = $pdo->prepare(“SELECT * FROM user
WHERE id
={$id}”);
$stmt->execute();
$user = $stmt->fetch(PDO::FETCH_ASSOC);
//print_r($user);
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户编辑</title>
<style>
h3 {
text-align: center;
}
div {
width: 300px;
height: 180px;
/*background-color: lightblue;*/
margin: 0 auto;
text-align: center;
padding: 20px;
border: 1px dashed #888;
border-radius: 5%;
}
div input {
border: none;
border-bottom: 1px solid #333;
}
button:hover {
cursor: pointer;
background-color: lightblue;
}
.success {
color: green;
}
.error {
color: red;
}
</style>
</head>
<body>
<h3>用户编辑</h3>
<div>
<form name="user">
<p>
<label>用户名:
<input type="text" name="name" value="<?=$user['name']?>" disabled>
</label>
</p>
<p>
<label>邮 箱:
<input type="email" id="email" name="email" value="<?=$user['email']?>" autofocus>
</label>
</p>
<p>
<label>密 码:
<input type="password" id="password" name="password" value="<?=$user['password']?>">
</label>
</p>
<!-- 将当前用户的id,做为更新条件,以隐藏域的方式发送到服务器端-->
<input type="hidden" id="id" value="<?=$user['id']?>">
<p>
<button type="button" onclick="save(this.form)">保存</button>
<button type="button" onclick="history.back()">取消</button>
</p>
<!-- 提示信息占位符-->
<p></p>
</form>
</div>
<script>
function save(form) {
// var user = document.getElementsByTagName(‘form’).namedItem(‘user’);
//ajax提交
//console.log(form);
var request = new XMLHttpRequest();
request.onreadystatechange = function () {
console.log(request.responseText);
if (request.readyState === 4 && request.status === 200) {
var data = JSON.parse(request.responseText);
//console.log(data);
// 获取提示信息占位元素
var tips = form.lastElementChild;
//console.log(tips);
tips.innerText = data.message;
// 根据返回的状态,添加适当的class样式
if (data.status === 1) {
tips.classList.add('success');
}
// 没有更新或更新错误采用同一个样式
else {
tips.classList.add('error');
}
// 2秒后跳转到上一个页面,即用户列表页
setTimeout(function (){
history.back();
},2000);
}
};
request.open('POST','user_manage.php?action=save');
request.setRequestHeader('content-type','application/x-www-form-urlencoded');
request.send('email='+form.email.value+'&password='+form.password.value+'&id='+form.id.value);
}
</script>
</body>
</html>
//user_manage.php 代码
<?php
error_reporting(E_ALL ^ E_WARNING);
$pdo = new PDO(‘mysql:dbname=php’, ‘root’, ‘root’);
//print_r($_POST);
$action = $_GET[‘action’];
$action = strtolower(trim($action));
switch ($action) {
case ‘save’ :
$sql = ‘UPDATE user
SET email
=:email, password
=:password WHERE id
=:id’;
$stmt = $pdo->prepare($sql);
$email = strtolower(trim($_POST['email']));
$password = sha1(strtolower(trim($_POST['password'])));
$id = strtolower(trim($_POST['id']));
$stmt->bindParam('email',$email, PDO::PARAM_STR,60);
$stmt->bindParam('password',$password, PDO::PARAM_STR,20);
$stmt->bindParam('id',$id, PDO::PARAM_INT);
if($stmt->execute()) {
if($stmt->rowCount() == 1){
$status = 1;
$message = '更新成功';
} else if ($stmt->rowCount() == 0) {
$status = 0;
$message = '信息没有更新';
}
}else {
$status = -1;
$message = '保存失败,请检查';
}
echo json_encode(['status'=>$status, 'message'=>$message]);
break;
}
* 3、查询js手册, 对json数据格式做一个了解
* JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
+ JSON 函数 函数描述 json_encode 对变量进行 JSON 编码 json_decode对 JSON 格式的字符串进行解码,转换为 PHP 变量 json_last_error 返回最后发生的错误 json_encode PHP json_encod
* 4、对今晚提到的php函数, 查询手册, 了解它的参数,用途
* 本节课程涉及到的主要是数据库操作函数,下面分别对这些函数进行了解
* PDO 函数
* 如果你的项目需要在多种数据库中切换,建议使用 PDO ,这样你只需要修改连接字符串和部门查询语句即可。 使用 MySQLi, 如果不同数据库,你需要重新编写所有代码,包括查询。两者都是面向对象, 但 MySQLi 还提供了 API 接口。
* PHP PDO PHP 数据对象 (PDO) 扩展为PHP访问数据库定义了一个轻量级的一致接口。 PDO 提供了一个数据访问抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据。 PDO随PHP5.1发行,在PHP5.0的PECL扩展中也可以使用,无法运行于之前的PHP版本。 PDO 安装 你可以通过 PHP 的 phpinfo() 函数来查看是否安装了PDO扩展。
```angular2
<?php
$dbms='mysql'; //数据库类型
$host='localhost'; //数据库主机名
$dbName='test'; //使用的数据库
$user='root'; //数据库连接用户名
$pass=''; //对应的密码
$dsn="$dbms:host=$host;dbname=$dbName";
try {
$dbh = new PDO($dsn, $user, $pass); //初始化一个PDO对象
echo "连接成功<br/>";
/*你还可以进行一次搜索操作
foreach ($dbh->query('SELECT * from FOO') as $row) {
print_r($row); //你可以用 echo($GLOBAL); 来看到这些值
}
*/
$dbh = null;
} catch (PDOException $e) {
die ("Error!: " . $e->getMessage() . "<br/>");
}
//默认这个不是长连接,如果需要数据库长连接,需要最后加一个参数:array(PDO::ATTR_PERSISTENT => true) 变成这样:
$db = new PDO($dsn, $user, $pass, array(PDO::ATTR_PERSISTENT => true));
?>
- PDO::prepare — 备要执行的SQL语句并返回一个 PDOStatement 对象
- PDOStatement 类:
- PDOStatement::bindColumn — 绑定一列到一个 PHP 变量
- PDOStatement::bindParam — 绑定一个参数到指定的变量名
- PDOStatement::bindValue — 把一个值绑定到一个参数
- PDOStatement::fetch — 从结果集中获取下一行
- PDOStatement::execute — 执行一条预处理语句