Php中使用PDO操作MySQL数据库(查询 更新 删除)

 更新时间:2016年11月25日 16:34  点击:1817
PDO是mysql数据库操作的一个公用类了,我们不需要进行自定类就可以直接使用pdo来操作数据库了,但是在php默认配置中pdo是未开启所以我们必须先在php.ini中开启它才可以使用,下文我会讲到。

PDO扩展为PHP访问数据库定义了一个轻量级的、一致性的接口,它提供了一个数据访问抽象层,
这样,无论使用什么数据库,都可以通过一致的函数执行查询和获取数据。

PDO支持的PHP版本为PHP5.1以及更高的版本,而且在PHP5.2下PDO默认为开启状态,
下面是在php.ini中PDO的配置:

extension=php_pdo.dll

为了启用对某个数据库的支持,需要在php配置文件中将相应的扩展打开,例如要支持MySQL,需要开启下面的扩展

extension=php_pdo_mysql.dll

这里是使用PDO对mysql进行基本的增删改查操作

程序代码:

 代码如下 复制代码

header("content-type:text/html;charset=utf-8");

$dsn="mysql:dbname=test;host=localhost";
$db_user='root';
$db_pass='admin';

try{
 $pdo=new PDO($dsn,$db_user,$db_pass);
}catch(PDOException $e){
 echo '数据库连接失败'.$e->getMessage();
}

//新增
$sql="insert into buyer (username,password,email) values ('ff','123456','admin@admin.com')";
$res=$pdo->exec($sql);
echo '影响行数:'.$res;


//修改
$sql="update buyer set username='ff123' where id>3";
$res=$pdo->exec($sql);
echo '影响行数:'.$res;

//查询
$sql="select * from buyer";
$res=$pdo->query($sql);

foreach($res as $row){
 echo $row['username'].'<br/>';
}

//删除
$sql="delete from buyer where id>5";
$res=$pdo->exec($sql);
echo '影响行数:'.$res;

php中mysql与mysqli对于数据库的连接操作是有所区别的,从最基于的区别来看是ysqli 连接是永久连接,而mysql是非永久连接了,下面我们来深入的分析它们两的区别哦。

首先,两个函数都是用来处理数据库操作的。

mysqli 连接是永久连接,而mysql是非永久连接。

mysql连接每当第二次使用时,都会重新打开一个新的进程,而mysqli则只使用同一个进程,可以很大程度的减轻服务器端压力。

其次,mysqli封装了诸如事务等一些高级操作,同时封装了数据库操作过程中的很多可用的方法。

具体查看 http://cn.php.net/mysqli

在实际使用中,较多使用到mysqli的事务。

例子:

 

 代码示例:

$mysqli = new mysqli('localhost','root','','DB_Lib2Test');

$mysqli->autocommit(false);//开始事物

$mysqli->query($sql1);

$mysqli->query($sql2);

if(!$mysqli->errno){

$mysqli->commit();

  echo 'ok';

}else{

echo 'err';

 $mysqli->rollback();

}

第二部分,php中关于mysqli和mysql区别

php-mysql 是 php 操作 mysql 资料库最原始的 extension ,php-mysqli 的 i 代表 improvement ,提更了相对进阶的功能,就 extension 而言,本身也增加了安全性。而 pdo (php data object) 则是提供了一个 abstraction layer 来操作资料库。

例子:

 

 代码示例:

<?php

mysql_connect($db_host, $db_user, $db_password);

mysql_select_db($dn_name);

$result = mysql_query("SELECT `name` FROM `users` WHERE `location` = '$location'");

while ($row = mysql_fetch_array($result, MYSQL_ASSOC))

{

echo $row['name'];

}

mysql_free_result($result);

?>

这种方式不能 Bind Column ,以前例的 SQL 叙述来说,$location 的地方容易被 SQL Injection。后来于是发展出了 mysql_escape_string() (备注:5.3.0之后弃用) 以及 mysql_real_escape_string() 来解决这个问题,不过这麽一搞,整个叙述会变得?杂且丑陋,而且如果栏位多了,可以想见会是怎样的情形…

例子:

 

 代码示例:

<?php

$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",

mysql_real_escape_string($user),

