php怎样减少访问数据库 php限制访问间隔( 二 )


异常与 PDO
PDO 可以使用异常处理错误,这意味着你的所有 PDO 操作都应当包装在一个 try/catch 块中 。你可以通过设定错误模式属性强制 PDO 在新建的句柄中使用三种错误模式中的某一个 。下面是语法:
1 $DBH-setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT );
2 $DBH-setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );
3 $DBH-setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
无论你设定哪个错误模式 , 一个错误的连接总会产生一个异常 , 因此创建连接应该总是包装在 try/catch 块中 。
PDO::ERRMODE_SILENT
这是默认的错误模式 。如果你使用这个模式,你将得使用同 mysql 或 mysqli 扩展一样的方法差错 。其它两种模式更适合 DRY 编程 。
PDO::ERRMODE_WARNING
此方法将会发出一个标准PHP警告,并允许程序继续运行 。这对调试很有帮助 。
PDO::ERRMODE_EXCEPTION
这是多数情况下你所希望的方式 。它生成异常,允许你更容易的处理错误,隐藏可能导致它人了解你系统的信息 。下面是一个充分利用异常的示例:
01 # connect to the database
02 try {
03$DBH = newPDO("mysql:host=$host;dbname=$dbname", $user, $pass);
04$DBH-setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
05
06# UH-OH! Typed DELECT instead of SELECT!
07$DBH-prepare('DELECT name FROM people');
08 }
09 catch(PDOException $e) {
10echo"I'm sorry, Dave. I'm afraid I can't do that.";
11file_put_contents('PDOErrors.txt', $e-getMessage(), FILE_APPEND);
12 }
在 select 语句中有一个故意留下的错误;这将导致一个异常 。异常错误细节保存至一个 log 文件,并生成一段友好的(或不怎么友好的)信息於用户 。
插入和更新
插入新数据,更新已存数据是一种非常常见的数据库操作 。使用 PDO,这通常需要两个步骤 。本节中所述的所有内容对更新和插入都有效 。
这里有一个最基本的插入示例:
1 # STH means "Statement Handle"
2 $STH = $DBH-prepare("INSERT INTO folks ( first_name ) values ( 'Cathy' )");
3 $STH-execute();
你也可以使用 exec() 完成相同的操作,这将减少调用 。多数情况下,你会使用调用多的方法 , 以充分利用语句预处理的优势 。即使你只用它一次 , 使用语句预处理,帮助你保护你的 SQL 免于注入攻击 。
预处理语句
使用语句预处理将帮助你免于SQL注入攻击 。
一条预处理语句是一条预编译的 SQL 语句,它可以使用多次,每次只需将数据传至服务器 。其额外优势在于可以对使用占位符的数据进行安全处理,防止SQL注入攻击 。
你通过在 SQL 语句中使用占位符的方法使用预处理语句 。下面是三个例子:一个没有占位符,一个使用无名占位符,一个使用命名占位符 。
1 # no placeholders - ripe for SQL Injection!
2 $STH = $DBH-("INSERT INTO folks (name, addr, city) values ($name, $addr, $city)");
3
4 # unnamed placeholders
5 $STH = $DBH-("INSERT INTO folks (name, addr, city) values (?, ?, ?);
6
7 # named placeholders
8 $STH = $DBH-("INSERT INTO folks (name, addr, city) value (:name, :addr, :city)");
你希望避免第一种方法 。选择命名我无名占位符将会对你对语句中数据的设置产生影响 。
无名占位符
01 # assign variables to each place holder, indexed 1-3
02 $STH-bindParam(1, $name);
03 $STH-bindParam(2, $addr);
04 $STH-bindParam(3, $city);
05
06 # insert one row
07 $name = "Daniel"
08 $addr = "1 Wicked Way";
09 $city = "Arlington Heights";
10 $STH-execute();
11
12 # insert another row with different values

推荐阅读