7天入门php-MySQL数据库

一、PHP 对MySQL的基本操作

因为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,所以创建连接时不必指定端口!而其它几个默认值都没有指定,因为考虑了安全因素,所以一般都在代码中动态设置。
示例:(对象方式)

<?php
$conn=new mysqli('localhost','root','1234','mydb');
if($conn){
	echo "连接成功:".$conn->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结构及数据为:


基本测试代码:

<?php
$conn=new mysqli("localhost","root","2507","test");
if(!$conn->connect_errno)//连接成功
{
	echo "数据库连接成功:<br/>";
	$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']."<br/>";
	}
}
else
{
	echo "数据库连接失败";
}
?>
<!doctype html>
<html>
<head>
<title>测试数据库</title>
<meta charset="utf-8">
</head>
</html>

浏览器结果:


几点注意事项:

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

2)、php脚本使用"\n"无法换行,应使用换行标签<br/>。

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 “数据库连接成功:<br/>” 的下一行加入下列测试代码:

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."<br/>";

再次刷新浏览器,浏览器结果将为:


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

注意事项:
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。











  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值