当前位置: 移动技术网 > IT编程>开发语言>PHP > php操作mysqli(示例代码)

php操作mysqli(示例代码)

2019年05月24日  | 移动技术网IT编程  | 我要评论
<?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查询信息

 
//
?>

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网