php操作mysqli

 <?php
define("MYSQL_OPEN_LOGS",true);
class mysqliHelp
{
  
	private $db;
    
    public function __construct()
   {
    //如果要查询日志log的话,怎么办
 
 
    
   }
   
    public function __get($name )
	{
	  //echo "__GET:",$name;
	  if(in_array($name,array("db"),true))//或者isset($this->$name)
	  return $this->$name;
	  return null;
	
	}
	public function connect($host,$user,$pass,$db,$charSet='utf8',$force=false)
	{
  
        if($this->db && ($this->db instanceof mysqli) && !$force)
		{
			return ;
		}		
		$this->db=new mysqli($host,$user,$pass,$db);
		if (mysqli_connect_error()) {
		die('Connect Error (' . mysqli_connect_errno() . ') '
				. mysqli_connect_error());
        }
		$this->db->set_charset($charSet);
 
 
    
	}
	
	
	
  
	 //$dbname string
	 //返回值 如果成功则返回 TRUE,失败则返回 FALSE。
	function select_db ($dbname )
	{
		return $this->db->select_db($dbname); 
	}
	 
    //$query mysqli_result 
    //$resulttype int  MYSQLI_ASSOC, MYSQLI_NUM, or MYSQLI_BOTH. Defaults to MYSQLI_BOTH.
    //返回值 Returns an array of strings that corresponds to the fetched row or NULL if there are no more rows in resultset. 	
	function fetch_array(/*mysqli_result*/ $query, $resulttype = MYSQLI_ASSOC) 
	{
	    //var_dump(!null);
		if(!$query || !($query instanceof mysqli_result))
		return NULL;
		return $query->fetch_array($resulttype);// 
	}
	
	function data_seek($result,$offset)
	{
	 
	   return $result->data_seek($offset);
	
	}
	
	
    
 	function fetch_assoc($query) 
	{
	
		return $query->fetch_assoc();// 关联数组
	}
	
	function fetch_row($query) 
	{
		return $query->fetch_row();// 索引数组,数字0,1。eg。。。
	}
	
	function fetch_fields($query)
	{
		 return $query->fetch_fields();
 	}
     
  //$query string
  //$resultmode int
  //返回值 如果成功则返回 TRUE,失败则返回 FALSE。 For SELECT, SHOW, DESCRIBE or EXPLAIN mysqli_query() will return a result object. 
    public function query($sql ,$resultmode=MYSQLI_STORE_RESULT  )
    {
		if(MYSQL_OPEN_LOGS) {
			
			$sqlstarttime = $sqlendttime = 0;
                       
			$mtime = explode(' ', microtime());
			$sqlstarttime = $mtime[1]+ $mtime[0] ;
                        
 
		}
         
		//真正查询
		$query=$this->db->query($sql,$resultmode);
		
		if(MYSQL_OPEN_LOGS) {
                       // sleep(1);
			$mtime = explode(' ', microtime());
			$sqlendttime =  $mtime[1] + $mtime[0]  ;
			$sqlQueryTime = number_format($sqlendttime - $sqlstarttime,6);
            //dblogs($sql, $sqlQueryTime,1);
			$explain = array();
			$info = $this->db->info;
			if($query && preg_match("/^(select )/i", $sql)) {
				$explain = $this->fetch_array($this->db->query('EXPLAIN '.$sql), MYSQLI_ASSOC );
			}
			$GLOBALS['mysql_debug_query'][] = array('sql'=>$sql, 'time'=>$sqlQueryTime, 'info'=>$info, 'explain'=>$explain);
		}		
		
		 
		if(!$query)
		{
		  $this->halt('MySQL Query Error', $sql);
		}
		
		
		return $query;
  
    }
	
	//返回值 mysqli_stmt对象
	function prepare($sql)
	{
	  return $this->db->prepare($sql);
	
	}
	
	function affected_rows() {
	
	    
		return  $this->db->affected_rows;
	}
	function  error() 
	{
	    return  $this->db->error;
	 
	}
	function errno()
	{
		return  $this->db->errno;
	}
	//result 没有
	
	function num_rows($query)
	{
		return $query->num_rows;
	
	}
	
