-
PHP利用mysqli操作数据库方法总结
网络 2015/6/9 15:34:53从php5.0开始增加mysql(i)支持 , 新加的功能都以对象的形式添加
i表示改进的意思 功能多、效率高、稳定
由于版权问题 从 php5.3开始 php开始用 mysqlnd 替代 libmysql.dll
mysqlnd 是zend公司开发的mysql数据库驱动,相比原来各方面都有所提高mysqli 过程、对象方式都支持
mysqli提供的三个类:
1、mysqli 和连接相关的
2、MySQLi_Result 处理结果集
3、mysqli_stmt 预处理类
//设置字符集
set_charset//获取字符集
character_set_name创建数据库连接对象
1234567891011121314//创建mysqli对象方式 1
//屏蔽连接产生的错误
$mysqli
=
new
mysqli(
'127.0.0.1'
,
'root'
,
''
,
'test'
);
//只能用函数来判断是否连接成功
if
(mysqli_connect_errno())
{
echo
mysqli_connect_error();
}
//创建mysqli对象方式 2 可以设置一些参数
$mysqli
= mysqli_init();
$mysqli
->options(MYSQLI_OPT_CONNECT_TIMEOUT, 2);
//设置超时时间
$mysqli
->real_connect(
'127.0.0.1'
,
'root'
,
''
,
'test'
);
query:失败返回false,select成功返回结果集对象,其他返回true 非false,意味着sql执行成功了
无结果集示例
12345678910111213141516171819202122$mysqli
= mysqli_init();
$mysqli
->options(MYSQLI_OPT_CONNECT_TIMEOUT, 2);
//设置超时时间
$mysqli
->real_connect(
'127.0.0.1'
,
'root'
,
''
,
'test'
);
$sql
=
"insert into limove(`name`, `order`) values('aa', 11)"
;
$rst
=
$mysqli
->query(
$sql
);
$sql
=
"delete from limove where id = 221"
;
$rst
=
$mysqli
->query(
$sql
);
if
(
$rst
=== false)
{
echo
(
$mysqli
->errno);
echo
(
$mysqli
->error);
}
//影响条数
echo
(
$mysqli
->affected_rows);
//插入的id
echo
(
$mysqli
->insert_id);
echo
(
$mysqli
);
有结果集
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354$mysqli
= mysqli_init();
$mysqli
->options(MYSQLI_OPT_CONNECT_TIMEOUT, 2);
//设置超时时间
$mysqli
->real_connect(
'127.0.0.1'
,
'root'
,
''
,
'test'
);
$sql
=
"select * from limove as limove_as"
;
$result
=
$mysqli
->query(
$sql
);
if
(
$result
=== false)
{
echo
(
$mysqli
->errno);
echo
(
$mysqli
->error);
}
//行数
echo
(
$result
->num_rows);
//列数
echo
(
$result
->field_count);
//字段个数
echo
(
$result
->field_count);
//获取所有字段的信息
$field_arr
=
$result
->fetch_fields();
//移动字段的指针
$result
->field_seek(1);
//依次获取字段的信息
while
(
$field
=
$result
->fetch_field())
{
echo
(
$field
);
}
//移动记录指针
$result
->data_seek(1);
//一次获取所有数据
$data
=
$result
->fetch_all(MYSQLI_ASSOC);
//关联数组方式获取结果集
$data
=
array
();
$result
->data_seek(0);
//重置指针到起始
while
(
$row
=
$result
->fetch_assoc())
{
$data
[] =
$row
;
}
print_r(
$data
);
$result
->free();
$mysqli
->close();
一次 执行多条语句 multiquery (不推荐使用)
无结果集,此时 affected_rows 只能获取到最后的那条影响的条数
123456789101112131415161718192021$mysqli
= mysqli_init();
$mysqli
->options(MYSQLI_OPT_CONNECT_TIMEOUT, 2);
//设置超时时间
$mysqli
->real_connect(
'127.0.0.1'
,
'root'
,
''
,
'test'
);
$sql_arr
=
array
(
'insert into limove(id,`name`, `order`) values(null, 1, 2)'
,
'insert into limove(id,`name`, `order`) values(null, 1, 222)'
,
'delete from limove where `order` = 2'
,
);
$sql
= implode(
';'
,
$sql_arr
);
$result
=
$mysqli
->multi_query(
$sql
);
if
(
$result
=== false)
{
echo
(
$mysqli
->errno);
echo
(
$mysqli
->error);
}
$mysqli
->close();
有结果集
123456789101112131415161718192021222324252627282930$mysqli
= mysqli_init();
$mysqli
->options(MYSQLI_OPT_CONNECT_TIMEOUT, 2);
//设置超时时间
$mysqli
->real_connect(
'127.0.0.1'
,
'root'
,
''
,
'test'
);
$sql_arr
=
array
(
'show tables'
,
'desc select * from limove'
,
'show create table limove'
,
);
$sql
= implode(
';'
,
$sql_arr
);
$rst
=
$mysqli
->multi_query(
$sql
);
if
(
$rst
=== false)
{
echo
(
$mysqli
->errno);
echo
(
$mysqli
->error);
}
do
{
$result
=
$mysqli
->store_result();
//获取当前光标所在的结果集
$data
=
$result
->fetch_all();
echo
(
$data
);
}
while
(
$mysqli
->next_result());
//光标移动到下一个结果集
$mysqli
->close();
事务处理:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051$mysqli
=
new
mysqli(
"localhost"
,
"root"
,
"123456"
,
"xsphpdb"
);
//事务处理
$mysqli
->autocommit(0);
$error
=true;
$price
=50;
$sql
=
"update zh set ye=ye-{$price} where name='zhangsan'"
;
$result
=
$mysqli
->query(
$sql
);
if
(!
$result
){
$error
=false;
echo
"从张三转出失败<br>"
;
}
else
{
if
(
$mysqli
->affected_rows==0){
$error
=false;
echo
"张三的钱没有变化"
;
}
else
{
echo
"从张三账号中转出成功!<br>"
;
}
}
$sql
=
"update zh set ye=ye+{$price} where name='lisi1'"
;
$result
=
$mysqli
->query(
$sql
);
if
(!
$result
){
$error
=false;
echo
"从李四转入失败<br>"
;
}
else
{
if
(
$mysqli
->affected_rows==0){
$error
=false;
echo
"李四的钱没有变化"
;
}
else
{
echo
"向李四账号中转入成功!<br>"
;
}
}
if
(
$error
){
echo
"转账成功!"
;
$mysqli
->commit();
}
else
{
echo
"转账失败!"
;
$mysqli
->rollback();
}
$mysqli
->autocommit(1);
$mysqli
->close();
mysqli_stmt:mysqli预处理类(推荐):表示了准备好的一个语句,服务器端只编译一次sql
用mysqli和mysqli_result可以实现同样的功能
优点:效率高,适用于语句相同只是数据不同的情况 ,可以阻止sql注入的产生mysqli_stmt示例:非select语句
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354require
'fns.php'
;
//创建mysqli对象方式
$mysqli
= @
new
mysqli(
'127.0.0.1'
,
'root'
,
''
,
'test'
);
//只能用函数来判断是否连接成功
if
(mysqli_connect_errno())
{
echo
mysqli_connect_error();
die
;
}
$mysqli
->set_charset(
'utf8'
);
$sql
=
"insert into limove values(?, ?, ?)"
;
//语句一样值不相同情况
/*
//获取stmt对象
$stmt = $mysqli->stmt_init();
//准备一条sql语句,放到服务器端
$stmt->prepare($sql);
*/
//mysqli中有直接的方法可用
$stmt
=
$mysqli
->prepare(
$sql
);
//绑定参数
$stmt
->bind_param(
'iss'
,
$id
,
$name
,
$order
);
for
(
$i
=0;
$i
<5;
$i
++){
$id
= 0;
$name
=
'name'
;
$order
= mt_rand(1, 1000);
$stmt
->execute();
}
//最后id
echo
(
$stmt
->insert_id);
//影响的行数 注:最后一条执行的
echo
(
$stmt
->affected_rows);
//错误号
echo
(
$stmt
->errno);
//错误信息
echo
(
$stmt
->error);
//stmt对象中可以看到更多的信息
echo
(
$stmt
);
echo
(
$mysqli
);
mysqli_stmt示例:select语句 1
1234567891011121314151617181920212223242526272829303132333435363738394041424344require
'fns.php'
;
//创建mysqli对象方式
$mysqli
= @
new
mysqli(
'127.0.0.1'
,
'root'
,
''
,
'test'
);
//只能用函数来判断是否连接成功
if
(mysqli_connect_errno())
{
echo
mysqli_connect_error();
die
;
}
$mysqli
->set_charset(
'utf8'
);
$sql
=
"select * from limove where id<?"
;
$stmt
=
$mysqli
->prepare(
$sql
);
$stmt
->bind_param(
'i'
,
$i
);
$stmt
->bind_result(
$a
,
$b
,
$c
);
$i
=40;
$stmt
->execute();
//把结果都取过来
$stmt
->store_result();
//获取字段信息
$result
=
$stmt
->result_metadata();
//只能获取一些字段信息
while
(
$field
=
$result
->fetch_field())
{
echo
(
$field
->name);
}
//$stmt->data_seek(2); //移动指针的位置,只有执行 store_result 后才能生效
while
(
$stmt
->fetch()){
echo
(
"{$a}|{$b}|{$c}"
);
}
//记录的条数 ,只有执行 store_result 后才能生效
echo
(
$stmt
->num_rows);
echo
(
$stmt
);
$stmt
->free_result();
$stmt
->close();
mysqli_stmt示例:select语句 2
123456789101112131415161718192021222324252627282930<?php
require
'fns.php'
;
//创建mysqli对象方式
$mysqli
= @
new
mysqli(
'127.0.0.1'
,
'root'
,
''
,
'test'
);
//只能用函数来判断是否连接成功
if
(mysqli_connect_errno())
{
echo
mysqli_connect_error();
die
;
}
$mysqli
->set_charset(
'utf8'
);
$sql
=
"select * from limove where id<?"
;
$stmt
=
$mysqli
->prepare(
$sql
);
$stmt
->bind_param(
'i'
,
$i
);
$stmt
->bind_result(
$a
,
$b
,
$c
);
$i
=40;
$stmt
->execute();
//获取结果
$result
=
$stmt
->get_result();
$data
=
$result
->fetch_all(MYSQLI_ASSOC);
echo
(
$data
);
debug();
阅读(2500) 分享(0)
上一篇: 如何防止被人肉?防人肉宝典——平时上网应该注意什么?
下一篇: 我为什么不喜欢面向对象