- 浏览: 1468973 次
- 性别:
- 来自: 郑州
文章分类
最新评论
-
getelephantbyid:
make 无法通过.....
php-5.3,php-5.4的thttpd2.25b补丁,及编译方法 -
getelephantbyid:
patch -p1 ../php-5.4.7_thttpd-2 ...
php-5.3,php-5.4的thttpd2.25b补丁,及编译方法 -
zander:
zander 写道c 语言是静态类型语言还是动态类型语言阅读理 ...
什么是动态语言和静态语言? -
zander:
c 语言是静态类型语言还是动态类型语言
什么是动态语言和静态语言? -
lunajiayou:
很有道理,赞一个
跟着苍蝇会找到厕所,跟着蜜蜂会找到花朵
【任务】将PDO封装成类
new PDO("mysql:host=localhost;dbname=php100","root","pwd" [,driverOptions]);
如果需要长连接,需要长最后一个参数driverOption:persistent:/aj/持续的,不断的
new PDO("连接信息","root","pwd",array(PDO::ATTR_PERSISTENT=>true));
使用array()来传入最后一个参数,是可以带多个选项值,
如:
$pdo = new PDO('mysql:host=localhost;dbname=forum','root','123456',array(PDO::ATTR_PERSISTENT=>TRUE
,PDO::ATTR_CASE=>PDO::CASE_UPPER
,PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION
));
上面分别指定了:长连接开启,强制PDO获取的列字符大写,以及使用PDOException抛出异常。
对于这个属性参数,也可以用setAttribute来更改,如下:
$pdo->setAttribute(PDO::ATTR_CASE,
PDO::CASE_LOWER
);
那么接下去就可以用$row['city']来访问列值,而不必要用$row['CITY']大写方式来访问。
PDO常用方法:
PDO::query()
主要用于有记录结果返回的操作,特别是select操作。
PDO::exec()
主要是针对没有结果集合返回的操作。如insert,update等操作。返回影响行数。
PDO::lastInsertId()
返回上次插入操作最后一条ID,但要注意:如果用insert into tb(col1,col2) values(v1,v2),(v11,v22)..的方式一次插入多
条记录,lastinsertid()返回的只是第一条(v1,v2)插入时的ID,而不是最后一条记录插入的记录ID。
PDOStatement::fetch()
是用来获取一条记录。配合while来遍历。
PDOStatement::fetchAll()
是获取所有记录集到一个中。
PDOStatement::
fetchcolumn([int column_indexnum])
用于直接访问列,参数column_indexnum是该列在行中的从0开始索引值,但是,这个方法一次只能取得同一行的一列,只要执行一次,就跳到下一行。
因此,用于直接访问某一列时较好用,但要遍历多列就用不上。
PDOStatement::rowcount()
适用于当用query("select ...")方法时,获取记录的条数。也可以用于预处理中。$stmt->rowcount();
PDOStatement::columncount()
适用于当用query("select ...")方法时,获取记录的列数。
注解:
1、选fetch还是fetchall?
小记录集时,用fetchall效率高,减少从数据库检索次数,但对于大结果集,用fetchall则给系统带来很大负担。数据库要向WEB前端传输量太大反而效率低。
2、fetch()或fetchall()有几个参数:
mixed pdostatement::fetch([int fetch_style [,int cursor_orientation [,int cursor_offset]]])
array pdostatement::fetchAll(int fetch_style)
fetch_style参数:
■$row=$rs->fetchAll(PDO::FETCH_BOTH
); FETCH_BOTH是默认的,可省,返回关联和索引。
■$row=$rs->fetchAll(PDO::FETCH_ASSOC
); FETCH_ASSOC参数决定返回的只有关联数组。
■$row=$rs->fetchAll(PDO::FETCH_NUM
); 返回索引数组
■$row=$rs->fetchAll(PDO::FETCH_OBJ
); 如果fetch()则返回对象,如果是fetchall(),返回由对象组成的二维数组,如:
Array
(
[0] => stdClass Object
(
[cityid] => 2
[city] => 福州
[countryid] => 1
)
[1] => stdClass Object
(
[cityid] => 3
[city] => 厦门
[countryid] => 1
)
...
);
遍历:
foreach($row as $r)
{
echo "{$r->cityid}:城市 {$r->city}.<br />";
//或echo "{$r[0]}:城市 {$r[1]}.<br />";
}
■$row=$rs->fetch(PDO::FETCH_LAZY
); FETCH_LAZY返回对象:如:
PDORow Object
(
[queryString] => select * from city
[cityid] => 2
[city] => 福州
[countryid] => 1
)
■ $row = $stmt->fetch(PDO::FETCH_BOUND
);用于使fetch返回true,并将获取的列值赋给bindParam()方法中指定的相应变量。参考最后一个示例。----相当于mysqli绑定到结果。
-----------------------------------------------
例:概要
$rs=$db->query("select * from php100");
while($row = $rs->fetch())
{
print_r($row);
}
或不使用while来遍历:
$rs=$db->query("select * from php100");
$row=$rs->fetchall();
print_r($row);
$db->exec('insert into ...');
------------------------------------------------
例:select 遍历记录和取得记录总数
try{
$pdo = new PDO("mysql:host=localhost;dbname=forum","root","123456");
}catch(PDOException $e){
echo '连接错误:'.$e->errorcode();
}
$q="select * from city";
$rs=$pdo->query($q);
$row=$rs->fetchAll();
foreach($row as $r)
{
echo "{$r['cityid']}:城市 {$r['city']}.<br />";
//或echo "{$r[0]}:城市 {$r[1]}.<br />";
}
echo "共有{$rs->rowcount()}条记录" //$rs->rowcount()返回行数。
返回的数组格式:可以看到,每一组都带有关联和索引的两种形式:
Array
(
[0] => Array
(
[cityid] => 2
[0] => 2
[city] => 福州
[1] => 福州
[countryid] => 1
[2] => 1
)
[1] => Array
(
[cityid] => 3
[0] => 3
[city] => 厦门
[1] => 厦门
[countryid] => 1
[2] => 1
)
)
如果用:while($row = $rs->fetch()){ print_r($row);}
while返回的每一个数组格式是:
Array
(
[cityid] => 2
[0] => 2
[city] => 福州
[1] => 福州
[countryid] => 1
[2] => 1
)
可以看到:
$rs->fetch()一次返回一个,
$rs->fetchAll()一次返回所有的记录,
两者相同的是:都可以用索引数组或关联数组来取得最终字段值,
两者不同的是,fetchAll()返回的是二维数组。可以用foreach遍历。
-----------------------------
例:插入记录
$affectedrows = $pdo->exec("insert into city(cityid,city,countryid) values(NULL,'北京',2),(NULL,'南京',2)");
echo '共影响行数:'.$affectedrows.'<br />';
echo '最后插入的记录ID为:'.$pdo->lastinsertid();
这里当用insert into city(cityid,city,countryid)
values(NULL,'北京',2)时,返回的正确的ID值,但按上例的方法插入多条记录,则返回的依旧是北京那一条记录的ID,解决办法是把这个值
lastinsertid()+行数-1。
------------------------------
例:返回exec或query错误
把上例的insert随便改一个,使插入错误,再加上一行:
print_r($pdo->errorinfo()
);
返回:数组0表示存储SQL标准中定义的SQLSTATE码。1表示错误码,0表示错误消息,这里是指city表插入的外键在country表中不存在。
Array
(
[0] => 00000
[1] => 1452
[2] => Cannot add or update a child row: a foreign key
constraint fails (`forum`.`city`, CONSTRAINT `FK_city_country` FOREIGN
KEY (`countryid`) REFERENCES `country` (`country_id`))
)
***************************************************************
PDO的预处理:准备语句
0、连接:$pdo = new PDO(....);
1、准备:查询和mysqli的方式不同,支持两种参数占位方式:问号参数“?”
和命名参数“:字段名”;
命名参数更明确。
$q="insert into city(city,countryid) values(?,?)"; //或$q = "insert into city(city,countryid) values(:city,:countryid)";
$stmt = $pdo->prepare($q);
2、执行execute:$pdo->lastinsertid();
对预处理也是可用的。
有两种方式:注意两种方式用“?”问号参数
绑定时有不同的execute占位引用方式。并且偏移基数不同。
(1)显式地把参数值做为参数传给execute: boolean PDOSTatement::execute([array input_parameters])
命名参数方式:
$q = "insert into city(city,countryid) values(:city,:countryid)";
$stmt = $pdo->prepare($q);
$stmt->execute(array(':city'=>'太原',':countryid'=>'2'));//本条可多次执行。注意,countryid是数值型,但也要用单引号来包住。
问号参数:
$q = "insert into city(city,countryid) values(?,?)";
$stmt = $pdo->prepare($q);
$stmt->execute(array('0'=>'武汉','1'=>'2'));
//注意这里不是用'?'的方式,而是用上面占位符的从0开始
的索引偏移
,
(2)绑定参数。boolean PDOSTatement::bindParam(mixed parameter,mixed &variable [,int datatype [,int length [,mixed driver_option]]])
mixed parameter 是占位符,
当用?问号参数时,parameter是占位符的从1开始
的索引偏移,
而不是‘?’,这和MYSQLI的预处理不相同。
variable是绑定的变量值
datatype有以下几种类型:
PDO_PARAM_BOOL 布尔类型。
PDO_PARAM_input_output 参数传给存储过程时使用此类型,可以在过程执行后修改。
PDO_PARAM_INT 整型。
PDO_PARAM_NULL NULL类型。
PDO_PARAM_LOG 大对象类型。
PDO_PARAM_STMT PDO对象类型,当前不可操作。
PDO_PARAM_STR char,varchar和其它字符串类型。
length指定数据类型长度。
只有当赋为PDO_PARAM_input_output类型时才需要此参数。
driver_option
用来传递任何数据库驱动程序特定的选项。
如:
$q = "insert into city(city,countryid) values(?,?)";
$stmt = $pdo->prepare($q);
$city='大连';
$country=1;
$stmt->bindparam(1,$city); //注意这里parameter不是用“'?'”方式。并且从1开始偏移。
$stmt->bindparam(2,$country);
$stmt->execute();
---------------------
预处理的绑定列:
boolean PDOStatement::bindcolum(mixed column_index,mixed ¶m [,int type [,int maxlen[,mixed driver_options]]]);
参数column_index是要绑定的行中列偏移,从1开始
。当然也可以用列名。
type就用来设置类型限制变量值,如PDO::PARAM_STR是限制文本,具体参bindParam()。通过maxlen限制其长度。
try{
$pdo = new PDO("mysql:host=localhost;dbname=forum","root","123456");
}catch(PDOException $e){
echo '连接错误:'.$e->errorcode();
}
$q="select * from city";
$stmt=$pdo->prepare($q);
$stmt->execute();
$rscount=$stmt->rowcount(); //总记录数
$stmt->bindcolumn(1,$cityid);
$stmt->bindcolumn('city',$city,PDO::PARAM_STR,1);
$stmt->bindcolumn(2,$countryid);
for($i=1;$i<=$rscount;$i++)
{
$row = $stmt->fetch(PDO::FETCH_BOUND);
printf("%s 的ID是: %s ",$city,$cityid);
echo '<hr />';
}
**********************************************************
用PDO处理事务:
PDO->__construct()方法的作用是建立一个PDO链接数据库的实例。
PDO->beginTransaction(),PDO->commit(),PDO->rollBack()这三个方法是在支持回
滚功能时一起使用的。PDO->beginTransaction()方法标明起始点,PDO->commit()方法标明回滚结束点,并执
行SQL,PDO->rollBack()执行回滚。
<?php
try {
$dbh = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$dbh->query('set names utf8;');
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->beginTransaction();
$dbh->exec("INSERT INTO `test`.`table` (`name` ,`age`)VALUES ('mick', 22);");
$dbh->exec("INSERT INTO `test`.`table` (`name` ,`age`)VALUES ('lily', 29);");
$dbh->exec("INSERT INTO `test`.`table` (`name` ,`age`)VALUES ('susan', 21);");
$dbh->commit();
} catch (Exception $e) {
$dbh->rollBack();
echo "Failed: " . $e->getMessage();
}
?>
发表评论
-
google pagespeed禁用改写html文件的cache头
2019-09-04 19:51 538这会禁用html文件的缓存,无法读取last-modifi ... -
macos 安装imagick解决php不能显示验证码的问题
2018-11-04 04:15 1268需要选安装pear,然后用pecl install imagi ... -
解决php中Cannot send session cache limiter 的问题的方法
2018-08-30 10:49 946升级php7.0后出现这个问题 修改php.ini中的s ... -
extjs给组件的对象中的某个属性赋值的方法
2018-03-17 03:37 1631这样是对的form.getViewModel().set( ... -
支付宝手机网页支付配置要点
2018-03-13 22:57 857打开蚂蚁金服开放平台 开发者中心-》网页&移动应 ... -
yii2 rest使用DataFilter查询数据
2018-02-03 01:30 2953配置action /** * ... -
浏览器用户代理分析工具
2018-01-27 16:09 539https://www.browserua.me/ ... -
关于yii2 rest options请求却仍然执行action动作的问题
2018-01-23 22:48 2227这个bug在github中已经修复但还没有在正式版本中发布 ... -
yii2 rest跨域
2018-01-19 22:41 2050<?php /** * Created by P ... -
yii2添加自定义全局函数
2017-12-31 23:19 809composer.json中添加以下代码 ... -
yii2 advanced安装
2017-12-23 01:37 674安装composer https://getcompos ... -
TCP Fast Open说明
2017-06-09 02:34 7081相关介绍 https://lwn.net/Article ... -
Zend Studio 9.0 破解
2011-12-01 17:56 1561转至:http://www.geekso.com/ZendSt ... -
php安装http扩展模块
2011-11-01 10:44 1330yum install php-devel php-pear ... -
javascript版的print_r()
2011-10-29 23:50 1004对调试程序有帮助 http://www.netgrow.co ... -
ThinkPHP集成FIREPHP
2011-10-29 23:48 1307TP的调试真的很傻很难 ... -
通过 PDO 将 PHP 连接到 DB2 和 Cloudscape
2010-11-02 15:52 2257背景 随着拥有更 ... -
PHP PDO 学习笔记
2010-11-02 15:46 1756■PDO为何物? POD(PHP Data Object)扩 ... -
编译最新的PHP模块(Postgresql9.01)
2010-11-02 01:25 1211cd php-5.3.3 cd ext/pgsql /us ... -
php编译安装
2010-11-02 01:17 1799从php.net上面下载源代码 tar -jxf php-5 ...
相关推荐
根据提供的文档内容,我们可以归纳出...以上知识点涵盖了文档中提到的主要内容,包括 SQL 子查询、视图的创建和使用、PDO 连接数据库的基本操作以及 SQL 注入的防范措施等。这些内容对于理解和掌握数据库操作至关重要。
将框架下载到 `/wwwroot/yii` 目录,然后在浏览器中访问 `http://www.example.com/yii/requirements/index.php` 检查环境配置,确保PHP PDO扩展和pdo_sqlite模块已启用。 使用Yiic工具创建应用的基本架构,这将自动...
该软件基于PHP和MySQL开发,使用ZenTaoPHP作为PHP开发框架。 首先,我们需要准备以下软件包: 1. `httpd-2.2.6.tar.gz`:这是Apache HTTP服务器的源码包,用于提供Web服务。 2. `php-5.2.14.tar.gz`:PHP解释器的...
- **使用PDO进行交换**:这部分讲解了如何通过配置PDO来实现节点之间的数据交换。 - **使用SDO进行交换**:这里介绍了如何利用服务数据对象(SDO)进行设备配置和数据交换。 - **通讯功能示例**:提供了具体的编程示例...
例如,`SELECT`语句用于获取数据,可以使用`mysqli_fetch_assoc()`或`PDO::fetch()`获取结果集中的行。 3. **PHP组合查询多条件查询** PHP支持复杂的SQL查询,包括`AND`、`OR`逻辑运算符以及`WHERE`、`GROUP BY`、...
#### 使用PDO扩展 PDO(PHP Data Objects)提供了统一的接口来访问多种类型的数据库。 - **连接数据库**: ```php try { $dbh = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8', 'username', '...
这里使用PDO扩展来实现连接。 ```php $host = 'localhost'; $dbname = 'topup_db'; $username = 'your_username'; $password = 'your_password'; try { $pdo = new PDO("mysql:host=$host;dbname=$dbname", $...
- **PDO(PHP Data Objects)**:介绍如何使用PDO进行数据库连接、查询、插入、更新和删除操作。 - **预处理语句**:学习预处理语句,防止SQL注入攻击。 9. **会话控制** - **session与cookie**:理解session和...
根据提供的文档信息,我们可以归纳出一系列关于 EtherCAT IgH Master 的关键知识点,这些知识点涵盖了 EtherCAT 的架构、应用接口、以太网设备管理、状态机的设计以及用户空间接口等内容。 ### 1. IgH EtherCAT ...
根据提供的文件信息,我们可以归纳出以下相关知识点: ### 一、CANopen协议简介 #### 1.1 CANopen概述 CANopen是一种基于Controller Area Network (CAN) 的高层通信协议和设备层规范,广泛应用于工业自动化领域。它...
- **数据库交互**:使用SQL查询数据库,通过PDO或MySQLi扩展连接数据库。 #### 4. 高级主题 - **会话管理**:实现用户登录和注销功能,使用cookie和session管理会话状态。 - **安全实践**:介绍如何防止SQL注入、...
- 统一使用Adodb或PDO等ORM框架进行数据库操作。 - **开发模式**: - 推荐使用MVC(Model-View-Controller)模式,将业务逻辑、数据模型和用户界面分离,便于管理和扩展。 - **URL重写**: - 使用Apache的mod_...
本资料包“php 手册汇总(zend,thinkphp)”正是为了帮助开发者更好地理解和应用PHP,特别是针对两个知名PHP框架——Zend Framework和ThinkPHP,进行了深度的整理和归纳。 **一、Zend Framework** Zend Framework是...
- **连接数据库**:使用`mysqli_connect`或`PDO`等方式建立连接。 - **执行SQL语句**:通过`query`方法执行SQL命令,并处理返回结果。 - **错误处理**:合理地处理查询失败或其他异常情况,提高程序健壮性。 ### ...
根据给定文件“哈尔滨工程大学818海洋科学导论2020考研专业课初试大纲”,我们可以归纳出以下重要知识点: ### 一、地球系统与海洋科学 1. **海洋科学的地位**:理解海洋科学作为地球系统科学的一个重要组成部分,...