未加星标

7天入门php-MySQL数据库

字体大小 | |
[开发(php) 所属分类 开发(php) | 发布者 店小二05 | 时间 2016 | 作者 红领巾 ] 0人收藏点击收藏

phpmysql的基本操作

因为MySQL 扩展函数库不建议使用,取而代之的是MySQLi (加强的MySQL 库),所以下面的是MySQLi 库的基础知识。

1、连接数据库

面向对象方式:

$mysqli = new mysqli("localhost", "user", "password", "database",port);
面向过程方式:
$mysqli = mysqli("localhost", "user", "password", "database",port);
说明:

因为MySQL 服务器支持从不同转换层进行连接的使用,所以可通过TCP/IP、Unix domain sockets (或windows命名的管道(pipes))连接MySQL数据库。使用localhost实际是使用Unix domain sockets方式,而要使用TCP/IP 方式必须将localhost换成127.0.0.1(若连接本地数据库)。

PHP INI 配置:

mysqli.default_host=
mysqli.default_user=
mysqli.default_pw=
mysqli.default_port=3306
mysqli.default_socket=
默认端口为3306,所以创建连接时不必指定端口!而其它几个默认值都没有指定,因为考虑了安全因素,所以一般都在代码中动态设置。
示例:(对象方式)
host_info;
}
else
echo "连接失败".$conn->connect_error;
?>
说明:连接成功时输出:连接成功:localhost via TCP/IP 。(与文档描述不太相符,文档中为localhost via Unix socket)

2、执行语句

说明:

mysqli_开头的函数为面向过程风格,如mysqli_query(),而对应的面对对象风格不包含mysqli_,对应为query()。

常用函数:

1)、mysqli_query([mysqli $link,]string $query [, int $resultmode = MYSQLI_STORE_RESULT ]):直接返回结果集。有$link则为过程化风格。

最普通和常用的函数,可执行任何SQL 语句,执行DDL 语句时返回boolean表明是否操作成功,执行SELECT 语句返回结果集。

特点:

——>能用缓冲的结果集(Buffered result sets)组合执行语句。所谓缓冲的结果集,即语句执行后结果能立即被客户端缓存或被读取,而组合执行即是执行语句只进行一次调用。(个人理解,此函数尽可能少的请求服务器,从而使用缓存将执行语句的方式,一次性执行多条SQL 语句)

——>此函数相当于在mysqli_store_result()函数后执行mysqli_rea_query()。

2)、mysqli_real_query([mysqli $link ,] string $query) :执行后调用mysqli_use_result()获取结果集。$link同样为过程化时的连接句柄。

执行查询语句。

特点:

——>使用未缓存的结果集,真正的查询。适用于客户端资源短缺,或没必要尽可能早地释放服务器资源以保持服务器的较低负载的情况下。

——>在所有记录(rows)被读取之前,不能通过结果集进行滚动(scrolling)。

示例:对象风格

3)、mysqli_multi_query([$link,] $query) :若有多个查询语句,则可取多个结果集。有$link时为过程化风格,$link指连接数据库的资源类型。

执行多个SQL 查询语句。执行后通过mysqli_use_result() 或 mysqli_store_result()取第一个查询的结果集;对于后面的结果集,可通过mysqli_more_results() 与 mysqli_next_result()判断再取回结果集。

示例:对象风格(函数调用与过程化风格有区别,如参数个数 ,具体看文档)

$query = "SELECT CURRENT_USER();"; //第一个查询
$query .= "SELECT Name FROM City ORDER BY ID LIMIT 20, 5"; //第二个查询
/* execute multi query */
if ($mysqli->multi_query($query)) {
do {
/* store first result set */
if ($result = $mysqli->store_result()) { //mysqli_store_result()或mysqli_use_result()获取结果集while ($row = $result->fetch_row()) { //通过mysqli_fetch_row()循环获取每条记录 printf("%s\n", $row[0]);}$result->free(); //释放当前结果集
}
/* print divider */
if ($mysqli->more_results()) { //mysqli_more_result()判断printf("-----------------\n");
}
} while ($mysqli->next_result()); //应该是更新结果集指针,指向下一个结果集
}

上三个函数查询结果值的类型说明:

At the level of the MySQL Client Server Protocol, the command COM_QUERY and the text protocol are used for statement execution. text protocol 用于在服务器端发送上面三个函数的结果前,将其转换成string类型,而客户端不会对接收的结果再转换回数据的原始类型,即接收到的所有值都是PHP string类型。可通过PHP gettype()检查类型。

