• 技术文章 >后端开发 >php教程

    php操作mysqli(示例代码)_PHP教程

    2016-07-13 10:25:49原创294
    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 "

    MySQL Error

    Message: $message

    SQL: $sql

    Error: $dberror

    Errno.: $dberrno

    Click here to seek help.
    ";
    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 "影响行数:", "
    ";
    var_dump($dbHelper->affected_rows());
    //var_dump($dbHelper->db->affected_rows );

    echo "查询行数","
    ";
    var_dump($dbHelper->num_rows($query));
    echo "列数:","
    ";
    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"."
    ", $col1, $col3);
    }

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


    /* fetch values */
    while ($stmt->fetch()) {
    printf("%s %s %s"."
    ", $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"."
    ", $col1, $col3);
    }

    echo "
    开始multi_query:
    ";


    //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查询信息


    //
    ?>

    www.bkjia.comtruehttp://www.bkjia.com/PHPjc/824913.htmlTechArticle?php define("MYSQL_OPEN_LOGS",true); class mysqliHelp { private $db; public function __construct() { //如果要查询日志log的话,怎么办 } public function __get($name ) { /...

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:php mysqli
    上一篇:php操作xml_PHP教程 下一篇:PHP生成Gif图片验证码_PHP教程
    20期PHP线上班

    相关文章推荐

    • 【活动】充值PHP中文网VIP即送云服务器• php 生成缩略图程序_PHP教程• PHP无限分类实例程序_PHP教程• PHP重定向的3种方式_PHP教程• php实现文件下载更能介绍_PHP教程• PHP文件上传后缀名与文件类型对照表整理_PHP教程
    1/1

    PHP中文网