mysql_real_escape_string($password));

mysql_query($query);

?>

在 php-mysqli 中有了不少进步,除了透过 bind column 来解决上述问题,而且也多援 transaction, multi query ,并且同时提供了 object oriented style (下面这段 php-mysqli 范例的写法) 和 procedural style (上面 php-mysql 范例的写法)两种写法…等等。

例子:

 

 代码示例:

<?php

$mysqli = new mysqli($db_host, $db_user, $db_password, $db_name);

$sql = "INSERT INTO `users` (id, name, gender, location) VALUES (?, ?, ?, ?)";

$stmt = $mysqli->prepare($sql);

$stmt->bind_param('dsss', $source_id, $source_name, $source_gender, $source_location);

$stmt->execute();

$stmt->bind_result($id, $name, $gender, $location);

while ($stmt->fetch())

{

echo $id . $name . $gender . $location;

}

$stmt->close();

$mysqli->close();

?>

但看到这边又发现了一些缺点,例如得 bind result,这个就有点多馀,不过这其实无关紧要,因为最大的问题还是在于这不是一个抽象(abstraction)的方法,所以当后端更换资料库的时候,就是痛苦的开始…

于是 pdo 就出现了(备注:目前 ubuntu 和 debian 来说,pdo 并没有直接的套件可以安装,而是必须透过 pecl 安装)。

 

 代码示例:

roga@carlisten-lx:~$ pecl search pdo

=======================================

Package Stable/(Latest) Local

PDO 1.0.3 (stable) PHP Data Objects Interface.

PDO_4D 0.3 (beta) PDO driver for 4D-SQL database

PDO_DBLIB 1.0 (stable) FreeTDS/Sybase/MSSQL driver for PDO

PDO_FIREBIRD 0.2 (beta) Firebird/InterBase 6 driver for PDO

PDO_IBM 1.3.2 (stable) PDO driver for IBM databases

PDO_INFORMIX 1.2.6 (stable) PDO driver for IBM Informix INFORMIX databases

PDO_MYSQL 1.0.2 (stable) MySQL driver for PDO

PDO_OCI 1.0 (stable) Oracle Call Interface driver for PDO

PDO_ODBC 1.0.1 (stable) ODBC v3 Interface driver for PDO

PDO_PGSQL 1.0.2 (stable) PostgreSQL driver for PDO

PDO_SQLITE 1.0.1 (stable) SQLite v3 Interface driver for PDO

pdo_user 0.3.0 (beta) Userspace driver for PDO

当透过 pecl 安装装好后,就可以透过以下方式来操作资料库:

 

 代码示例:

<?php

$dsn = "mysql:host=$db_host;dbname=$db_name";

$dbh = new PDO($dsn, $db_user, $db_password);

$sql = "SELECT `name`, `location` FROM `users` WHERE `location` = ? , `name` = ?";

$sth = $dbh->prepare($sql);

$sth->execute(array($location, $name));

$result = $sth->fetch(PDO::FETCH_OBJ);

echo $result->name . $result->location;

$dbh = NULL;

?>

乍看之下,pdo 的程式码好像也没有比较短,那到底好处是什麽呢?

1. pdo 连接资料库时透过 connection string 来决定连接何种资料库。

2. pdo 可以透过 pdo::setattribute 来决定连线时的设定,像是 persistent connection, 回传错误的方式(exception, e_warning, null)。甚至是回传栏位名称的大小写…等等。

2. pdo 支援 bind column 的功能,除了基本的 prepare, execute 以外,也可以 bind 单一栏位,并且指定栏位型态。

4. pdo 是 abstraction layer 所以就算更换储存媒介,需要花的功夫比起来是最少的。

可惜的是,??管这些东西都已经出现很久了,但还是不够大众化。我想或许是肇因于大家习惯看坊间的书籍学习,但那些书本往往只会介绍最简单最传统的方式。导致很多人还是在用 mysql 这种方直接连资料库。

最喜爱透过 dbi 来连接资料库,像是 activerecord 以及 propel orm(object-relational mapping)。

例如说以 activerecord 为例,如果要实现这样的 sql 叙述…

