PHP面向对象操作数据库--MySQLI类

 

自学PHP,这几天学到了连接数据库,干脆把MySQLI的API全过一遍吧!

 

MySQLI
    代表PHP和Mysql数据库之间的一个连接。
    1.mysqli::affected_rows :
        返回影响到数据表的行数
        

select_db("mysql");
            $sql="insert into t_member values('马六','maliu')";
            $con->query($sql);
            echo $con->affected_rows;
        ?>


    2.mysqli::autocommit :
        查看 MySQL 客户端的事务提交方式命令:select @@autocommit;
        修改 MySQL 客户端的事务提交方式为手动提交命令:set @@autocommit = 0;
        关闭自动提交的原因,事务作为一个独立处理最小单元,往往需要处理一系列连续的数据操作,这些操作被视为一个整体,需要同时成功或同时失败,而不能其中某个操作成功;比如:A汇款给B,B接收到歀;即 A的账户扣款,而B的账户增加;必须同时成功或同时失败;如果成功则commit否则整体回滚;只对局部(当前命令行窗口)有效;若全局有效得修改文件;
        
        下面代码如果不加带星号那行代码,则数据不会插入到表中,但会存在缓存里,然后select会从缓存里取结果,结果里会含有刚刚存入缓存里的数据,但是没有插入到表中。如果程序结束而没有commit,数据就不会存入到数据表中;如果加了带星号的那行代码,则不上面事务做任何处理
    

    select_db("mysql");
            $con->autocommit(false);
            $sql="insert into t_member values('wewwwwww','aliu')";
            $con->query($sql);
        *    $con->rollback();
            $sql="select * from t_member";
            $result=$con->query($sql);
            while($row=$result->fetch_row()){
                print_r($row);
            }
        ?>


    3.mysqli::begin_transaction :
        等同于上一个的功能;
        

select_db("mysql");
            $con->begin_transaction();
            $sql="insert into t_member values('b','aliu')";
            $con->query($sql);
            $con->commit();//此处不可改为autocommit(true),这就是说$con->begin_transaction()不等于将autocommit()的值设为false
        ?>


    4.mysqli::change_user;
        改变当前所连接的数据库
        

$con->change_user("root","123456","sys");//转到了sys数据库


    5.mysqli::character_set_name :
        返回当前数据库连接的默认字符编码
    6.mysqli::close :
      

 $con->close();不需要参数,过程化如mysqli_close()需要参数


    7.mysqli::commit()
        提交事务
    8.mysqli::$connect_errno
        返回连接数据库时的错误代码
    9.mysqli::$connect_errno
        返回连接数据库时的错误字符串,即描述信息
    10.mysqli::__construct
        mysqli的构造函数,当new mysqli的构造函数,当new对象的时候,自动调用
    11.mysqli::errno
        返回最近函数调用的错误代码,$con->errno 注意没有括号
    12.mysqli::$error_list
        返回最近函数调用的一系列错误信息,包含错误代码,sqlstate,错误描述,以数组返回,可以利用print_r输出
    13.mysqli::$error
        返回最近函数调用的错误描述信息
    14.mysqli_$field_count
        返回最近查询的列数,注意是列数
    15.mysqli::get_charset
        得到一个含有指定字符集的对象,可以用var_dump()来输出这个对象,因为不是数组所以不能用print_r
    16.mysqli::$client_info
        获取MySQL客户端信息
    17.mysqli::$client_version
        作为一个整数返回MySQL客户端的版本
    18.mysqli::get_connection_stats
        返回客户端连接的统计数据,数组形式
    19.mysqli::$host_info
        返回一个表述使用的连接类型的字符串
    20.mysqli::$protocol_version
        返回MySQL使用的协议版本号
    21.mysqli::init
        初始化 MySQLi 并返回一个资源类型的值,这个值可以作为 mysqli_real_connect() 函数的传入参数,mysqli::real_connect()不需要这种资源类型的值
    22.mysqli::$insert_id
        函数返回最后一个 SQL 语句(通常是 INSERT 语句) 所操作的表中设置为 AUTO_INCREMENT 的列的值。 如果最后一个 SQL 语句不是 INSERT 或者 UPDATE 语句, 或者所操作的表中没有设置为 AUTO_INCREMENT 的列, 返回值为 0。
        Note:

        如果在所执行的 INSERT 或者 UPDATE 语句中使用了数据库函数 LAST_INSERT_ID()。 有可能会影响 mysqli_insert_id() 函数的返回值。
    23.mysqli::kill
         本函数可以用来让服务器杀掉 processid 参数指定的 线程 ID。数据库连接对应的线程 ID 可以通过 调用 mysqli::$thread_id 得到。如果仅仅想中止某个查询,请使用这个 SQL 语句: KILL QUERY processid。
        