	//返回值 int  The number of fields from a result set. 
	//也可以用另外一种方式  mysqliHelp->db->field_count返回。
    function num_fields($query)
	{
		return  $query->field_count;
	}
	
	function free_result($query)
	{
	    //all methods are equivalent;
		$query->free();
		//$query->free_result();
		//$query->close();
	}
	
	function insert_id() 
	{
	  
	     if(($id = $this->db->insert_id)>= 0)
		 {
		    
			return $id;
		 }else
		 {
			$idArr=$this->fetch_array($this->query("SELECT last_insert_id() as id"));
			return  intval($idArr[0]);
		 }
	     
		
		//return ($idArr=$this->fetch_array($this->query("SELECT last_insert_id() as id")))[0]
		//return ($id = $this->db-insert_id)>= 0 ? $id : 0 ;
	}
	
	function close() {
	
		return $this->db->close();
	}
	
	
	function halt($message,$sql)
    {
		$dberror = $this->error();
		$dberrno = $this->errno();
		$help_link = "http://faq.comsenz.com/?type=mysql&dberrno=".rawurlencode($dberrno)."&dberror=".rawurlencode($dberror);
		echo "<div style=\"position:absolute;font-size:11px;font-family:verdana,arial;background:#EBEBEB;padding:0.5em;\">
				<b>MySQL Error</b><br>
				<b>Message</b>: $message<br>
				<b>SQL</b>: $sql<br>
				<b>Error</b>: $dberror<br>
				<b>Errno.</b>: $dberrno<br>
				<a href=\"$help_link\" target=\"_blank\">Click here to seek help.</a>
				</div>";
		exit();
    }
	