insert into `users` (id, name, gender, location) values(1, 'roga', 'male', 'tpe')

以 pdo 来写是:

 

 代码示例:

<?php

$sql = "INSERT INTO `users` (id, name, gender, location) VALUES(?, ?, ?, ?)";

$sth = $dbh->prepare($sql);

$sth->execute(array(1, 'roga', 'male', 'tpe'));

?>

但以 ActiveRecord 来说的话,则是:

 

 代码示例:

<?php

$user = new User();

$user->id = 1;

$user->name = 'roga';

$user->gender = 'male';

$user->location = 'tpe';

$user->save();

?>

后者在语法上是不是简洁很多呢,而且也大幅降低对 SQL 语言的依赖性!(不同资料库对 SQL 实作的问题可参考 Comparison of different SQL implementations)

以上是一些简单的介绍,如有疏漏谬误也欢迎大家补充。

mysql是非持继连接函数而mysqli是永远连接函数。也就是说

mysql每次链接都会打开一个连接的进程而mysqli多次运行mysqli将使用同一连接进程,从而减少了服务器的开销

有些朋友在编程的时候,使用new mysqli('localhost', usenamer', 'password', 'databasename');总是报

错,Fatal error: Class 'mysqli' not found in d:...

mysqli类不是php自带的吗?

不是默认开启的,win下要改php.ini,去掉php_mysqli.dll前的;,linux下要把mysqli编译进去。

一:Mysqli.dll是一个允许以对象的方式或者过程操作数据库的,它的使用方式也很容易。这里就几个常见的操作和 mysql.dll做一个对比。

1、mysql.dll(可以理解为函数式的方式):

 

 代码示例:


$conn = mysql_connect('localhost', 'user', 'password'); //连接mysql数据库

mysql_select_db('data_base'); //选择数据库

 

$result = mysql_query('select * from data_base');//这里有第二个可选参数,指定打开的连接

$row = mysql_fetch_row( $result ) ) //为了简单,这里只取一行数据

echo $row[0]; //输出第一个字段的值

mysqli也有过程式的方式,只不过开始贯以mysqli的前缀,其他都差不多。如果mysqli以过程式的方式操作的话, 有些函数必须指定资源,比如说 mysqli_query(资源标识,SQL语句),并且资源标识的参数是放在前面的,而 mysql_query(SQL语句,'可选')的资源标识是放在后面的,并且可以不指定,它默认是上一个打开的连接或资源。

2、mysqli.dll(对象方式):

 

 代码示例:


$conn = new mysqli('localhost', 'user', 'password','data_base');

//这里的连接是new出来的,最后一个参数是直接指定数据库,不用mysql_select_db()了

//也可以构造时候不指定,然后 $conn -> select_db('data_base')

$result = $conn -> query( 'select * from data_base' );

$row = $result -> fetch_row(); //取一行数据

echo row[0]; //输出第一个字段的值

二、mysql_fetch_row(),mysql_fetch_array()

这两个函数,返回的都是一个数组,区别就是第一个函数返回的数组是只包含值,我们只能$row[0],

$row[1],这样以数组下标来读取数据,而mysql_fetch_array()返回的数组既包含第一种,也包含键值

对的形式,可以这样读取数据,(假如数据库的字段是 username,passwd):

 

 代码示例:

$row['username'], $row['passwd']

而且,如果用($row as $kay => $value)来操作的话,还以直接取得数据库的字段名称。

更主要的是mysqli是php5提供的新函数库,(i)表示改进,其执行速度更快。

下面是一个站长写的一个非常简单实用的数据库操作类了,这里面主要功能是数据库连接,查询数据,删除数据,更新数据等等,这个类的特点时不限制mysql而是直接执行由外部给出的sql语句了。

例子

 代码如下 复制代码

<?php
class SqlTool{
private $conn;
private $host=”localhost”;
private $user=”root”;
private $password=”";
private $db=”bbs”;
function sqlTool(){
$this->conn=mysql_connect(“$this->host”,”$this->user”,”$this->password”);
mysql_select_db($this->db,$this->conn);
mysql_query(“set names gbk”);
}
function executedql($sql){
$res=mysql_query($sql);
return $res;
}
function executedml($sql){
$b=mysql_query($sql);
if(!$b){
echo “操作失败”;
}else{
if(mysql_affected_rows($this->conn)>0){
echo “操作成功”;
}else{
echo “没有影响到行数”;
}
}
mysql_close($this->conn);
}
}
?>