select_db("mysql");
            $id=$con->thread_id;
            $con->kill($id);
            $sql="select * from t_member where name='b'";
            $ree=$con->query($sql);
            
        ?>


    24.mysqli::multi_query
        用来一次执行多条语句的函数
      

 select_db("mysql");
            $sql="select * from t_member where name='b';";//注意每一条语句都以分号结尾
            $sql.="select * from t_member where name='c'";
            /* 批量执行查询 */
            if ($con->multi_query($sql)) {    //判断此函数执行是否成功
                    do {
                            /* store first result set */
                            if ($result = $con->store_result()) {    //用来获取多条查询结果中的第一条查询的结果,这个结果非数组和query得到的是一样的 所以还得用mysqli_result中的方法
                                while ($row = $result->fetch_row()) {    //用fetch_row来得到结果集中的第一行,虽然只有一行
                                    printf("%s\n", $row[0]);
                                }
                            }
                            /* print divider */
                            if ($con->more_results()) {
                                printf("-----------------\n");
                            }
                    } while (@$con->next_result());//为读取下一个结果集作准备
                        }


        ?>


    25.mysqli::more_results
        检查批量查询中是否还有查询结果
    26.mysqli::next_result
        mysqli::multi_query() 函数执行之后, 为读取下一个结果集做准备, 然后可以使用 mysqli::store_result() 或 mysqli::use_result() 函数读取下一个结果集。
    27.mysqli::options
        设置一个连接的扩展选项,这些选项可以改变这个连接的行为。
        如果要对多个选项进行设置,可以多次调用此函数来。
        mysqli::options() 需要在 mysqli::init() 函数之后、 mysqli::real_connect() 函数之前被调用。
      ---------------------------------------------------------------------------------------------------------------
      |    MYSQLI_OPT_CONNECT_TIMEOUT     连接超时设置,以秒为单位(在 Windows 平台上,PHP 5.3.1 之后才支持此选项)。     |
      |    MYSQLI_OPT_LOCAL_INFILE     启用或禁用 LOAD LOCAL INFILE 语句                                                |
      |    MYSQLI_INIT_COMMAND     成功建立 MySQL 连接之后要执行的 SQL 语句                                            |
      |    MYSQLI_READ_DEFAULT_FILE     从指定的文件中读取选项,而不是使用 my.cnf 中的选项                              |
      |    MYSQLI_READ_DEFAULT_GROUP     从 my.cnf 或者 MYSQL_READ_DEFAULT_FILE 指定的文件中 读取指定的组中的选项。      |
      |    MYSQLI_SERVER_PUBLIC_KEY     SHA-256 认证模式下,要使用的 RSA 公钥文件。                                     |
      |    MYSQLI_OPT_NET_CMD_BUFFER_SIZE     内部命令/网络缓冲大小, 仅在 mysqlnd 驱动下有效。                           |
      |    MYSQLI_OPT_NET_READ_BUFFER_SIZE     以字节为单位,读取 MySQL 命令报文时候的块大小, 仅在 mysqlnd 驱动下有效 |
      |    MYSQLI_OPT_INT_AND_FLOAT_NATIVE     将整数和浮点数类型的列转换成 PHP 的数值类型, 仅在 mysqlnd 驱动下有效   |
      |    MYSQLI_OPT_SSL_VERIFY_SERVER_CERT                                                                             |
      ---------------------------------------------------------------------------------------------------------------
        
      

  options(MYSQLI_INIT_COMMAND, 'SET AUTOCOMMIT = 0')) {
            die('Setting MYSQLI_INIT_COMMAND failed');
        }

        if (!$mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5)) {
            die('Setting MYSQLI_OPT_CONNECT_TIMEOUT failed');
        }

        if (!$mysqli->real_connect('localhost', 'my_user', 'my_password', 'my_db')) {
            die('Connect Error (' . mysqli_connect_errno() . ') '
                    . mysqli_connect_error());
        }

        echo 'Success... ' . $mysqli->host_info . "\n";

        $mysqli->close();
        ?>


    28.mysqli::ping
        检查到服务器的连接是否还正常。
        在启用 mysqli.reconnect 选项的前提下, 如果连接已经断开, ping 操作会尝试重新建立连接。
        Note: mysqlnd 驱动会忽略 php.ini 中的 mysqli.reconnect 选项, 所以它不会自动重连。
        客户端建立连接之后,长时间处于闲置状态, 可以用此函数来检查服务器是否关闭了这个连接, 如有必要,将会自动重新建立到服务器的连接。
    29.mysqli::prepare ( string $query )
        做好执行 SQL 语句的准备,返回一个语句句柄,可以对这个句柄进行后续的操作。 这里仅仅支持单一的 SQL 语句,不支持多 SQL 语句。
        在执行语句之前,需要使用 mysqli_stmt::bind_param() 函数 对占位符参数进行绑定。 同样,在获取结果之前,必须使用 mysqli_stmt::bind_result() 函数对返回的列值进行绑定。
        SQL 语句中可以包含一个或者多个问号(?) 表示语句的参数。
        SQL 语句中,仅允许在特定的位置出现问号参数占位符。 例如,在 INSERT 语句中的 VALUES() 子句中可以使用参数占位符,来表示对应列的值。也可以在 WHERE 字句中使用参数来表示 要进行比较的值。
        但是,并不是所有的地方都允许使用参数占位符, 例如对于表名、列名这样的 SQL 语句中的标识位置, 就不可以使用参数占位。 SELECT 语句中的列名就不可以使用参数。 另外,对于 = 这样的逻辑比较操作也不可以在两侧都使用参数, 否则服务器在解析 SQL 的时候就不知道该如何检测参数类型了。 也不可以在 NULL 条件中使用问号, 也就是说不可以写成:? IS NULL。 一般而言,参数也只能用在数据操作(DML)语句中, 不可以用在数据定义(DDL)语句中。
      

 select_db("mysql");
            if($bin=$con->prepare("select * from t_member where name=? and password=?")){//返回一个句柄,必须用一个派一个变量
                $name1="c";
                $password1="2";
                $bin->bind_param("ss",$name1,$password1);//绑定参数,除了第一个参数外不能用直接量,得用变量
                $bin->execute();//mysqli_stmt中的执行查询,不像Mysqli中的query返回的是一个对象,而是将查询的结果放在mysql服务器,等待fetch逐条来取,然后相应的绑定再bind_result中的各个变量中
                $bin->bind_result($name,$result);//将查询结果的列值绑定到变量,
                while($bin->fetch()){//获取查询结果的值
                    printf("%s %s",$name,$result);

                }

                $bin->close();// 关于语句对象
            }
        ?>


        
        
        使用预处理的好处:
        (1)可以通过驱动让服务端缓存查询计划,从而提高查询效率;
        (2)可以防止SQL注入,自动转义一些特殊字符.
        坏处:
        (1)本地到一个连接,以便另一个连接不能再使用
        (2)存储函数中不能使用(存储过程是可以的)
        (3)有可能会导致“泄漏”如果你忘记释放它
    30.mysqli::query ( string $query [, int $resultmode = MYSQLI_STORE_RESULT ] )
        对数据库执行一次查询
        其后第二个参数默认为MYSQLI_STORE_RESULT,也可以是MYSQLI_USE    _RESULT,他们的区别是    mysql_use_result()的结果必须“一次性用完”,也就是说用它得到一个result后,必须反复用mysql_fetch_row()读取其结果直至该函数返回null为止,否则如果你再次进行mysql查询,会得到“Commands out of sync; you can't run this command now”的错误。        而mysql_store_result()得到result是存下来的,你无需把全部行结果读完,就可以进行另外的查询。比如你进行一个查询,得到一系列记录,再根据这些结果,用一个循环再进行数据库查询,就只能用mysql_store_result()。
        