	function __destruct() 
	{
	   
	    
	   $this->db=null;
		
    }

	 		
	/*  MySQLi类
		面向对象接口	面向过程接口	别名	描述
		属性
		$mysqli->affected_rows	mysqli_affected_rows()	N/A	获取前一个Mysql操作的受影响行数
		$mysqli->client_info	mysqli_get_client_info()	N/A	返回字符串类型的Mysql客户端版本信息
		$mysqli->client_version	mysqli_get_client_version()	N/A	返回整型的Mysql客户端版本信息
		$mysqli->connect_errno	mysqli_connect_errno()	N/A	返回最后一次连接调用的错误代码
		$mysqli->connect_error	mysqli_connect_error()	N/A	返回一个字符串描述的最后一次连接调用的错误代码
		$mysqli->errno	mysqli_errno()	N/A	返回最近的函数调用产生的错误代码
		$mysqli->error	mysqli_error()	N/A	返回字符串描述的最近一次函数调用产生的错误代码
		$mysqli->field_count	mysqli_field_count()	N/A	返回最近一次查询获取到的列的数目
		$mysqli->host_info	mysqli_get_host_info()	N/A	返回一个能够代表使用的连接类型的字符串
		$mysqli->protocol_version	mysqli_get_proto_info()	N/A	返回使用的Mysql协议的版本信息
		$mysqli->server_info	mysqli_get_server_info()	N/A	返回Mysql服务端版本的信息
		$mysqli->server_version	mysqli_get_server_version()	N/A	返回整型的Mysql服务端版本信息
		$mysqli->info	mysqli_info()	N/A	最近一次执行的查询的检索信息
		$mysqli->insert_id	mysqli_insert_id()	N/A	返回最后一次查询自动生成并使用的id
		$mysqli->sqlstate	mysqli_sqlstate()	N/A	返回前一个Mysql操作的SQLSTATE错误
		$mysqli->warning_count	mysqli_warning_count()	N/A	返回给定链接最后一次查询的警告数量
		方法
		mysqli->autocommit()	mysqli_autocommit()	N/A	打开或关闭数据库的自动提交功能
		mysqli->change_user()	mysqli_change_user()	N/A	更改指定数据库连接的用户
		mysqli->character_set_name(), mysqli->client_encoding	mysqli_character_set_name()	mysqli_client_encoding()	返回数据库连接的默认字符集
		mysqli->close()	mysqli_close()	N/A	关闭先前打开的数据库连接
		mysqli->commit()	mysqli_commit()	N/A	提交当前事务
		mysqli::__construct()	mysqli_connect()	N/A	打开一个到Mysql服务端的新的连接[注意:静态方法]
		mysqli->debug()	mysqli_debug()	N/A	执行调试操作
		mysqli->dump_debug_info()	mysqli_dump_debug_info()	N/A	将调试信息转储到日志中
		mysqli->get_charset()	mysqli_get_charset()	N/A	返回对象的字符集
		mysqli->get_connection_stats()	mysqli_get_connection_stats()	N/A	返回客户端连接的统计信息。 仅可用于 mysqlnd。
		mysqli->get_client_info()	mysqli_get_client_info()	N/A	返回字符串描述的Mysql客户端版本
		mysqli->get_client_stats()	mysqli_get_client_stats()	N/A	返回每个客户端进程的统计信息。 仅可用于 mysqlnd。
		mysqli->get_cache_stats()	mysqli_get_cache_stats()	N/A	返回客户端的zval缓存统计信息。 仅可用于 mysqlnd。
		mysqli->get_server_info()	mysqli_get_server_info()	N/A	没有文档
		mysqli->get_warnings()	mysqli_get_warnings()	N/A	没有文档
		mysqli::init()	mysqli_init()	N/A	初始化mysqli并且返回一个由mysqli_real_connect使用的资源类型。[不是在对象上,是它返回的$mysqli对象]
		mysqli->kill()	mysqli_kill()	N/A	请求服务器杀死一个Mysql线程
		mysqli->more_results()	mysqli_more_results()	N/A	检查一个多语句查询是否还有其他查询结果集
		mysqli->multi_query()	mysqli_multi_query()	N/A	在数据库上执行一个多语句查询
		mysqli->next_result()	mysqli_next_result()	N/A	从multi_query中准备下一个结果集
		mysqli->options()	mysqli_options()	mysqli_set_opt()	设置选项
		mysqli->ping()	mysqli_ping()	N/A	ping一个服务器连接,或者如果那个连接断了尝试重连
		mysqli->prepare()	mysqli_prepare()	N/A	准备一个用于执行的SQL语句
		mysqli->query()	mysqli_query()	N/A	在数据库上执行一个查询
		mysqli->real_connect()	mysqli_real_connect()	N/A	打开一个到Mysql服务端的连接
		mysqli->real_escape_string(), mysqli->escape_string()	mysqli_real_escape_string()	mysqli_escape_string()	转义字符串中用于SQL语句中的特殊字符,这个转换会考虑连接的当前字符集。
		mysqli->real_query()	mysqli_real_query()	N/A	执行一个SQL查询
		mysqli->rollback()	mysqli_rollback()	N/A	回滚当前事务
		mysqli->select_db()	mysqli_select_db()	N/A	为数据库查询选择默认数据库
		mysqli->set_charset()	mysqli_set_charset()	N/A	设置默认的客户端字符集
		mysqli->set_local_infile_default()	mysqli_set_local_infile_default()	N/A	清除用户为load data local infile命令定义的处理程序
		mysqli->set_local_infile_handler()	mysqli_set_local_infile_handler()	N/A	设置LOAD DATA LOCAL INFILE命令执行的回调函数
		mysqli->ssl_set()	mysqli_ssl_set()	N/A	使用SSL建立安装连接
		mysqli->stat()	mysqli_stat()	N/A	获取当前系统状态
		mysqli->stmt_init()	mysqli_stmt_init()	N/A	初始化一个语句并且返回一个mysqli_stmt_prepare使用的对象
		mysqli->store_result()	mysqli_store_result()	N/A	传输最后一个查询的结果集
		mysqli->thread_id()	mysqli_thread_id()	N/A	返回当前连接的线程ID
		mysqli->thread_safe()	mysqli_thread_safe()	N/A	返回是否设定了线程安全
		mysqli->use_result()	mysqli_use_result()	N/A	初始化一个结果集的取回
	*/
	
