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>
mysqli 进一步分析的更多相关文章
- traefik的80和443端口占用进一步分析
上一篇文章地址:https://www.cnblogs.com/sanduzxcvbnm/p/14990065.html 建议先看上一篇文章,才更容易理解这篇 1.traefik的deployment ...
- php中数据库连接方式pdo和mysqli对比分析
1)总的比较 PDO MySQLi 数据库支持 12种不同的数据库支持 支持MySQL API OOP OOP + 过程 Connection Easy Easy 命名参数 支持 不支持 对象映射 ...
- 云计算之路-阿里云上:基于Xen的IO模型进一步分析“黑色0.1秒”问题
在发现云服务器读取OCS缓存的“黑色0.1秒”是发生在socket读取数据时,而且是发生在读取开始的字节,甚至在socket写数据时(比如写入缓存key)也会出现超过50ms的情况,我们的好奇心被激发 ...
- 2nd 四人小组项目的进一步分析
组长:林莉 组员:王东涵.宫丽君.胡丽娜 项目选题:车辆管理系统(附加相关员工管理) 项目期限:暂定十周 一.NABCD模型 N-Need 需求分析及相应功能设置 需求概述: 管理库中车辆信息.相关人 ...
- Java多线程,对锁机制的进一步分析
1 可重入锁 可重入锁,也叫递归锁.它有两层含义,第一,当一个线程在外层函数得到可重入锁后,能直接递归地调用该函数,第二,同一线程在外层函数获得可重入锁后,内层函数可以直接获取该锁对应其它代码的控制权 ...
- 『SQL注入』 User-Agent 手工注入的探测与利用分析
原理很简单:后台在接收UA时没有对UA做过滤,也没有PDO进行数据交互(实际PDO是非常有必要的),导致UA中有恶意代码,最终在数据库中执行. Bug 代码: 本地顺手打了一个环境,Bug 代码部分: ...
- 使用VisualVM分析性能
性能分析神器VisualVM VisualVM 是一款免费的,集成了多个 JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序做性能分析和调优.这些功能包括生成和分析海量 ...
- 【php爬虫】百万级别知乎用户数据爬取与分析
代码托管地址:https://github.com/hoohack/zhihuSpider 这次抓取了110万的用户数据,数据分析结果如下: 开发前的准备 安装Linux系统(Ubuntu14.04) ...
- 虚拟 router 原理分析- 每天5分钟玩转 OpenStack(101)
上一节我们创建了虚拟路由器"router_100_101",并通过 ping 验证了 vlan100 和 vlan101 已经连通. 本节将重点分析其中的原理. 首先我们查看控制节 ...
随机推荐
- Ubuntu 12.04 之 虚拟主机的配置
Ubuntu 12.04 之 虚拟主机的配置 (1)打开etc/hosts文件 增加: 127.0.0.1 study.ubuntu.com 127.0.0.1 hello.ubuntu.com 12 ...
- 洛谷 P1555 尴尬的数字
P1555 尴尬的数字 题目背景 Bessie刚刚学会了不同进制数之间的转换,但是她总是犯错误,因为她的两个前蹄不能轻松的握住钢笔. 题目描述 每当Bessie将一个数转换成新的进制时,她总会写错一位 ...
- Maven公共仓库/镜像站收集及使用技巧
查询: 1.http://search.maven.org/ 2.https://mvnrepository.com/ 3.https://maven-repository.com/ 4.(阿里云镜像 ...
- TCP打洞与UDP打洞的差别
为什么网上讲到的P2P打洞基本上都是基于UDP协议的打洞?难道TCP不可能打洞?还是TCP打洞难于实现? 如果如今有内网clientA和内网clientB.有公网服务端S. 如果A和B ...
- windows 7 忘記密碼,用“带命令行的安全模式”
net user administrator /active:yes net user tester /add net localgroup administrators tester /add
- C - The C Answer (2nd Edition) - Exercise 1-8
/* Write a program to count blanks, tabs, and newlines. */ #include <stdio.h> /* count blanks, ...
- swift编程语言基础教程 中文版
swift编程语言基础教程 中文版 http://download.csdn.net/detail/u014036026/7845491
- git基础之创建ssh公钥和密钥
用git管理过程中,不想每次输入username和password.解决的方法例如以下; 1 . 链接换成ssh协议. 2 . 生成公钥. 3. 加入ssh公钥到gitserver. 打开gitbas ...
- 基于Canvas的Char.js库使用
Chart.js是基于Html5 Canvas的图表库. 官网:http://www.chartjs.org/ 參考文档:http://www.chartjs.org/docs/ 支持六种图表,相应源 ...
- easyUI datagrid 前端真分页
前文再续,书接上一回.easyUI datagrid 前端假分页 http://blog.csdn.net/leftfist/article/details/43164977 真分页是easyUI d ...