利用php提交员工编号给mysql,然后由mysql把数据接受并利用delete进行数据删除操作了,下面我来给大家分享几个例子。

delete 语句的示例:

 代码如下 复制代码

delete from friends where user_name = 'simaopig';

语法结构中,我们就可以看出,和 update 语法一样,我们是可以省略 where 子句的。不过这是一个很危险的行为。因为如果不指定 where 子句,delete 将删除表中所有的记录,而且是立即删除

1.删除指定编号的员工信息

 代码如下 复制代码

<html>
<head>
</head>
<body>
<center>员工信息表</center>
<table border="1" align='center'>
<thead><tr><th>编号</th><th>姓名</th><th>年龄</th></tr></thead>
<tbody>
<?php
header("Content-type:text/html; charset=utf-8");
$_SESSION['arr']=array('1'=>array('name'=>'张三','age'=>18),'2'=>array('name'=>'李四','age'=>19),'3'=>array('name'=>'王五','age'=>20));
if(!empty($_POST['num'])){
unset($_SESSION['arr'][$_POST['num']]); //删除指定id的员工信息
}
if(isset($_SESSION['arr'])){
foreach ($_SESSION['arr'] as $k => $v) {
echo "<tr><td>".($k)."</td><td>".$v['name']."</td><td>".$v['age']."</td></tr>";
}
}
 
?>
</tbody>
</table>
 
<form method='post' action=""><br>
<center>
<b>输入员工编号:</b>
<input type="text" name="num" size='5'><br>
<input type='submit' value='删除' name='sub' class='btn'>
</center>
</form>
</body>
</html>

2.员工信息批量删除例子

关键技术
本实例的关键点是while()循环语句的灵活运用。根据提交的参数值,执行while()循环语句,在循环体重执行删除操作,完成数据的循环删除操作。
设计过程
(1)创建PHP脚本文件。首先,连接MySQL数据库服务器,连接MySQL中名称为db_while的数据库,并设置页面的编码格式。然后,定义循环变量变量$a和$b,将第1层while循环中的循环条件设置为$b<$a,然后,再次利用while语句循环输出数据表中的数据,并执行数据的删除操作,其代码如下:

 代码如下 复制代码

<?php
if($_POST[sub]){ //通过POST方式获取参数
 $conn=mysql_connect("localhost","root","111"); //连接mysql数据库
 mysql_select_db("db_while",$conn); //连接数据库
 mysql_query("SET NAMES GBK");//定义编码格式
 $a=$_POST[te];//接收文本框参数
 $b=0;//定义变量
while($b<$a){//while循环
 $rs=mysql_query("select * from tb_while");//执行查询操作
 while($rst=mysql_fetch_array($rs)){//将查询结果保存在数组中
$sql="delete * from tb_while where id=$b"; //sql语句
mysql_query($sql);//执行删除操作
echo"姓名为".$rst[name]."的员工已被删除<br>";//输出被删除的员工姓名
$b++
 }
 }

}
?>

(2)将该文件存储于MR266文件夹下,命名为index.php。

操作类就是把一些常用的一系列的数据库或相关操作写在一个类中,这样调用时我们只要调用类文件,如果要执行相关操作就直接调用类文件中的方法函数就可以实现了,下面整理了一个Memcache数据缓存操作类库文件,希望对各位会有帮助了。

例子,代码如下

 代码如下 复制代码