	/*
			MySQL_STMT
		面向对象接口	过程化接口	别名(不要使用)	描述
		属性
		$mysqli_stmt->affected_rows	mysqli_stmt_affected_rows()	N/A	返回最后一条倍执行的语句改变,删除或插入的总行数
		$mysqli_stmt->errno	mysqli_stmt_errno()	N/A	返回最近一次语句调用的错误代码
		$mysqli_stmt->error	mysqli_stmt_error()	N/A	返回最后一条语句错误的字符串描述
		$mysqli_stmt->field_count	mysqli_stmt_field_count()	N/A	返回给定语句得到的字段数量
		$mysqli_stmt->insert_id	mysqli_stmt_insert_id()	N/A	获取前一个INSERT操作生成的ID
		$mysqli_stmt->num_rows	mysqli_stmt_num_rows()	N/A	返回语句结果集中的行数
		$mysqli_stmt->param_count	mysqli_stmt_param_count()	mysqli_param_count()	返回给定语句中参数数量
		$mysqli_stmt->sqlstate	mysqli_stmt_sqlstate()	N/A	返回前一个语句操作的SQLSTATE错误代码
		方法
		mysqli_stmt->attr_get()	mysqli_stmt_attr_get()	N/A	用于获取语句属性的当前值
		mysqli_stmt->attr_set()	mysqli_stmt_attr_set()	N/A	用于修改prepared语句的行为
		mysqli_stmt->bind_param()	mysqli_stmt_bind_param()	mysqli_bind_param()	将一个变量作为参数绑定到prepared语句上
		mysqli_stmt->bind_result()	mysqli_stmt_bind_result()	mysqli_bind_result()	将一个变量绑定到一个prepared语句上用于结果存储
		mysqli_stmt->close()	mysqli_stmt_close()	N/A	关闭一个prepared语句
		mysqli_stmt->data_seek()	mysqli_stmt_data_seek()	N/A	查看语句结果集中的任意行
		mysqli_stmt->execute()	mysqli_stmt_execute()	mysqli_execute()	执行一个prepared查询
		mysqli_stmt->fetch()	mysqli_stmt_fetch()	mysqli_fetch()	从一个prepared语句中抓取结果到限定变量中
		mysqli_stmt->free_result()	mysqli_stmt_free_result()	N/A	释放给定语句处理存储的结果集所占内存
		$mysqli_stmt->get_result()	mysqli_stmt_get_result	N/A	没有文档 仅可用于 mysqlnd。
		mysqli_stmt->get_warnings()	mysqli_stmt_get_warnings()	N/A	没有文档
		$mysqli_stmt->more_results()	mysqli_stmt_more_results()	N/A	没有文档 仅可用于 mysqlnd。
		$mysqli_stmt->next_result()	mysqli_stmt_next_result()	N/A	没有文档 仅可用于 mysqlnd。
		mysqli_stmt->num_rows()	mysqli_stmt_num_rows()	N/A	查阅属性$mysqli_stmt->num_rows
		mysqli_stmt->prepare()	mysqli_stmt_prepare()	N/A	准备一个SQL语句用于执行
		mysqli_stmt->reset()	mysqli_stmt_reset()	N/A	重置一个prepared语句
		mysqli_stmt->result_metadata()	mysqli_stmt_result_metadata()	mysqli_get_metadata()	从一个prepared语句返回结果集元数据
		mysqli_stmt->send_long_data()	mysqli_stmt_send_long_data()	mysqli_send_long_data()	发送数据块
		mysqli_stmt->store_result()	mysqli_stmt_store_result()	N/A	从一个prepared语句中传输一个结果集
	
	*/
	