select_db("mysql");
            $sql="select * from t_member";
            $re=$con->query($sql,MYSQLI_USE_RESULT);
            $row=$re->fetch_row();
                printf("%s %s",$row[0],$row[1]);
            $sql="select * from t_member";
            $re=$con->query($sql,MYSQLI_USE_RESULT);
            $row=$re->fetch_row();
                printf("%s %s",$row[0],$row[1]);
        ?>//这样会报错
        select_db("mysql");
            $sql="select * from t_member";
            $re=$con->query($sql);
            while($row=$re->fetch_row()){
                printf("%s %s",$row[0],$row[1]);
            }
        ?>//这样则不会


    31.mysqli::real_connect
        建立一个 MySQL 服务器连接
      
    32.mysqli::real_escape_string
        根据当前连接的字符集,对于 SQL 语句中的特殊字符进行转义
        此函数用来对字符串中的特殊字符进行转义, 以使得这个字符串是一个合法的 SQL 语句。 传入的字符串会根据当前连接的字符集进行转义,得到一个编码后的合法的 SQL 语句。
        在调用 mysqli_real_escape_string() 函数之前, 必须先通过调用 mysqli_set_charset() 函数或者在 MySQL 服务器端设置字符集。 更多信息请参考 字符集。
      

 real_escape_string($newname);

            // 转义后插入,执行成功
            $re=$con->query("INSERT into websites2 (name,password) VALUES ('$newname','$newname')");
            if(!$re){
                echo $con->error;
            }
            mysqli_close($con);
        ?>


    33.mysqli::real_query
        执行一个mysql查询
        返回值是bool值
      

  select_db("mysql");
            $sql="select * from t_member";;
            $re=$con->real_query($sql);
            var_dump($re);    
        ?>


    34.mysqli::refresh
        刷新
    35.mysqli::rollback
        回退当前事务
      

 select_db("mysql");
            $con->autocommit(false);
            $sql="insert into t_member values('m','m')";
            $con->query($sql);
            $con->rollback();
            $con->autocommit(true);
            $con->close();        
        ?>


    36.mysqli::select_db
        选择用于数据库查询的默认数据库
    37.mysqli::set_charset
        这应该是首选的用于改变字符编码的方法,不建议使用mysqli_query()执行SQL请求的SET NAMES ...(如 SET NAMES utf8)。
    38.mysqli::$sqlstate
        返回一个包含 SQLSTATE 错误码的字符串,表示上一次 SQL 操作的错误。 错误码是由 5 个字符构成,'00000' 表示没有发生错误。 需要注意的是,并不是所有的 MySQL 错误都映射到 SQLSTATE 了, 未映射的错误消息使用 HY000(综合错误)表示。
      

  select_db("mysql");
            $sql="CREATE TABLE City (ID INT, Name VARCHAR(30))";
            $re=$con->query($sql);
            if(!$re){
                
                printf("%s",$con->error);
            }
            if(!$re){
            printf("%s",$con->sqlstate);
            }
            $con->close();        
        ?>


    39.mysqli::set_local_infile_default
        取消用户指定的回调函数
    40.mysqli_set_local_infile_handler
        设置 LOAD DATA LOCAL INFILE 命令的回调函数
    41.mysqli::stat
        获取当前系统状态信息
      

 select_db("mysql");
            $sql="CREATE TABLE City (ID INT, Name VARCHAR(30))";
            $re=$con->query($sql);
            printf("%s",$con->stat());
            $con->close();        
        ?>


        输出:Uptime: 105949 Threads: 1 Questions: 11908 Slow queries: 0 Opens: 723 Flush tables: 1 Open tables: 608 Queries per second avg: 0.112
    42.mysqli::stmt_init
        初始化一条语句并返回一个用于mysqli_stmt::prepare(调用)的对象
     

   select_db("mysql");
            $con->stmt_init();
            $sql="select * from t_member";
            $pre=$con->prepare($sql);
            $pre->execute();
            $pre->bind_result($name,$result);
            while($row=$pre->fetch())
            {
                printf("%s %s",$name,$result);
            }
        ?>


    43.mysqli::store_result
        select语句查询之后的结果是出于缓存区的,转移上一次查询返回的结果集
        
        如果上一查询并不产生结果集(例如,执行了一个 INSERT 语句), 那么 mysqli_store_result() 会返回 FALSE。 如果读取结果集失败了,也会返回 FALSE。 如何区分是上面哪种情况导致此函数的调用返回了 FALSE? 你可以通过下面的方法来检测: mysqli_error() 返回了非空的字符串, mysqli_errno() 返回了非零值, 或者 mysqli_field_count() 返回了非零值, 都表示发生错误了。 还有一种可能的情况会导致此函数的调用返回 FALSE:上一次查询 mysqli_query() 本身是成功的, 但是由于返回的结果集太大,无法为其分配足够的内存来进行结果集转移。 如果 mysqli_field_count() 函数返回了一个非零值,那么表示 SQL 语句产生了一个非空的结果集。
        
        执行查询之后, 使用 mysqli_free_result() 函数来释放结果集所占用的内存, 是一个很有用的实战经验。 尤其是当使用 mysqli_store_result() 函数来转移数量较大的结果集的时候, 释放结果集内存的操作尤为重要。
    44.mysqli::$thread_id
        返回当前连接的线程 ID
         线程 ID 是每次连接都重新分配的,也就是说它和连接是紧密相关的, 如果某个连接异常断开了,然后重新建立了到数据库的连接, 这个线程 ID 就不再是原来的那个了,它会发生变化。可以通过执行 SQL 语句:KILL QUERY processid 来杀掉对应连接上正在执行的 SQL 语句。
    45.mysqli::thread_safe
        返回是否是线程安全的,如果是的话,返回TRUE,否则返回FALSE。
    46.mysqli::$warning_count
        返回最近一次连接所出现的警告条数
    
    
    
    
    
    
    