class memcachedInit {
private $memcache;

/**
 * Memcache缓存-设置缓存
 * 设置缓存key,value和缓存时间
 * @param  string $key   KEY值
 * @param  string $value 值
 * @param  string $time  缓存时间
 */
public function set_cache($key, $value, $time = 0) {
return $this->memcache->set($key, $value, false, $time);
}

/**
 * Memcache缓存-获取缓存
 * 通过KEY获取缓存数据
 * @param  string $key   KEY值
 */
public function get_cache($key) {
return $this->memcache->get($key);
}

/**
 * Memcache缓存-清除一个缓存
 * 从memcache中删除一条缓存
 * @param  string $key   KEY值
 */
public function clear($key) {
return $this->memcache->delete($key);
}

/**
 * Memcache缓存-清空所有缓存
 * 不建议使用该功能
 * @return
 */
public function clear_all() {
return $this->memcache->flush();
}

/**
 * 字段自增-用于记数
 * @param string $key  KEY值
 * @param int    $step 新增的step值
 */
public function  increment($key, $step = 1) {
return $this->memcache->increment($key, (int) $step);
}

/**
 * 字段自减-用于记数
 * @param string $key  KEY值
 * @param int    $step 新增的step值
 */
public function decrement($key, $step = 1) {
return $this->memcache->decrement($key, (int) $step);
}

/**
 * 关闭Memcache链接
 */
public function close() {
return $this->memcache->close();
}

/**
 * 替换数据
 * @param string $key 期望被替换的数据
 * @param string $value 替换后的值
 * @param int    $time  时间值
 * @param bool   $flag  是否进行压缩
 */
public function replace($key, $value, $time = 0, $flag = false) {
return $this->memcache->replace($key, $value, false, $time);
}

/**
 * 获取Memcache的版本号
 */
public function getVersion() {
return $this->memcache->getVersion();
}

/**
 * 获取Memcache的状态数据
 */
public function getStats() {
return $this->memcache->getStats();
}

/**
 * Memcache缓存-设置链接服务器
 * 支持多MEMCACHE服务器
 * 配置文件中配置Memcache缓存服务器:
 * $InitPHP_conf['memcache'][0]   = array('127.0.0.1', '11211'); 
 * @param  array $servers 服务器数组-array(array('127.0.0.1', '11211'))
 */
public function add_server($servers) {
$this->memcache = new Memcache;
if (!is_array($servers) || empty($servers)) exit('memcache server is null!');
foreach ($servers as $val) {
$this->memcache->addServer($val[0], $val[1]);
}
}
}

使用方法

$newclass = new memcachedInit();
$newclass->getVersion() //获取版本号
$newclass->close() //关闭Memcache链接
$newclass->clear($key) //从memcache中删除一条缓存
$newclass->get_cache($key) //通过KEY获取缓存数据

上面就简单介绍了它的使用方法了,其实还有很多在这里我就不介绍了呀。

总结,这个只是一个最基于的Memcache缓存操作类了,比起像数据库缓存类操作会更好更复杂了哦,希望例子能帮助到各位朋友哦。

[!--infotagslink--]

