mysqli 进一步分析
1.
一、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(对象方式):
$conn = new mysqli('localhost', 'user', 'password','data_base'); //要使用new操作符,最后一个参数是直接指定数据库
//假如构造时候不指定,那下一句需要$conn -> select_db('data_base')实现
$result = $conn -> query( 'select * from data_base' );
$row = $result -> fetch_row(); //取一行数据
echo row[0]; //输出第一个字段的值
使用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()方法,则连接标识是必需的。
2.
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
例如五子棋,面向过程的设计思路就是首先分析问题的步骤:1、开始游戏,2、黑子先走,3、绘制画面,4、判断输赢,5、轮到白子,6、绘制画面,7、判断输赢,8、返回步骤2,9、输出最后结果。把上面每个步骤用分别的函数来实现,问题就解决了。
而面向对象的设计则是从另外的思路来解决问题。整个五子棋可以分为 1、黑白双方,这两方的行为是一模一样的,2、棋盘系统,负责绘制画面,3、规则系统,负责判定诸如犯规、输赢等。第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的i变化就要负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。
可以明显地看出,面向对象是以功能来划分问题,而不是步骤。同样是绘制棋局,这样的行为在面向过程的设计中分散在了总多步骤中,很可能出现不同的绘制版本,因为通常设计人员会考虑到实际情况进行各种各样的简化。而面向对象的设计中,绘图只可能在棋盘对象中出现,从而保证了绘图的统一。
功能上的统一保证了面向对象设计的可扩展性。比如我要加入悔棋的功能,如果要改动面向过程的设计,那么从输入到判断到显示这一连串的步骤都要改动,甚至步骤之间的循序都要进行大规模调整。如果是面向对象的话,只用改动棋盘对象就行了,棋盘系统保存了黑白双方的棋谱,简单回溯就可以了,而显示和规则判断则不用顾及,同时整个对对象功能的调用顺序都没有变化,改动只是局部的。
再比如我要把这个五子棋游戏改为围棋游戏,如果你是面向过程设计,那么五子棋的规则就分布在了你的程序的每一个角落,要改动还不如重写。但是如果你当初就是面向对象的设计,那么你只用改动规则对象就可以了,五子棋和围棋的区别不就是规则吗?(当然棋盘大小好像也不一样,但是你会觉得这是一个难题吗?直接在棋盘对象中进行一番小改动就可以了。)而下棋的大致步骤从面向对象的角度来看没有任何变化。
当然,要达到改动只是局部的需要设计的人有足够的经验,使用对象不能保证你的程序就是面向对象,初学者或者很蹩脚的程序员很可能以面向对象之虚而行面向过程之实,这样设计出来的所谓面向对象的程序很难有良好的可移植性和可扩展性。
3.
mysql_fetch_* 列函数
mysql_fetch_* 列函数的主要功能是从查询返回的结果集中取得相关的查询结果,主要包括:
- mysql_fetch_array():从结果集中取得一行作为关联数组或索引数组,或二者兼有
- mysql_fetch_row():从结果集中取得一行作为枚举数组
- mysql_fetch_assoc():从结果集中取得一行作为关联数组
- mysql_fetch_object():从结果集中取得一行作为对象
- mysql_fetch_field():从结果集中取得字段信息并作为对象返回
- mysql_fetch_lengths():取得结果集中取得一行每个字段内容输出的长度
- mysql_fetch_array()
mysql_fetch_array() 函数用于从结果集中取得一行作为关联数组或索引数组,或二者兼有。成功返回一个数组,否则返回 FALSE 。
语法:
1
|
array mysql_fetch_array( resource result [, int result_type] ) |
新版本说明:【mysqli-result.fetch-array】
http://www.php.net/manual/en/mysqli-result.fetch-array.php
参数说明:
- result:查询函数(如 mysql_query)返回的数据集资源
- result_type:可选常量,标明数组结果类型,可接受值如下:
- MYSQL_BOTH:默认,得到一个同时包含关联和数字索引的数组,用字段名作为键名
- MYSQL_ASSOC:只得到关联索引的数组
- MYSQL_NUM:只得到数字索引的数组
例子 1 ,使用 MYSQL_NUM :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<?php $conn = @mysql_connect( "localhost" , "root" , "root123" ); if (! $conn ){ die ( "连接数据库失败:" . mysql_error()); } mysql_select_db( "test" , $conn ); mysql_query( "set character set 'gbk'" ); $result = mysql_query( "SELECT uid,username FROM user" ); while ( $row = mysql_fetch_array( $result , MYSQL_NUM)){ echo "用户ID:" . $row [0]. "<br />" ; echo "用户名:" . $row [1]. "<br />" ; } ?> |
浏览器输出:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
用户ID:1 用户名:admin 用户ID:2 用户名:小明 用户ID:3 用户名:Jack 用户ID:4 用户名:小王 |
例子 2 ,使用 MYSQL_ ASSOC :
1
2
3
4
5
6
|
//重复代码省略 $result = mysql_query( "SELECT uid,username FROM user" ); while ( $row = mysql_fetch_array( $result , MYSQL_ ASSOC)){ echo "用户ID:" . $row [ 'uid' ]. "<br />" ; echo "用户名:" . $row [ 'username' ]. "<br />" ; } |
浏览器输出内容同上。
当使用 MYSQL_BOTH 或省略该参数是,将同时具有 MYSQL_NUM 与 MYSQL_ ASSOC 的特性。
说明
本函数返回的字段名作为数组键值是区分大小写的
用 mysql_fetch_array() 并不明显 比用 mysql_fetch_row() 慢,而且还提供了明显更多的值
该函数只从当前数据指针取得一行数据作为结果返回,如果执行过一次,会将数据指针指向下一列数据
如果要取得多行或者全部数据,需要使用循环结构将数据逐行取出
如果结果中的两个或以上的列具有相同字段名,最后一列将优先。要访问同名的其它列,必须用该列的数字索引或给该列起个别名
mysql_fetch_row()
PHP 的 MySQL 操作函数 mysql_fetch_row() 用于从结果集中取得一行作为枚举数组。成功返回一个数组,否则返回 FALSE 。
语法:
1
|
array mysql_fetch_row( resource result ) |
该函数表现与 mysql_fetch_array( resource result, MYSQL_NUM ) 一致,请参考mysql_fetch_array() 函数用法,在此不在赘述。
新版本说明:【mysqli-result.fetch-row】
http://php.net/manual/zh/mysqli-result.fetch-row.php
mysql_fetch_object()
PHP 操作 MySQL 的函数 mysql_fetch_object() 用于从结果集中取得一行作为对象,成功返回一个对象,否则返回 FALSE 。
语法:
1
|
object mysql_fetch_object( resource result ) |
例子:
新版本说明:【mysqli-result.fetch-object】
http://php.net/manual/en/mysqli-result.fetch-object.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<?php $conn = @mysql_connect( "localhost" , "root" , "root123" ); if (! $conn ){ die ( "连接数据库失败:" . mysql_error()); } mysql_select_db( "test" , $conn ); mysql_query( "set character set 'gbk'" ); $result = mysql_query( "SELECT uid,username FROM user" ); while ( $row = mysql_fetch_object( $result )){ echo "用户ID:" . $row ->uid. "<br />" ; echo "用户名:" . $row ->username. "<br />" ; } ?> |
浏览器输出:
1
2
3
4
5
6
7
8
|
用户ID:1 用户名:admin 用户ID:2 用户名:小明 用户ID:3 用户名:Jack 用户ID:4 用户名:小王 |
<?php
$conn= new mysqli('localhost','root','','PXSCJ2'); //连接服务器,要连接的数据库
if (mysqli_connect_errno($conn))
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
mysqli_set_charset($conn, "utf8"); //将字符集设为uft8
mysqli_close($conn);
session_start(); //启动SESSION
//$number=@$_POST['StuNumber']; //获取学号值
//$_SESSION['number']=$number; //将学号值传给其他页面
$number=2001;
$sql="select * from XSB where XH='$number'"; //查找该学生信息
$conn= new mysqli('localhost','root','','PXSCJ2');
//$result=mysql_query($sql);
//$row=mysql_fetch_array($result);
$result=mysqli_query($conn,$sql);
while ($row= $result->fetch_object()){ //use while query in fetch_object
if(($number!==NULL)&&(!$row)) //判断学号是否已经存在
echo "<script>alert('此学号不存在')</script>";
$timeTemp=strtotime($row->CSSJ); //将日期时间解析为UNIX时间戳
$time=date("Y-n-j",$timeTemp); //用date函数将时间转换为“年-月-日”形式
}
?>
P2.PHP
<?php
$conn= new mysqli('localhost','root','','PXSCJ2'); //连接服务器,要连接的数据库
if (mysqli_connect_errno($conn))
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
mysqli_set_charset($conn, "utf8"); //将字符集设为uft8
mysqli_close($conn);
session_start(); //启动SESSION
//$number=@$_POST['StuNumber']; //获取学号值
//$_SESSION['number']=$number; //将学号值传给其他页面
$number=2001;
$sql="select * from XSB where XH='$number'"; //查找该学生信息
$conn= new mysqli('localhost','root','','PXSCJ2');
//$result=mysql_query($sql);
//$row=mysql_fetch_array($result);
$result=mysqli_query($conn,$sql);
$row= $result->fetch_array(MYSQLI_ASSOC); //no use while query in fetch_array
if(($number!==NULL)&&(!$row)) //判断学号是否已经存在
echo "<script>alert('此学号不存在')</script>";
$timeTemp=strtotime($row['CSSJ']); //将日期时间解析为UNIX时间戳
$time=date("Y-n-j",$timeTemp); //用date函数将时间转换为“年-月-日”形式
?>
p3:
if(@$_POST["b"]=='添加')
{
test($num,$name,$checkbirthday,$tmp_file); //检查表单内容
$s_sql="select XH from XSB where XH='$num'";//查找该学生信息
$s_result=mysqli_query($conn,$s_sql);
$s_row=$s_result->fetch_array(MYSQLI_ASSOC); //mysql_fetch_array($s_result);
if($s_row) //若要添加的学号已经存在则提示无法添加
echo "<script>alert('学号已存在,无法添加!');location.href='AddStu.php';</script>";
else
{
if(!$tmp_file) //若未上传图片则不向ZP列插入内容
{
$insert_sql="insert into XSB(XH,XM,XB,CSSJ,ZY,ZXF,BZ) values('$num','$name',$sex,'$birthday','$project',0,'$note')";
}
else
{
$insert_sql="insert into XSB(XH,XM,XB,CSSJ,ZY,ZXF,BZ,ZP) values('$num','$name',$sex,'$birthday','$project',0,'$note','$picture')";
}
$insert_result=mysqli_query($conn,$insert_sql);
if(mysqli_affected_rows($conn)!=0)
echo "<script>alert('添加成功!');location.href='AddStu.php';</script>";
else
echo "<script>alert('添加失败,请检查输入信息!');location.href='AddStu.php';</script>";
}
}
//单击【删除】按钮
if(@$_POST["b"]=='删除')
{
if($num==NULL)
{
echo "<script>alert('请输入要删除的学号!');location.href='AddStu.php';</script>";
}
else
{
$d_sql="select XH from XSB where XH='$num'"; //查找该学生信息
$d_result=mysqli_query($conn,$d_sql);
$d_row=$d_result->fetch_array(MYSQLI_ASSOC); //mysql_fetch_array($d_result);
if(!$d_row) //学号如果不存在则提示
echo "<script>alert('学号不存在,无法删除!');location.href='AddStu.php';</script>";
else
{
$del_sql="delete from XSB where XH='$num'";
$del_result=mysqli_query($conn,$del_sql) or die('删除失败!');
if($del_result)
echo "<script>alert('删除学号".$num."成功!');location.href='AddStu.php';</script>";
}
}
}
?>
p4:
<?php
require "fun.php";
$kc_sql="select distinct KCM from KCB"; //查找课程名
$conn= new mysqli('localhost','root','','PXSCJ2');
$kc_result=mysqli_query($conn,$kc_sql); ///* Select queries return a resultset */
//var_dump($kc_result);
while ($kc_row= $kc_result->fetch_array(MYSQLI_ASSOC)) // * fetch array */
{
echo "<option>".$kc_row['KCM']."</option>"; //输出课程名到下拉框中
}
?>
</select>
</td>
<td width="60" class="STYLE1" bgcolor="#CCCCCC">专业:</td>
<td width=50>
<select name="ZYName" class="STYLE1" >
<option value="请选择">请选择</option>
<?php
$zy_sql="select distinct ZY from XSB"; //查找专业
$zy_result=mysqli_query($conn,$zy_sql); //* Select queries return a resultset */
while($zy_row=$zy_result->fetch_array(MYSQLI_ASSOC)) //* fetch array */
{
echo "<option>".$zy_row['ZY']."</option>"; //输出专业名到下拉框中
}
?>
</select>
</td>
<td width="60" align="center">
<input type="submit" name="Query" class="STYLE1" value="查询">
</td>
</tr>
</table>
</form>