为什么php的php和mysql的关系

class mysql {
private $db_ //数据库主机
private $db_ //数据库用户名
private $db_ //数据库用户名密码
private $db_ //数据库名
private $ //数据库连接标识;
private $ //执行query命令的结果资源标识
private $ //sql执行语句
private $ //返回的条目数
private $ //数据库编码,GBK,UTF8,gb2312
private $bulletin = //是否开启错误记录
private $show_error = //测试阶段,显示所有错误,具有安全隐患,默认关闭
private $is_error = //发现错误是否立即终止,默认true,建议不启用,因为当有问题时用户什么也看不到是很苦恼的
/*构造函数*/
public function __construct($db_host, $db_user, $db_pwd, $db_database, $conn, $coding) {
$this-&db_host = $db_
$this-&db_user = $db_
$this-&db_pwd = $db_
$this-&db_database = $db_
$this-&conn = $
$this-&coding = $
$this-&connect();
/*数据库连接*/
public function connect() {
if ($this-&conn == "pconn") {
//永久链接
$this-&conn = mysql_pconnect($this-&db_host, $this-&db_user, $this-&db_pwd);
//即使链接
$this-&conn = mysql_connect($this-&db_host, $this-&db_user, $this-&db_pwd);
if (!mysql_select_db($this-&db_database, $this-&conn)) {
if ($this-&show_error) {
$this-&show_error("数据库不可用:", $this-&db_database);
mysql_query("SET NAMES $this-&coding");
/*数据库执行语句,可执行查询添加修改删除等任何sql语句*/
public function query($sql) {
if ($sql == "") {
$this-&show_error("SQL语句错误:", "SQL查询语句为空");
$this-&sql = $
$result = mysql_query($this-&sql, $this-&conn);
if (!$result) {
//调试中使用,sql语句出错时会自动打印出来
if ($this-&show_error) {
$this-&show_error("错误SQL语句:", $this-&sql);
$this-&result = $
return $this-&
/*创建添加新的数据库*/
public function create_database($database_name) {
$database = $database_
$sqlDatabase = 'create database ' . $
$this-&query($sqlDatabase);
/*查询服务器所有数据库*/
//将系统数据库与用户数据库分开,更直观的显示?
public function show_databases() {
$this-&query("show databases");
echo "现有数据库:" . $amount = $this-&db_num_rows($rs);
echo "&br /&";
while ($row = $this-&fetch_array($rs)) {
echo "$i $row[Database]";
echo "&br /&";
//以数组形式返回主机中所有数据库名
public function databases() {
$rsPtr = mysql_list_dbs($this-&conn);
$cnt = mysql_num_rows($rsPtr);
while ($i & $cnt) {
$rs[] = mysql_db_name($rsPtr, $i);
/*查询数据库下所有的表*/
public function show_tables($database_name) {
$this-&query("show tables");
echo "现有数据库:" . $amount = $this-&db_num_rows($rs);
echo "&br /&";
while ($row = $this-&fetch_array($rs)) {
$columnName = "Tables_in_" . $database_
echo "$i $row[$columnName]";
echo "&br /&";
mysql_fetch_row()
$row[0],$row[1],$row[2]
mysql_fetch_array()
$row[0] 或 $row[id]
mysql_fetch_assoc()
用$row-&content 字段大小写敏感
mysql_fetch_object() object 用$row[id],$row[content] 字段大小写敏感
/*取得结果数据*/
public function mysql_result_li() {
return mysql_result($str);
/*取得记录集,获取数组-索引和关联,使用$row['content'] */
public function fetch_array($resultt="") {
if($resultt&&""){
return mysql_fetch_array($resultt);
return mysql_fetch_array($this-&result);
//获取关联数组,使用$row['字段名']
public function fetch_assoc() {
return mysql_fetch_assoc($this-&result);
//获取数字索引数组,使用$row[0],$row[1],$row[2]
public function fetch_row() {
return mysql_fetch_row($this-&result);
//获取对象数组,使用$row-&content
public function fetch_Object() {
return mysql_fetch_object($this-&result);
//简化查询select
public function findall($table) {
$this-&query("SELECT * FROM $table");
//简化查询select
public function select($table, $columnName = "*", $condition = '', $debug = '') {
$condition = $condition ? ' Where ' . $condition : NULL;
if ($debug) {
echo "SELECT $columnName FROM $table $condition";
$this-&query("SELECT $columnName FROM $table $condition");
//简化删除del
public function delete($table, $condition, $url = '') {
if ($this-&query("DELETE FROM $table WHERE $condition")) {
if (!empty ($url))
$this-&Get_admin_msg($url, '删除成功!');
//简化插入insert
public function insert($table, $columnName, $value, $url = '') {
if ($this-&query("INSERT INTO $table ($columnName) VALUES ($value)")) {
if (!empty ($url))
$this-&Get_admin_msg($url, '添加成功!');
//简化修改update
public function update($table, $mod_content, $condition, $url = '') {
//echo "UPDATE $table SET $mod_content WHERE $condition"; exit();
if ($this-&query("UPDATE $table SET $mod_content WHERE $condition")) {
if (!empty ($url))
$this-&Get_admin_msg($url);
/*取得上一步 INSERT 操作产生的 ID*/
public function insert_id() {
return mysql_insert_id();
//指向确定的一条数据记录
public function db_data_seek($id) {
if ($id & 0) {
$id = $id -1;
if (!@ mysql_data_seek($this-&result, $id)) {
$this-&show_error("SQL语句有误:", "指定的数据为空");
return $this-&
// 根据select查询结果计算结果集条数
public function db_num_rows() {
if ($this-&result == null) {
if ($this-&show_error) {
$this-&show_error("SQL语句错误", "暂时为空,没有任何内容!");
return mysql_num_rows($this-&result);
// 根据insert,update,delete执行结果取得影响行数
public function db_affected_rows() {
return mysql_affected_rows();
//输出显示sql语句
public function show_error($message = "", $sql = "") {
if (!$sql) {
echo "&font color='red'&" . $message . "&/font&";
echo "&br /&";
echo "&fieldset&";
echo "&legend&错误信息提示:&/legend&&br /&";
echo "&div style='font-size:14 clear: font-family:Verdana, Arial, Helvetica, sans-'&";
echo "&div style='height:20 background:#000000; border:1px #000000 solid'&";
echo "&font color='white'&错误号:12142&/font&";
echo "&/div&&br /&";
echo "错误原因:" . mysql_error() . "&br /&&br /&";
echo "&div style='height:20 background:#FF0000; border:1px #FF0000 solid'&";
echo "&font color='white'&" . $message . "&/font&";
echo "&/div&";
echo "&font color='red'&&pre&" . $sql . "&/pre&&/font&";
$ip = $this-&getip();
if ($this-&bulletin) {
$time = date("Y-m-d H:i:s");
$message = $message . "\r\n$this-&sql" . "\r\n客户IP:$ip" . "\r\n时间 :$time" . "\r\n\r\n";
$server_date = date("Y-m-d");
$filename = $server_date . ".txt";
$file_path = "error/" . $
$error_content = $
//$error_content="错误的数据库,不可以链接";
$file = "error"; //设置文件保存目录
//建立文件夹
if (!file_exists($file)) {
if (!mkdir($file, 0777)) {
//默认的 mode 是 0777,意味着最大可能的访问权
die("upload files directory does not exist and creation failed");
//建立txt日期文件
if (!file_exists($file_path)) {
//echo "建立日期文件";
fopen($file_path, "w+");
//首先要确定文件存在并且可写
if (is_writable($file_path)) {
//使用添加模式打开$filename,文件指针将会在文件的开头
if (!$handle = fopen($file_path, 'a')) {
echo "不能打开文件 $filename";
//将$somecontent写入到我们打开的文件中。
if (!fwrite($handle, $error_content)) {
echo "不能写入到文件 $filename";
//echo "文件 $filename 写入成功";
echo "&&错误记录被保存!";
//关闭文件
fclose($handle);
echo "文件 $filename 不可写";
//首先要确定文件存在并且可写
if (is_writable($file_path)) {
//使用添加模式打开$filename,文件指针将会在文件的开头
if (!$handle = fopen($file_path, 'a')) {
echo "不能打开文件 $filename";
//将$somecontent写入到我们打开的文件中。
if (!fwrite($handle, $error_content)) {
echo "不能写入到文件 $filename";
//echo "文件 $filename 写入成功";
echo "&&错误记录被保存!";
//关闭文件
fclose($handle);
echo "文件 $filename 不可写";
echo "&br /&";
if ($this-&is_error) {
echo "&/div&";
echo "&/fieldset&";
echo "&br /&";
//释放结果集
public function free() {
@ mysql_free_result($this-&result);
//数据库选择
public function select_db($db_database) {
return mysql_select_db($db_database);
//查询字段数量
public function num_fields($table_name) {
//return mysql_num_fields($this-&result);
$this-&query("select * from $table_name");
echo "&br /&";
echo "字段数:" . $total = mysql_num_fields($this-&result);
echo "&pre&";
for ($i = 0; $i & $ $i++) {
print_r(mysql_fetch_field($this-&result, $i));
echo "&/pre&";
echo "&br /&";
//取得 MySQL 服务器信息
public function mysql_server($num = '') {
switch ($num) {
return mysql_get_server_info(); //MySQL 服务器信息
return mysql_get_host_info(); //取得 MySQL 主机信息
return mysql_get_client_info(); //取得 MySQL 客户端信息
return mysql_get_proto_info(); //取得 MySQL 协议信息
return mysql_get_client_info(); //默认取得mysql版本信息
//析构函数,自动关闭数据库,垃圾回收机制
public function __destruct() {
if (!empty ($this-&result)) {
$this-&free();
mysql_close($this-&conn);
} //function __destruct();
/*获得客户端真实的IP地址*/
function getip() {
if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown")) {
$ip = getenv("HTTP_CLIENT_IP");
if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown")) {
$ip = getenv("HTTP_X_FORWARDED_FOR");
if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown")) {
$ip = getenv("REMOTE_ADDR");
if (isset ($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown")) {
$ip = $_SERVER['REMOTE_ADDR'];
$ip = "unknown";
return ($ip);
function inject_check($sql_str) { //防止注入
$check = eregi('select|insert|update|delete|\'|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile', $sql_str);
if ($check) {
echo "输入非法注入内容!";
return $sql_
function checkurl() { //检查来路
if (preg_replace("/https?:\/\/([^\:\/]+).*/i", "\\1", $_SERVER['HTTP_REFERER']) !== preg_replace("/([^\:]+).*/", "\\1", $_SERVER['HTTP_HOST'])) {
header("Location: ");
阅读(...) 评论()当前访客身份:游客 [
当前位置:
SELECT * FROM warehouse_rulelaw_merge
用PHP执行上面的语句,只读取了30几万就挂掉了,内存分配了512M,整个表的数据有60W。
---------------问题补充---------------
:已经解决问题了,就想知道原因,
解决问题的方法是不全部字段读取出来,先把ID读取出来,然后在循环里面在次查询数据就OK了。
共有21个答案
<span class="a_vote_num" id="a_vote_num_
请查看php.ini
<span class="a_vote_num" id="a_vote_num_
楼主既然解决了,为何不公布下解决的方法呢!
--- 共有 1 条评论 ---
我已经设置了最佳答案了。
(2年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
傻瓜,这就是内存溢出了,明白么?
--- 共有 1 条评论 ---
没看到报错,所以不了解。
(2年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
回复 @__然__(我只想用CLI把那60W数据过滤一下,何必乱猜测呢,为什么不来问问我呢) : 同样是分页啊.分页的思想不只是page,分成两条SQL、3条SQL同样是分页。limit 0,1000;limit ;limit ;至于PHP为什么不能读取这么多数据,很简单啊,PHP有PHP的执行时间,MySQL也有执行时间。以及PHP执行的内存限制(memory_limit),MySQL同样有内存限制(tmp_table_size,key_buffer_size等等一系列参数会影响MySQL执行速度,就达到了执行时间),Nginx也有执行时间限制。正确的方法不是设置参数延长执行时间,而是分页,或者说,分步执行。如果要把查询结果拿来用,比如查出10条经常访问,那么就得把这个结果放到另一表中,或者缓存,而不是每次都去查询。
如果你不觉得60W数据多,所以去设置参数来解决你的问题,那么假如是600W、6000W、600000W呢?任何语言,asp\jsp\c++\java什么的,或许能轻松搞定60W,但600000W甚至更多,就遇到同样的问题了。
--- 共有 2 条评论 ---
: 复制粘贴SQL还复杂?不与嘴硬的人讨论问题了。我闪。
(2年前)&nbsp&
只是临时解决下数据而已,何必搞的那么复杂。
(2年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
这是电脑配置不行
演示给非技术领导看然后要求配更好的电脑
<span class="a_vote_num" id="a_vote_num_
最大可能性是,一次性查出来的数据太多,超过了PHP的可用内存范围
<span class="a_vote_num" id="a_vote_num_
我记得mysql取结果集的时候有2种方式,一个是直接把所有记录都读取出来,一个是对查询结果一条条的读取。
不知道你用的是不是mysql_系列函数,如果是的话,可以试试用mysql_unbuffered_query代替mysql_query,其它的api也有类似机制。
--- 共有 2 条评论 ---
好吧 解决问题就行 开始思路没对 别喷我
(2年前)&nbsp&
我知道为什么PHP不能处理这么大的数据,但是我没有一个好的办法来解决,谢谢你提供的API,经过这次教训之后,就不会在犯这个错误了。
(2年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
强人所难,楼主掐着羊的咪咪挤牛奶
<span class="a_vote_num" id="a_vote_num_
迭代器也可以
<span class="a_vote_num" id="a_vote_num_
应该是想用PHP做MYSQL的备份...
但素,备份程序不是你这样搞的,请去参考DEDECMS的备份程序.....
--- 共有 2 条评论 ---
这种大数据不适合PHP,完毕!~ 请使用其他语言!~
(2年前)&nbsp&
我只想用CLI把那60W数据过滤一下,何必乱猜测呢,为什么不来问问我呢?
(2年前)&nbsp&
更多开发者职位上
有什么技术问题吗?
Choate...的其它问题
类似的话题访问: 107300 次
积分: 68587 分
排名: 326 名
转载: 68587 篇
资源: 326 个
文章搜索文章分类很多网站首页都有一片文章的一小部分.在这里就要使用strip_tags()把html标签去除掉.但但是汉字的话我们还要考虑是什么编码,因为正常切割字段串很容易把最后一个汉字切成一半php5.3新特性 之 mysql native driver(mysqlnd)概述
本文主要写给sa看的。码农就不用看了。
mysql native driver(mysqlnd) 自从php5.3.0开始成为官方源代码的一部分,
用来取代传统的mysql client library(libmysql)。
mysqlnd是C语言写成的PHP扩展(PHP extension)。
php5.3.0之前,码农们操作数据库使用的mysql扩展函数(mysql_connect,mysql_query等函数), mysqli系列函数, PDO MYSQL函数,都是通过libmysql来与mysql数据库进行通信的。
mysqlnd出现之后,SA们就多了一个选择: 可以通过mysqlnd来与mysql数据库进行通信。
mysqlnd不能做什么
虽然mysqlnd是一个PHP扩展,但它却没有提供任何的php函数(或者说是API)给码农们使用。
码农们仍然使用mysql 扩展函数(mysql_connect, mysql_query…),或者mysqli,或者PDO MYSQL来操作数据库。 这些函数都可以通过mysqlnd来与mysql数据库通信。
它是数据库与php函数的中间层。
为什么要使用mysqlnd
原来的libmysql用的好好的,为什么还要搞一个mysqlnd出来呢?
原因一: license问题
libmysql是MYSQL AB公司开发的,现在已经是Oracle集团所属的了,它使用MYSQL license发布。
This ultimately led to MySQL support being disabled by default in PHP
mysqlnd 是php的一部分,使用PHP license发布。
从此 licensing 的问题就算是解决了。
原因二:编译问题
使用libmysql的时候,如果要正常编译php,必须首先安装好mysql。
如果是单纯的一台WEB服务器,装个mysql&#20284;乎有点浪费了。
mysqlnd的话,就不必安装mysql,直接可用。
原因三:性能问题
由于mysqlnd是一个php扩展,使用了php memory management system,在内存使用方面效率相当高。
举个例子:
使用libmysql的时候,mysql结果集中的每一行都在内存中储存了二次!
使用mysqlnd,结果集只会储存一次。
而且它还服从于php.ini中memory_limit的设置。
Using MySQL Native Driver leads to comparable or better performance than using MySQL Client Library。
mysqlnd的新特性
1 改进的persistent connection。
2 特殊函数 mysqli_fetch_all()
http://cn2.php.net/manual/en/mysqli-result.fetch-all.php
只有安装了mysqlnd, mysqli中的这个函数才可用。
3 Performance statistics calls: mysqli_get_cache_stats(), mysqli_get_client_stats(), mysqli_get_connection_stats()
在分析性能瓶颈的时候,这些函数还是蛮好用的。
详细文档可以看这里: http://cn2.php.net/manual/en/mysqlnd.stats.php
4 使用mysqlnd之后,mysqli也支持persistent connection了。
这样看起来,mysqli受益最多。
5 PHP 5.3.3 之后,mysqlnd支持SSL。
6 PHP 5.3.2 之后,mysqlnd支持Compressed Protocol
7 PHP 5.3.4 之后,windows系统中的mysqlnd支持Named Pipes。
如何安装mysqlnd
LINUX环境中,默认情况下,php中的mysql扩展还是会使用libmysql的。
如果要使用mysqlnd,就要加一个configure的参数:
./configure --with-mysql=mysqlnd /
--with-mysqli=mysqlnd /
--with-pdo-mysql=mysqlnd /
[other options]
这样mysql, mysqli, pdo mysql都会使用mysqlnd。
WINDOWS中,mysqlnd默认启用,并且mysql, mysqli, pdo 默认都会使用mysqlnd。
什么都不用做。
分享到:上一篇:学lua的动机只是因为一句话——合程序应该..下一篇:NEAR是日本漫画《死亡笔记》以及同动画..已有 0 条评论,共 0 人参与注:与内容无关的评论将被删除,严重者禁用帐号!
&|&&评论列表
| 中国最专业的PHP中文社区 |
Copyright (C) 1998 - . All Rights Reserved
第一PHP社区
版权所有 七牛云存储为本站提供加速支持 &&&&&您现在的位置:>>
>>正文内容
关于PHP5.5开始废弃MySQL扩展的原因
大多和我一样在PHP4.3-5.0接触的人都深深的记忆着mysql的几个基础的操作方法,mysql_connect,mysql_select_db,mysql_query...等等。但是当你遇到一个新一点的环境,或者客户提供给你的装有php5.5的环境,你会发现有提示说mysql的扩展即将过期的。也是这个原因,目前做的项目给到客户都只能说PHP5.2-5.4不敢说5.5以上的版本。&
对于废除这个老伙伴扩展,还是非常头疼的。虽然官方推荐PDO或者MySQLi但是毕竟是另外的扩展,不能保证所有服务器都开启而对于做产品的比如DZ,EC,DEDE等就会遇到这个版本的报错,很是头疼。而官方废除的主要原因只有一个,MySQL的扩展太老了。这个扩展开发时候MySQL只有3.23版。所以这个上面无法运行事务等。而后来出来的MySQLi则可以。&
不得不说,当年MySQLi的诞生也是沸沸扬扬,因为号称快300倍,又支持多语句,也支持事务。相当好,但无奈与主机市场一般不打开扩展的情况只能看不能用。而如今大多都是VPS主机了,也就没这个问题了。OK,那么我么来看看是不是需要丢掉这个老的MySQL扩展吧,一起来看看,它丢失的功能。
1、预处理语句(Prepared statements)
许多成熟的数据库都支持预处理语句(Prepared Statements)的概念。你可以把它们想成是一种编译过的要执行的SQL语句模板,可以使用不同的变量参数定制它。预处理语句具有两个主要的优点:
查询只需要被解析(或准备)一次,但可以使用相同或不同的参数执行多次。当查询准备好(Prepared)之后,数据库就会分析,编译并优化它要执行查询的计划。对于复杂查询来说,如果你要重复执行许多次有不同参数的但结构相同的查询,这个过程会占用大量的时间,使得你的应用变慢。通过使用一个预处理语句你就可以避免重复分析、编译、优化的环节。简单来说,预处理语句使用更少的资源,执行速度也就更快。
Prepared Statements通过sql逻辑与数据的分离来增加安全,sql逻辑与数据的分离能防止普通类型的sql注入攻击。传给预处理语句的参数不需要使用引号,底层驱动会为你处理这个。如果你的应用独占地使用预处理语句,你就可以确信没有SQL注入会发生。(如果你仍然在用基于不受信任的输入来构建查询的其他部分,这仍然是具有风险的)。
从 5.1开始,mysql支持服务器端的Prepared Statements,MySQL prepare语法:
PREPARE statement_name FROM preparable_SQL_ /*定义*/
EXECUTE statement_name [USING @var_name [, @var_name] &]; /*执行预处理语句*/
{DEALLOCATE | DROP} PREPARE statement_name /*删除定义*/ ;
2、事务(Transactions)
事务是操作数据的一个单元,是恢复和并发控制的基本单位。例如,用户A给用户B通过ATM机转账1000元,那么A账户上就会少1000元,而B用户会多1000元。在这个过程中,两个环节是关联的。第一个账户划出款项必须保证正确的存入第二个账户,如果第二个环节没有完成,整个的过程都应该取消,否则就会发生丢失款项的问题。整个交易过程,可以看作是一个事物,成功则全部成功,失败则需要全部撤消,这样可以避免当操作的中间环节出现问题时,产生数据不一致的问题。使用数据库事务可以确保除事务性单元内的所有操作都成功完成。MySQL中的InnoDB引擎的表才支持transaction,如果是MyISAM引擎的表暂不支持。
数据库事务的特性:
原子性:事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。
一致性:事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如B树索引或双向链表)都必须是正确的。
隔离性:由发并事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。这称为可串行性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。
持久性:事务完成之后,它对于系统的影响是永久性的。该修改即使出现系统故障也将一直保持。
3、存储过程(Stored procedures)
储存过程是一组为了完成特定功能的SQL语句集,经过编译之后存储在数据库中,当需要使用该组SQL语句时用户只需要通过指定储存过程的名字并给定参数就可以调用执行它了,简而言之就是一组已经写好的命令,需要使用的时候拿出来用就可以了。
储存过程是一个可编程的函数,它在数据库中创建并保存。它可以有SQL语句和一些特殊的控制结构组成。当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟。它允许控制数据的访问方式。
存储过程的优点:
存储过程能实现较快的执行速度。如果某一操作包含大量的Transaction-SQL代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的。在首次运行一个存储过程时查询,优化器对其进行分析优化,并且给出最终被存储在系统表中的执行计划。而批处理的Transaction-SQL语句在每次运行时都要进行编译和优化,速度相对要慢一些。
存储过程允许标准组件是编程。存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。
存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。
存储过程可被作为一种安全机制来充分利用。系统管理员通过执行某一存储过程的权限进行限制,能够实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全。
存储过程能过减少网络流量。针对同一个数据库对象的操作(如查询、修改),如果这一操作所涉及的Transaction-SQL语句被组织程存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而大大增加了网络流量并降低了网络负载。
存储过程的缺点:
预存程序的性能调校与撰写,受限于各种数据库系统。MySQL没有提供很好的开发和调试工具,这点SQL Server做的更好;
可用函数有限,很难写出非常复杂的查询;
预存程序,往往定制化于特定的数据库上,因为支持的编程语言不同。当切换到其他厂商的数据库系统时,需要重写原有的预存程序。
目前还无法确定在高并发(百万或者千万级)下存储过程是否会严重影响数据库性能。
4、异步查询(Asynchronous queries)
对于服务器来说,最好的情况就是IO不被阻塞(non-blocking),这样才能充分利用带宽。缺省情况下,mysql使用的是同步操作,如果一个查询在服务器上需要花费10秒钟,你调用函数就会阻塞10秒钟。为了使用异步的功能,我们需要在建立链接或者在prepare的时候加上async选项。
5、多语句执行(Multiple statements)
通常情况MySQL出于安全考虑不允许一次执行多条语句。MySQL 5.1支持在单个查询字符串中指定的多语句的执行。要想与给定的连接一起使用该功能,打开连接时,必须将标志参数中的选项指定。
使用PDO_MYSQL链接数据库
要实现以上的特性,就需要用到新的MySQLi 或 PDO_MySQL 扩展作为替代。在这里要推荐的是PDO_MySQL。
PDO & PHP Data Objects & 是一个对多种数据库提供统一操作方法的数据库访问层。它并不具备数据库特有的语法,但它将使切换数据库和平台更加容易,多数情况下,只需要简单修改链接字符串。此扩展可以使用 PDO 驱动编写过的所有数据库。下面的数据库支持已经实现:
PDO_DBLIB ( FreeTDS / Microsoft SQL Server / Sybase )
PDO_FIREBIRD ( Firebird/Interbase 6 )
PDO_IBM ( IBM DB2 )
PDO_INFORMIX ( IBM Informix Dynamic Server )
PDO_MYSQL ( MySQL 3.x/4.x/5.x )
PDO_OCI ( Oracle Call Interface )
PDO_ODBC ( ODBC v3 (IBM DB2, unixODBC and win32 ODBC) )
PDO_PGSQL ( PostgreSQL )
PDO_SQLITE ( SQLite 3 and SQLite 2 )
PDO_4D ( 4D )
PHP 数据对象 (PDO) 扩展为PHP访问数据库定义了一个轻量级的一致接口。实现 PDO 接口的每个数据库驱动可以公开具体数据库的特性作为标准扩展功能。 PDO 提供了一个 数据访问 抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据。
PHP PDO的目标是:提供一种轻型、清晰、方便的 API ,统一各种不同 RDBMS 库的共有特性,但不排除更高级的特性。 通过 PHP 脚本提供可选的较大程度的抽象/兼容性。
PHP PDO类的特点:
性能:PDO 从一开始就吸取了现有数据库扩展成功和失败的经验教训。因为 PDO 的代码是全新的,所以我们有机会重新开始设计性能,以利用 PHP 5 的最新特性。
能力:PDO 旨在将常见的数据库功能作为基础提供,同时提供对于 RDBMS 独特功能的方便访问。
简单:PDO 旨在使您能够轻松使用数据库。API 不会强行介入您的代码,同时会清楚地表明每个函数调用的过程。
运行时可扩展:PDO 扩展是模块化的,使您能够在运行时为您的数据库后端加载驱动程序,而不必重新编译或重新安装整个 PHP 程序。例如,PDO_OCI 扩展会替代 PDO 扩展实现 oracle 数据库 API。还有一些用于 MySQL、PostgreSQL、ODBC 和 Firebird 的驱动程序,更多的驱动程序尚在开发。

我要回帖

更多关于 php对mysql的操作 的文章

 

随机推荐