相关文章

  • php读取zip文件(删除文件,提取文件,增加文件)实例

    下面小编来给大家演示几个php操作zip文件的实例,我们可以读取zip包中指定文件与删除zip包中指定文件,下面来给大这介绍一下。 从zip压缩文件中提取文件 代...2016-11-25
  • PHP 数据库缓存Memcache操作类

    操作类就是把一些常用的一系列的数据库或相关操作写在一个类中,这样调用时我们只要调用类文件,如果要执行相关操作就直接调用类文件中的方法函数就可以实现了,下面整理了...2016-11-25
  • C#连接SQL数据库和查询数据功能的操作技巧

    本文给大家分享C#连接SQL数据库和查询数据功能的操作技巧,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧...2021-05-17
  • C#从数据库读取图片并保存的两种方法

    这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
  • Intellij IDEA连接Navicat数据库的方法

    这篇文章主要介绍了Intellij IDEA连接Navicat数据库的方法,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借价值,需要的朋友可以参考下...2021-03-25
  • 在数据库里将毫秒转换成date格式的方法

    在开发过程中,我们经常会将日期时间的毫秒数存放到数据库,但是它对应的时间看起来就十分不方便,我们可以使用一些函数将毫秒转换成date格式。 一、 在MySQL中,有内置的函数from_unixtime()来做相应的转换,使用如下: 复制...2014-05-31
  • C#操作本地文件及保存文件到数据库的基本方法总结

    C#使用System.IO中的文件操作方法在Windows系统中处理本地文件相当顺手,这里我们还总结了在Oracle中保存文件的方法,嗯,接下来就来看看整理的C#操作本地文件及保存文件到数据库的基本方法总结...2020-06-25
  • 删除条目时弹出的确认对话框

    复制代码 代码如下: <td> <a href="/member/life/edit_ppt/<?php echo $v->id;?>" class="btn">编辑</a> <a href="javascript:;" onclick="if(confirm('您确定删除这条记录?')){location.href='/member/life/d...2014-06-07
  • 如何解决局域网内mysql数据库连接慢

    通过内网连另外一台机器的mysql服务, 确发现速度N慢! 等了大约几十秒才等到提示输入密码。 但是ping mysql所在服务器却很快! 想到很久之前有过类似的经验, telnet等一些服务在连接请求的时候,会做一些反向域名解析(如果...2015-10-21
  • MySQL快速复制数据库数据表的方法

    某些时候,例如为了搭建一个测试环境,或者克隆一个网站,需要复制一个已存在的mysql数据库。使用以下方法,可以非常简单地实现。假设已经存在的数据库名字叫db1,想要复制一份,命名为newdb。步骤如下:1. 首先创建新的数据库newd...2015-10-21
  • mysqldump命令导入导出数据库方法与实例汇总

    mysqldump命令的用法1、导出所有库系统命令行mysqldump -uusername -ppassword --all-databases > all.sql 2、导入所有库mysql命令行mysql>source all.sql; 3、导出某些库系统命令行mysqldump -uusername -ppassword...2015-10-21
  • node.js如何操作MySQL数据库

    这篇文章主要介绍了node.js如何操作MySQL数据库,帮助大家更好的进行web开发,感兴趣的朋友可以了解下...2020-10-29
  • Mysql数据库错误代码中文详细说明

    1005:创建表失败1006:创建数据库失败1007:数据库已存在,创建数据库失败1008:数据库不存在,删除数据库失败1009:不能删除数据库文件导致删除数据库失败1010:不能删除数据目录导致删除数据库失败1011:删除数据库...2013-09-23
  • jQuery动态添加与删除tr行实例代码

    最近由于项目的需要,需要动态的添加和删除table中的tr,感觉用JS可以实现,但是在网上找了一下,单纯的自己写JS,感觉太麻烦,而且也不好维护。于是想到了最近学的jQuery。这篇文章给大家用实例介绍了jQuery动态添加与删除tr行的方法,有需要的朋友们可以参考借鉴。...2016-10-20
  • php跨网站请求伪造与防止伪造方法

    伪造跨站请求介绍伪造跨站请求比较难以防范,而且危害巨大,攻击者可以通过这种方式恶作剧,发spam信息,删除数据等等。...2013-10-01
  • c#异步读取数据库与异步更新ui的代码实现

    这篇文章主要介绍了c#从数据库里取得数据并异步更新ui的方法,大家参考使用吧...2020-06-25
  • Yii2.0高级框架数据库增删改查的一些操作

    yii2.0框架是PHP开发的一个比较高效率的框架,集合了作者的大量心血,下面通过用户为例给大家详解yii2使用中的一些基本的增删改查操作。 User::find()->all(); //返回所有用户数据; User::findOne($id); //返回 主键...2015-11-24
  • Centos中彻底删除Mysql(rpm、yum安装的情况)

    我用的centos6,mysql让我整出了各种问题,我想重装一个全新的mysql,yum remove mysql-server mysql之后再install并不能得到一个干净的mysql,原来的/etc/my.cnf依然没变,datadir里面的数据已没有任何变化,手动删除/etc/my.cn...2015-03-15
  • MYSQL数据库使用UTF-8中文编码乱码的解决办法

    1.用phpmyadmin创建数据库和数据表 创建数据库的时候,请将“整理”设置为:“utf8_general_ci” 或执行语句: 复制代码 代码如下:CREATE DATABASE `dbname` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; 创...2015-10-21
  • MyBatis-Plus的物理删除和逻辑删除(使用场景)

    数据库中的数据删除会分为两种:物理删除 和 逻辑删除,接下来通过本文给大家介绍MyBatis-Plus的物理删除和逻辑删除使用场景分析,感兴趣的朋友一起看看吧...2021-09-25