php操作mysqli(示例代码)
前端之家收集整理的这篇文章主要介绍了
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,$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;\">
MysqL Error
Message: $message
sql: $sql
Error: $dberror
Errno.: $dberrno
<a href=\"$help_link\" target=\"_blank\">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
stmtsqlstate() 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->resultMetadata()
MysqLi_stmt
resultMetadata()
MysqLi
getMetadata() 从一个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,title,text,createtime) values(1,2,'this is demo',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,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,$col3);
/ fetch values
/
while ($stmt->fetch()) {
printf("%s %s %s"."
",$col3);
} $stmt->close();
//第2种 $stmt=$dbHelper->db->stmt_init();
$stmt->prepare($sql);
$stmt->bind_param('is',$col3);
/ fetch values
/
while ($stmt->fetch()) {
//printf("%s %s"."
",$col3);
} echo "
开始multi_query:
";
//multi_query实例
//multi_query()方法的返回值,以及 //MysqLi的属性errno、error、info等只与第一条sql命令有关,无法判断第二条及以后的命令是否在执行时发生了错误。所以在执行 //multi_query()方法的返回值是TRUE时,并不意味着后续命令在执行时没有出错。 $sql="select id,title from product where cateid=4;";
$sql.="select id,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查询信息
//
?>