MySQLI::result
    代表从一个数据库查询中获取的结果集。
    1.mysqli_result::fetch_field
        从结果集中取得列信息并作为对象返回。自动指向下一个字段
            被返回的对象的属性为:

            name - 列名
            table - 该列所在的表名
            max_length - 该列最大长度
            not_null - 1,如果该列不能为 NULL
            primary_key - 1,如果该列是 primary key
            unique_key - 1,如果该列是 unique key
            multiple_key - 1,如果该列是 non-unique key
            numeric - 1,如果该列是 numeric
            blob - 1,如果该列是 BLOB
            type - 该列的类型
            unsigned - 1,如果该列是无符号数
            zerofill - 1,如果该列是 zero-filled
    2.mysqli_result::current_field
        指向取得的结果集中的第一个字段,然后每次循环依次往后值

  

  select_db("mysql");
            $sql="select * from t_member";
            $res=$con->query($sql);
            while($col=$res->fetch_field()){
                $current=$res->current_field;
                printf("col:     %d\n", $current);
                printf("Name:     %s\n", $col->name);
                printf("Table:    %s\n", $col->table);
                printf("max. Len: %d\n", $col->max_length);
                printf("Flags:    %d\n", $col->flags);
                printf("Type:     %d\n\n", $col->type);
                
            }
    ?>


    3.mysqli_result::data_seek
        将取得的结果集中的指针指向指定的行数,一开始是0
        

