一、mysql与mysqli的概念相关:
1、mysql与mysqli都是php方面的函数集,与mysql数据库关联不大。
2、 在php5版本之前,一般是用php的mysql函数去驱动mysql数据库的,比如mysql_query()的函数,属于面向过程3、在php5版本 以后,增加了mysqli的函数功能,某种意义上讲,它是mysql系统函数的增强版,更稳定更高效更安全,与mysql_query()对应的有 mysqli_query(),属于面向对象,用对象的方式操作驱动mysql数据库
二、mysql与mysqli的区别:
1、mysql是非持继连接函数,mysql每次链接都会打开一个连接的进程。
2、mysqli是永远连接函数,mysqli多次运行mysqli将使用同一连接进程,从而减少了服务器的开销。mysqli封装了诸如事务等一些高级操作,同时封装了DB操作过程中的很多可用的方法。
三、mysql与mysqli的用法:
1:mysql(过程方式):
$conn = mysql_connect(‘localhost‘, ‘user‘, ‘password‘); //连接mysql数据库
mysql_select_db(‘data_base‘); //选择数据库
$result = mysql_query(‘select * from data_base‘);//第二个可选参数,指定打开的连接
$row = mysql_fetch_row( $result ) ) //只取一行数据
echo $row[0]; //输出第一个字段的值
PS:mysqli以过程式的方式操作,有些函数必须指定资源,比如mysqli_query(资源标识,SQL语句),并且资源标识的参数是放在前面的,而mysql_query(SQL语句,‘资源标识‘)的资源标识是可选的,默认值是上一个打开的连接或资源。
2、mysqli(对象方式):
一. 建立和断开连接
与MySQL数据库交互时,首先要建立连接,最后要断开连接,这包括与服务器连接并
选择一个数据库,以及最后关闭连接。与mysqli几乎所有的特性一样,这一点可以使用面向
对象的方法来完成,也可以采用过程化的方式完成。
1.创建一个mysqli的对象
$_mysqli = new mysqli();
2.连接MySQL的主机、用户、密码、数据库
$_mysqli->connect(‘localhost‘,‘root‘,‘yangfan‘,‘guest‘);
3.创建带连接参数的mysqli对象
$_mysqli = new mysqli(‘localhost‘,‘root‘,‘yangfan‘,‘guest‘);
4.单独选择数据库
$_mysqli->select_db(‘testguest‘);
5.断开MySQL
$_mysqli->close();
二. 处理连接错误
如果无法连接MySQL数据库,那么这个页面不太可能继续完成预期的工作。因此,一
定要注意监视连接错误并相应地做出反应。 Mysqli扩展包含有很多特性可以用来捕获错误信
息,例如:mysqli_connect_errno()和mysqli_connect_error()方法。
mysqli_connect_errno()函数返回连接数据库返回的错误号。
Mysqli_connect_error()函数返回连接数据库返回的错误代码。
if (mysqli_connect_errno()) {
echo ‘数据库连接错误,错误信息:‘.mysqli_connect_error();
exit();
}
errno属性返回数据库操作时的错误号。
error属性返回数据库操作时的错误代码。
if ($_mysqli->errno) {
echo ‘数据库操作时发生错误,错误代码是:‘.$_mysqli->error;
}
三. 与数据库进行交互
绝大多数查询都与创建(Creation)、获取(Retrieval)、更新(Update)和删除(Deletion)任
务有关,这些任务统称为CRUD。
1.获取数据
网页程序大多数工作都是在获取和格式化所请求的数据。为此,要向数据库发送
SELECT查询,再对结果进行迭代处理,将各行输出给浏览器,并按照自己的要求输出。
//设置一下编码utf8
$_mysqli->set_charset("utf8");
//创建一句SQL语句
$_sql = "SELECT * FROM tg_user";
//执行sql语句把结果集赋给$_result
$_result = $_mysqli->query($_sql);
//将结果集的第一行输出
print_r($_result->fetch_row());
//释放查询内存(销毁)
$_result->free();
2.解析查询结果
一旦执行了查询并准备好结果集, 下面就可以解析获取到的结果行了。 你可以使用多个
方法来获取各行中的字段, 具体选择哪一个方法主要取决于个人喜好, 因为只是引用字段的
方法有所不同。
将结果集放到对象中
由于你可能会使用mysqli的面向对象的语法, 所以完全可以采用面向对象的方式管理结
果集。可以使用fetch_object()方法来完成。
//将结果集包装成对象
$_row = $_reslut->fetch_object();
//输出对象中的一个字段(属性)
echo $_row->tg_username;
//遍历所有的用户名称
while (!!$_row = $_reslut->fetch_object()) {
echo $_row->tg_username.‘ <br /> ‘;
}
使用索引数组和关联数组
//将结果集包装成数组(索引+关联)
$_row = $_reslut->fetch_array();
//输出下标是3的字段(属性)
echo $_row[3];
//将结果集包装成索引数组
$_row = $_reslut->fetch_row();
echo $_row[3];
//将结果集包装成关联数组
$_row = $_reslut->fetch_assoc();
echo $_row[‘tg_username‘];
3.确定所选择的行和受影响的行
通常希望能够确定SELECT查询返回的行数,或者受INSERT、UPDATE或DELET查询
影响的行数。我们可以使用num_rows和affected_rows两个属性
//当使用查询时,想了解SELECT查询了多少行,可以使用num_rows。
echo $_reslut->num_rows;
//当使用查询时,想了解SELECT、INSERT、UPDATE、DELETE查询时影响的行
数,可以使用affected_rows;注意,它是$_mysqli下的属性
echo $_mysqli->affected_rows;
4.移动指针的操作和获取字段
当你并不想从第一条数据开始获取, 或者并不想从第一个字段获取, 你可以使用数据指
针移动或者字段指针移动的方式调整到恰当的位置。 当然, 你还可以获取字段的名称及其相
关的属性。
//计算有多少条字段
echo $_reslut->field_count;
//获取字段的名称
$_field = $_reslut->fetch_field();
echo $_field->name;
//遍历字段
while (!!$_field = $_reslut->fetch_field()) {
echo $_field->name.‘<br />‘;
}
//一次性取得字段数组
print_r($_reslut->fetch_fields());
//移动数据指针
$_reslut->data_seek(5);
//移动字段指针
$_reslut->field_seek(2);
5.执行多条SQL语句
有的时候, 我们需要在一张页面上同时执行多条SQL语句, 之前的方法就是分别创建多
个结果集然后使用。但这样资源消耗很大,也不利于管理。 PHP提供了执行多条SQL语句
的方法$_mysqli->multi_query();
//创建多条SQL语句
$_sql .= "SELECT * FROM tg_user;";
$_sql .= "SELECT * FROM tg_photo;";
$_sql .= "SELECT * FROM tg_article";
//开始执行多条SQL语句
if ($_mysqli->multi_query($_sql)) {
//开始获取第一条SQL语句的结果集
$_result = $_mysqli->store_result();
print_r($_result->fetch_array());
//将结果集指针移到下一个
$_mysqli->next_result();
$_result = $_mysqli->store_result();
print_r($_result->fetch_array());
$_mysqli->next_result();
$_result = $_mysqli->store_result();
print_r($_result->fetch_array());
} else {
echo ‘sql语句有误!‘;
}
6.执行数据库事务
事务(transaction)是作为整个一个单元的一组有序的数据库操作。如果一组中的所有操
作都成功,则认为事务成功,即使只有一个失败操作,事务也不成功。如果所有操作成功完
成,事务则提交(commit),其修改将作用于所有其他数据库进程。如果一个操作失败,则事
务将回滚(roll back),该事务所有操作的影响都将取消。
首先,您的MySQL是InnoDB或BDB引擎的一种,一般来说,你安装了AppServ的集成
包, 你选择InnoDB的引擎的数据库即可。 如果你建立的表不是InnoDB, 可以在phpmyadmin
里修改。
//首先你必须关闭自动提交数据
$_mysqli->autocommit(false);
//创建一个SQL语句,必须同时运行成功,不能出现一个成功,一个失败
$_sql .= "UPDATE tg_friend SET tg_state=tg_state+5 WHERE tg_id=1;";
$_sql .= "UPDATE tg_flower SET tg_flower=tg_flower-5 WHERE tg_id=1;";
//执行两条SQL语句
if ($_mysqli->multi_query($_sql)) {
//获取第一条SQL一影响的行数
$_success = $_mysqli->affected_rows == 1 ? true : false;
//下移,第二条SQL
$_mysqli->next_result();
//获取第二条SQL影响的行数
$_success2 = $_mysqli->affected_rows == 1 ? true : false;
//判断是否都正常通过了,两个SQL
if ($_success && $_success2) {
$_mysqli->commit();
echo ‘完美提交!‘;
} else {
$_mysqli->rollback();
echo ‘程序出现异常!‘;
}
} else {
echo "SQL语句有误:".$_mysqli->errno.$_mysqli->error;
}
//最后还必须开启自动提交
$_mysqli->autocommit(true);
使用new mysqli(‘localhost‘, usenamer‘, ‘password‘, ‘databasename‘);会报错,提示如下:
Fatal error: Class ‘mysqli‘ not found in ...
一般是mysqli是没有开启的,因为mysqli类不是默认开启的,win下要改php.ini,去掉php_mysqli.dll前的;,linux下要把mysqli编译进去。
四、mysql_connect()与mysqli_connect()
1.使用mysqli,可以把数据库名称当作参数传给mysqli_connect()函数,也可以传递给mysqli的构造函数;
2.如果调用mysqli_query()或mysqli的对象查询query()方法,则连接标识是必需的。