全部使用示例:

http://php.net/manual/zh/mysqli.quickstart.statements.php

3、其它常用函数与属性

第2点重点列出了对象化风格中查询函数及查询结果集的获取方式,而对于结果集中的数据的获取,还需要结果集对象的一些常用函数与属性:

1)、num_rows:属性。为记录集的记录条数。

2)、data_seek($row_number):函数,无返回。设置记录指针为$row_number指定的值(指针从0开始)。顺序取出记录时,不须调用。

3)、fetch_assoc():函数,返回数组,数组索引为列名。取得记录指针处的记录数据。必须调用。

示例:

数据库test中表testtable结构及数据为:


7天入门php-MySQL数据库

基本测试代码:

connect_errno)//连接成功
{
echo "数据库连接成功:
";
$sets=$conn->query("SELECT id ,numb FROM testtable");
for($numb=0;$numb<$sets->num_rows;$numb++)
{
$sets->data_seek($numb);//此处可省,因为顺序取出
$row=$sets->fetch_assoc();
echo "id:".$row['id']." number:".$row['numb']."
";
}
}
else
{
echo "数据库连接失败";
}
?>

浏览器结果:


7天入门php-MySQL数据库
几点注意事项:

1)、结果集返回的数组的索引为列名,列名不存在时提示没有此属性错误;

2)、php脚本使用"\n"无法换行,应使用换行标签

4、预编译执行

Java中的数据库编程有预编译执行方法(PreparedStatement,见MySQL 类相关笔记),PHP 中同样有此功能,该功能由mysqli_prepare()函数提供。

mysqli_prepare(string $query):

于编译SQL 语句,并返回一个PreparedStatement对象,也可用于执行所有SQL 语句(不是目的),对于没有不确定的值,无须绑定参数。

分两阶段执行语句:

阶段一:预编译SQL 语句

if (!($stmt = $mysqli->prepare("INSERT INTO test(id) VALUES (?)"))) {
echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
阶段二:具体赋值并execute

相关函数:预编译指令对象的bind_param()与execute()函数。

在第3点的基本测试代码的echo “数据库连接成功:
” 的下一行加入下列测试代码:
if ($stmt = $conn->prepare("INSERT INTO testtable(id,numb) VALUES (?,?)")) {
$tid=2;
$tnumb=30;
$tid2=3;
$tnumb2=40;
$stmt->bind_param("ii",$tid,$tnumb);//“ii”对应两个不确定值,类型都为整形。后面的参数必须为变量。
$stmt->execute();
$stmt->bind_param("ii",$tid2,$tnumb2);
$stmt->execute();
}
else
echo "预编译失败: (" . $conn->errno . ") " . $conn->error."
";
再次刷新浏览器,浏览器结果将为:
7天入门php-MySQL数据库

可见执行了两次插入记录操作。

注意事项:
1)、同java中一样,每一组赋值紧接着一次execute();

2)、函数赋值形式与java中不同之处在于,bind_param函数的第一个字符串指定后面变量的类型(i:integer,d:double,s:string,b:blob),如“is”表明后面有两个参数,类型分别为整形与字符串类型。不能用常量进行赋值(与java不同)!

说明:PreparedStatement对象:php中bind_param()方法与execute()方法分别对应java中setString()方法与executeUpdate()方法,但设置参数的两个方法参数个数与含义有区别。

5、关闭连接

mysqli_close([myslqi $link]):关闭打开的数据库连接,当然脚本结束时,连接会自动关闭。$link参数仅对过程化风格。返回boolean型。

6、其它说明

PHP中的MySQL 扩展函数(或所有扩展函数)大都成功时返回对象或TRUE,失败时返回FALSE,所以几乎都可用作条件判断。如上面的prepare()成功时返回PreparedStatement对象,失败时返回FALSE,bind_param()返回TRUE或FALSE。

本文开发(php)相关术语:php代码审计工具 php开发工程师 移动开发者大会 移动互联网开发 web开发工程师 软件开发流程 软件开发工程师

主题: SQLMySQLPHP服务器数据浏览器Java数据库CUSU
分页:12
转载请注明
本文标题:7天入门php-MySQL数据库
本站链接:http://www.codesec.net/view/480106.html
分享请点击:


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 开发(php) | 评论(0) | 阅读(42)