	/*
			MySQLi_RESULT
		面向对象接口	过程化接口	别名(不要使用)	描述
		属性
		$mysqli_result->current_field	mysqli_field_tell()	N/A	获取当前字段在结果集指针中的开始位置
		$mysqli_result->field_count	mysqli_num_fields()	N/A	获取结果中字段数量
		$mysqli_result->lengths	mysqli_fetch_lengths()	N/A	返回结果集中当前行的每列的值得长度,返回数组
		$mysqli_result->num_rows	mysqli_num_rows()	N/A	获取结果中行的数量
		方法
		mysqli_result->data_seek()	mysqli_data_seek()	N/A	将结果中的结果指针调整到任意行
		mysqli_result->fetch_all()	mysqli_fetch_all()	N/A	抓取所有的结果行并且以关联数据,数值索引数组,或者两者皆有的方式返回结果集。仅可用于 mysqlnd。
		mysqli_result->fetch_array()	mysqli_fetch_array()	N/A	以一个关联数组,数值索引数组,或者两者皆有的方式抓取一行结果
		mysqli_result->fetch_assoc()	mysqli_fetch_assoc()	N/A	以一个关联数组方式抓取一行结果
		mysqli_result->fetch_field_direct()	mysqli_fetch_field_direct()	N/A	抓取一个单字段的元数据
		mysqli_result->fetch_field()	mysqli_fetch_field()	N/A	返回结果集中的下一个字段
		mysqli_result->fetch_fields()	mysqli_fetch_fields()	N/A	返回一个代表结果集字段的对象数组
		mysqli_result->fetch_object()	mysqli_fetch_object()	N/A	以一个对象的方式返回一个结果集中的当前行
		mysqli_result->fetch_row()	mysqli_fetch_row()	N/A	以一个枚举数组方式返回一行结果
		mysqli_result->field_seek()	mysqli_field_seek()	N/A	设置结果指针到特定的字段开始位置
		mysqli_result->free(), mysqli_result->close, mysqli_result->free_result	mysqli_free_result()	N/A	释放与一个结果集相关的内存
	*/
	/*注意 MYSQLI_STORE_RESULT和MYSQLI_USE_RESULT的区别
	 其实这两个参数的区别还是很大的。
	(1)区别在于从服务器上检索结果集的行。
	(2)MYSQLI_USE_RESULT 启动查询,但实际上并未获取任何行
	(3)MYSQLI_STORE_RESULT 立即检索所有的行
	(4)MYSQLI_STORE_RESULT 从服务器上检索结果集时,就提取了行,并为之分配内存,存储到客户机中,随后调用
	     mysqli_fetch_array()就再也不会返回错误,因为它仅仅是把行脱离了已经保留结果集的数据结 构,mysqli_fetch_array()返回 NULL始终表示已经到达结果集的末端。
	(5)MYSQLI_USE_RESULT 本身不检索任何行,而只是启动一个逐行的检索,就是说必须对每行调 用
    	mysqli_fetch_array()来自己完成。既然如此,虽然正常情况下,mysqli_fetch_array()返回NULL仍然表示此 时已到达结果集的末端,但也可能表示在与服务器通信时发生错误。

	
	 如果是MYSQLI_USE_RESULT,query以后得到mysqli_result对象后,执行data_seek会出错,因为
	 mysqli_result::data_seek() [mysqli-result.data-seek]: Function cannot be used with MYSQL_USE_RESULT 
	 
	 与MYSQLI_USE_RESULT相比,MYSQLI_STORE_RESULT 有着较高的内存和处理需求,因为是在客户机上维护整个结果集,所以内存分配和创建数据结构的耗费是非常巨大的,如果想一次检索多个行,可用 MYSQLI_USE_RESULT。
	 MYSQLI_USE_RESULT有着较低的内存需求,因为只需给每次处理的单行分配足够的空间。这样速度就较快,因为不必为结果集建立复杂的数据结构。
	 另一方面,MYSQLI_USE_RESULT把较大的负载加到了服务器上,它必须保留结果集中的行,直到客户机看起来适合检索所有的行。
    */
}

$dbHelper=new mysqliHelp;
$dbHelper->connect('localhost', 'root', '', 'tt');

//$dbHelper->db->select_db("tt");
//$dbHelper->db->set_charset("utf8");


//这里如果是MYSQLI_USE_RESULT,下面的$dbHelper->data_seek($query,10);就会出错
$query=$dbHelper->query("select id,cateid,title from product limit 22",MYSQLI_STORE_RESULT );
//$query=$dbHelper->query("update product set  createtime=UNIX_TIMESTAMP()  limit 22");

//$query=$dbHelper->query("insert  into `product`(`cateid`,`title`,`text`,`createtime`) values (2,'test','content',1284822691)");
//$query=$dbHelper->query("delete from `product` where id=1");
//$query=$dbHelper->query("replace into product(id,cateid,title,text,createtime) values(1,2,'this is demo','test',UNIX_TIMESTAMP())");


echo $query->num_rows."总数";

//var_dump($query);


//$row=$dbHelper->fetch_array($query);
 
//var_dump($row);


//finfo = $dbHelper->fetch_fields($query);