select_db("mysql");
            $sql="select * from t_member";//注意每一条语句都以分号结尾
            $res=$con->query($sql);
            $res->data_seek(2);//此处就是将指针指向第2+1行
            $re=$res->fetch_row();
            printf("%s %s",$re[0],$re[1]);
        ?>


    4.mysqli_result::fetch_all([ int $resulttype = MYSQLI_NUM ])
        将结果集转换成数组,参数resulttype有MYSQLI_ASSOC(键值对应不包含数字角标值对应),MYSQLI_NUM(数字角标值对应不包含键值对应),MYSQLI_BOTH(两者都有)
      

 select_db("mysql");
            $sql="select * from t_member";//注意每一条语句都以分号结尾
            $res=$con->query($sql);
            /*
            $post=$res->fetch_all( MYSQLI_BOTH);
            print_r($post);
            
                结果:Array (
                            [0] => Array ( [0] => b [name] => b [1] => 5 [password] => 5 )
                            [1] => Array ( [0] => c [name] => c [1] => 2 [password] => 2 )
                            [2] => Array ( [0] => j [name] => j [1] => 2 [password] => 2 )
                            [3] => Array ( [0] => m [name] => m [1] => m [password] => m )
                            [4] => Array ( [0] => n [name] => n [1] => m [password] => m )
                )
            */
            /*
            $post=$res->fetch_all( MYSQLI_ASSOC);
            print_r($post);
            
                结果:Array (
                            [0] => Array ( [name] => b [password] => 5 )
                            [1] => Array ( [name] => c [password] => 2 )
                            [2] => Array ( [name] => j [password] => 2 )
                            [3] => Array ( [name] => m [password] => m )
                            [4] => Array ( [name] => n [password] => m )
                )
            */
            /*
            $post=$res->fetch_all( MYSQLI_NUM);
            print_r($post);
            
                结果:Array (
                            [0] => Array ( [0] => b [1] => 5 )
                            [1] => Array ( [0] => c [1] => 2 )
                            [2] => Array ( [0] => j [1] => 2 )
                            [3] => Array ( [0] => m [1] => m )
                            [4] => Array ( [0] => n [1] => m )
                )
            */
        ?>


    5.mysqli_result::fetch_array
        从结果集中取得一行,作为数组,类型为BOTH,指针指向下一行
        

