PHP连接数据库进行增删查改-PDO方法-以MySQL为例
- 更新:2017-05-03 17:51:21
- 首发:2015-11-28 13:50:46
- 源代码
- 11631
由于PHP6中将默认以PDO方法连接数据库,而PDO方法优点很多,因此此文仅介绍PDO方法连接数据库进行操作。需要注意,从 PHP 5.1 开始附带了 PDO,在 PHP 5.0 中是作为一个 PECL 扩展使用,在生产环境中强烈建议升级到PHP5.4+版本。
PDO操作数据库的主要优点
- 支持多种数据库(只要提供正确的数据源,其它的数据库操作是一样的)。
- 开发效率更高,便于移植。
- 对事务处理支持更好,特别是事务回滚。
- 更为安全。
典型连接代码
/**
* 数据库连接文件
*
* PDO连接MySQL数据库
* @author 王轶<a@wyr.me>
* @version 0.4
* @copyright BSD
*/
try {
$db_ip = "localhost"; //数据库IP地址
$db_port = "3306"; //数据库端口号
$db_name = ""; //数据库名称
$db_user = ""; //数据库用户名
$db_pass = ""; //数据库密码
$PDO = new PDO('mysql:host='.$db_ip.';port='.$db_por.';dbname='.$db_name.';charset=utf8', $db_user, $db_pass, array(
PDO::ATTR_PERSISTENT => true , // 设置数据库连接为持久连接
PDO::ATTR_EMULATE_PREPARES => false , // 防止SQL注入
PDO::ATTR_ORACLE_NULLS => true , // 设置当字符串为空转换为 SQL 的 NULL
PDO::ATTR_ERRMODE , // 设置抛出错误
PDO::ERRMODE_EXCEPTION // 设置抛出错误
));//PDO数据库连接代码
} catch (PDOException $e) {
print "Error!: " . $e->;getMessage() . "<br/>";
die();
}
注释已经说明了一切,然而这里还要强调一些东西:
“PDO::ATTR_EMULATE_PREPARES =>; false”,这句代码的含义是:是否在本地进行参数转义。一般来说,由MySQL进行变量处理能够避免SQL注入,但会负面影响——部分汉字或符号无法正常写入数据库。这个问题在PHP5.4+版本中被解决,高版本的MySQL6.5+数据库也处理了一部分这类问题。
需要注意的是,在编写SQL语句时需要符合其变量规则。可用以下函数进行处理:
/**
* 格式化SQL数据类型
*
* @param string $theValue 目标SQL数据类型
* @param mixed $theType 传入需要变更类型的数据
* @return mixed
*/
function GetSQLValueString($theValue, $theType)
{
switch ($theType) {
case "text":
$theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
break;
case "long":
case "int":
$theValue = ($theValue != "") ? intval($theValue) : "NULL";
break;
case "double":
$theValue = ($theValue != "") ? doubleval($theValue) : "NULL";
break;
case "date":
$theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
break;
}
return $theValue;
}
PDO常用函数
- PDO::beginTransaction 用于启动一个事务
- PDO::commit 用于提交一个事务
- PDO::rollBack 用于回滚一个事务
- PDO::query() 用于有记录结果返回的操作,特别是SELECT操作
- PDO::exec() 执行一条 SQL 语句,并返回受影响的行数。用于没有结果集合返回的操作,如INSERT、UPDATE等操作。
- PDO::lastInsertId() 返回上次插入操作中主键列类型是自增的ID
- PDOStatement::fetch()用于获取一条记录
- PDOStatement::fetchAll()用于获取记录集,返回PHP数组
- PDO::setAttribute 用于设置PDO属性
- PDO::getAttribute 用于取回一个数据库连接的属性
- 其它常用函数点击这里进入官方文档
PDO错误与错误处理
这里推荐大家学习一下在构造函数中设置错误模式的方法。以下是官方的例子:
<php
$dsn = 'mysql:dbname=test;host=127.0.0.1';
$user = 'googleguy';
$password = 'googleguy';
/*
使用 try/catch 围绕构造函数仍然有效,即使设置了 ERRMODE 为 WARNING,
因为如果连接失败,PDO::__construct 将总是抛出一个 PDOException 异常。
*/
try {
$dbh = new PDO($dsn, $user, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
exit;
}
// 这里将导致 PDO 抛出一个 E_WARNING 级别的错误,而不是 一个异常 (当数据表不存在时)
$dbh->query("SELECT wrongcolumn FROM wrongtable");
?>
增
//以插入用户名和密码为例:
require_once("connect.php");//加载数据库连接文件,即本文第一个代码框中的代码
$insertSQL = sprintf("INSERT INTO `admin` SET username = %s, password = %s",
GetSQLValueString($username, "text"),
GetSQLValueString($password, "text"));
$Result = $PDO->exec($insertSQL);//执行数据库写入操作
$back_id = $PDO->lastInsertId();//获取写入的数据id
if ($Result == "1") {
//如果成功写入一条数据
} else {
}
$PDO = null;//关闭数据库链接
删
require_once("config.php");//引入数据库连接文件
$Result = $PDO->exec("DELETE FROM 表名称 WHERE 列名称 = 值");
if ($Result != "0") {
//删除成功$Result是受影响的条数
}
查
返回一条数据以json字符串的形式。
require_once('config.php');//引入数据库
$info = $PDO->query("SELECT * FROM `order` WHERE `id` = 1");
$Foundinf = $info->fetch(PDO::FETCH_ASSOC);
$PDO = null;//注销数据库
$json = json_encode($Foundinf);
echo $json;
返回所有数据以json字符串数组的形式。
require_once('config.php');//引入数据库
$info = $PDO->query("SELECT * FROM `order`");
$Foundinf = $info->fetchAll(PDO::FETCH_ASSOC);
$PDO = null;//注销数据库
$json = json_encode($Foundinf);
echo $json;
可以看到,上面两个代码的区别除了SQL语句不同外,只有fetch/fetchAll的区别。其中“PDO::FETCH_ASSOC”的含义是:以字段索引的方式返回数据。如果去除fetch()或fetchAll()中的参数,那么返回结果数字和字段两者同时返回(不太明白的同学请亲自试验一下)。在很多情况下是不必要的。
改
require_once("config.php");//引入数据库连接文件
$Result = $PDO->exec("UPDATE `admin` SET `username`='admin' WHERE id =1");
if ($Result != "0") {
//修改成功$Result是受影响的条数,如果要修改的数据和欲修改数据一样也会返回0
}
最后说一句
本人能力有限,如有错误之处望大家不吝赐教,谢谢!
除特别注明外,本站所有文章均为原创。原创文章均已备案且受著作权保护,未经作者书面授权,请勿转载。
打赏
交流区
暂无内容
老师你好,我希望能用一个openwrt路由器实现IPv4和IPv6的桥接,请问我该如何实现?我尝试了直接新增dhcpv6的接口,但是效果不甚理想(无法成功获取公网的ipv6,但是直连上级路由的其他设备是可以获取公网的ipv6地)
![%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE20241205230845.png](https://cdn.wyr.me/visitor-files/2024-12-05/1733411344287屏幕截图 2024-12-05 230845.png)你好
,为什么我这里是0039 813C 0600 0075 16xx xx xx,只有前6组是相同的,博客中要前8位相同,这个不同能不能照着修改呢?我系统版本是Win1124H2
大神你好,win11专业版24h2最新版26100.2033,文件如何修改?谢谢
win11专业版24h2最新版26100.2033,Windows Feature Experience Pack 1000.26100.23.0。C:\Windows\System32\termsrv.dll系统自带的这个文件,39 81 3C 06 00 00 0F 85 XX XX XX XX 替换为 B8 00 01 00 00 89 81 38 06 00 00 90。仍然无法远程连接。原来是win11 21h2系统,是可以远程链接的。共享1个主机,2个显示器,2套键鼠,各自独立操作 各自不同的账号,不同的桌面环境。
博主,win11专业版24h2最新版,C:\Windows\System32\termsrv.dll系统自带的这个文件,找不到应该修改哪个字段。我的微信:一三五73二五九五00,谢谢