//var_dump($finfo);
// foreach ($finfo as $val) {

	// printf("Name:     %s\n", $val->name);
	// printf("Table:    %s\n", $val->table);
	// printf("max. Len: %d\n", $val->max_length);
	// printf("Flags:    %d\n", $val->flags);
	// printf("Type:     %d\n\n", $val->type);
// }

//如果是查询操作affected_rows行数为1,num_rows为查询结果行数,num_fields为字段数目
//如果是更新或者删除操作affected_rows为受影响的行数,num_rows为null,num_fields为null
//
$dbHelper->data_seek($query,10);

$row=$dbHelper->fetch_row($query);

var_dump($row);



echo "影响行数:", "<br/>";
var_dump($dbHelper->affected_rows());
//var_dump($dbHelper->db->affected_rows );

echo "查询行数","<br/>";
var_dump($dbHelper->num_rows($query));
echo "列数:","<br/>";
var_dump($dbHelper->num_fields($query));
 
 
//第1种 
$sql="select id,cateid,title from product where cateid=? and title like  ? and createtime<".time();

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

var_dump($stmt);
$stmt->bind_param('is',$cateid,$title);

$title="%%";
$cateid=10;
$stmt->execute();
$stmt->bind_result($col1, $col2,$col3);


/* fetch values */
while ($stmt->fetch()) {
	printf("%s %s"."<br/>", $col1, $col3);
}

echo "<br/>";
$title="%%";
$cateid=4;
$stmt->execute();
$stmt->bind_result($col1, $col2,$col3);


/* fetch values */
while ($stmt->fetch()) {
	printf("%s %s %s"."<br/>", $col1, $col2,$col3);
}

$stmt->close();


//第2种

$stmt=$dbHelper->db->stmt_init();
$stmt->prepare($sql);
$stmt->bind_param('is',$cateid,$title);

$title="%%";
$cateid=10;
$stmt->execute();
$stmt->bind_result($col1, $col2,$col3);


/* fetch values */
while ($stmt->fetch()) {
	//printf("%s %s"."<br/>", $col1, $col3);
}

echo "<br/>开始multi_query:<br/>";


//multi_query实例
//multi_query()方法的返回值,以及 //mysqli的属性errno、error、info等只与第一条SQL命令有关,无法判断第二条及以后的命令是否在执行时发生了错误。所以在执行 //multi_query()方法的返回值是TRUE时,并不意味着后续命令在执行时没有出错。

$sql="select id,cateid,title from product where cateid=4;";
$sql.="select id,cateid,title from product where cateid=10";

$query=$dbHelper->db->multi_query($sql);

if($query)
{
	  do {
        /* store first result set */
		//下面两种方法有什么区别?
        // if ($result = $dbHelper->db->store_result()) {
            // while ($row = $result->fetch_row()) {
                // $data[]=$row;
            // }
            // $result->free();
        // }
		if ($result = $dbHelper->db->use_result()) {//返回mysqli_result类型
		    //$result->data_seek(0);//返回bool
            while ($row = $result->fetch_row()) {
                $data[]=$row;
            }
            //$result->close();
        }
		
		
        /* print divider */
        if ($dbHelper->db->more_results()) {
            printf("-----------------\n");
			$data[]="_______________________________";
        }
    } while ($dbHelper->db->next_result());


}
var_dump($data);
//exit;
//执行事务 实例
//确保操作的表时innodb类型的表
//如果是MyISAM,逻辑出错的话, 会执行所有操作,不回滚
$price=1;
$success=true;
$dbHelper->db->autocommit(0);
$result=$dbHelper->query("update product set cateid=cateid-$price where id=1000" );
if(!$result  || $dbHelper->affected_rows()!=1)
{
	$success=false;

}

$result=$dbHelper->query("update product set cateid=cateid+$price where id=2");
if(!$result  || $dbHelper->affected_rows()!=1)
{
	$success=false;

}

if($success)
{
$dbHelper->db->commit();
echo "成功";

}else
{
$dbHelper->db->rollback();
echo "失败";

}
$dbHelper->db->autocommit(1);





//var_dump(  $dbHelper->insert_id());
var_dump($mysql_debug_query);  //打印sql查询信息


//














?> 

  

posted on 2011-11-16 15:48  天空尚兰  阅读(652)  评论(0编辑  收藏  举报

导航