select_db("mysql");
            $sql="select * from t_member";//注意每一条语句都以分号结尾
            $res=$con->query($sql);
            while($row=$res->fetch_array()){
                printf("%s %s",$row[0],$row[1]);
            }
        ?>


    6.mysqli_result::fetch_assoc
        从结果集中取得一行作为关联数组(键值数组即BOTH中非array的那一半),指针指向下一行
    7.mysqli_result::fetch_fields
        返回结果集中每一行的字段信息,以数组返回;
    8.mysqli_result::fetch_object
        将结果集的一行作为对象返回
    9.mysqli_result::fetch_row
        从结果集中取得一行作为关联数组(键值数组即BOTH中非关联数组的那一半),指针指向下一行
    10.mysqli_result::$field_count
        获取结果中的字段数
    11.mysqli_result::free_result
        从结果集中取得行,然后释放结果内存
      

  select_db("mysql");
            $sql="select * from t_member";//注意每一条语句都以分号结尾
            $res=$con->query($sql);
            while($array=$res->fetch_row()){
            print_r($array);    
            }
            $res->free_result();    //注意不是$array
        ?>


    12.mysqli_result::$num_rows
        获取结果集长度,在不需要转换成数组的情况下
     

   select_db("mysql");
            $sql="select * from t_member";//注意每一条语句都以分号结尾
            $res=$con->query($sql);
            echo $res->num_rows;
        ?>


    
    

 

你可能感兴趣的:(PHP面向对象操作数据库--MySQLI类)