博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP 16: MySql的数据库访问
阅读量:5886 次
发布时间:2019-06-19

本文共 5113 字,大约阅读时间需要 17 分钟。

原文:

本章介绍PHP访问MySql的方法。

如果你对MySQL不是很清晰,可以参看。
对于数据库的操作,无非就是以下几个点:

  • 如何连接到数据库
  • 如何执行SQL
  • 如何返回数据结果集
  • 如何从结果集取出数据
  • 关闭连接
 以上就是数据库的常规操作。
对于MySQL而言,由于其版本不同,访问数据库的方法也不同。PHP4有个MySQL一般的访问方法,过程都是以"mysql_"为前缀的。当到了PHP5,除了它,还扩展了这个方法。并且以2种形式表现,一种是面向对象的,一种是以"mysqli_"开头的过程函数。
以下介绍的将分为面向对象以及过程方法来描述。
建立一个连接
面向对象的连接
我们可以用以下语句来建立MySQL的连接
1 
$db
=
new
 mysqli(
'
localhost
'
,
'
root
'
,
'
pwd
'
,
'
mysql
'
);
简单描述以下,这里建立一个mysqli的类,它传入mysql所在的主机名,然后是用户名,用户密码,以及访问的数据库。
过程方法的连接
上面对应的过程方法是
 @ 
$db
=
mysqli_connect
(
'
localhost
'
,
'
root
'
,
'
pwd
'
,
'
mysql
'
);
此函数返回的不是一个对象,而是一个连接数据的资源。如果你使用过程方法,必须将资源传递到mysqli的所有其他函数。
在这里需要说明的是mysqli的大多数过程函数都有一个对应的面向接口。通常情况下,过程函数都是以mysqli_开始的,同时需要传入
mysqli_connect返回的数据库连接资源。
尝试连接的结果需要检查,万一不成功也好做出相应的处理呀。对于此,可以实用mysqli_connect_errno()来处理。
代码可以如下
<?
php
 @ 
$db
=
new
 mysqli
(
'
localhost
'
,
'
root
'
,
'
password
'
,
'
mysql
'
);
 
if
(
mysqli_connect_errno
())
 {
      
echo
 
'
Error: Can not connect to database.
'
;
  }
  
else
  {
      
echo
 
'
Connect to database OK
'
;
  }
  
?>
 
或者
 1  
<?
php
 2 
 @ 
$db
=
mysqli_connect
(
'
localhost
'
,
'
root
'
,
'
password
'
,
'
mysql
'
);
 3 
 
if
(
mysqli_connect_errno
())
 4 
 {
 5 
      
echo
 
'
Error: Can not connect to database.
'
;
 6 
  }
 7 
  
else
 8 
  {
 9 
      
echo
 
'
Connect to database OK
'
;
10 
  }
11 
  
12 
?>
 
mysqli_connect_errno()将返回一个连接数据库出现的错误代码,如果连接成功,返回0.
选择使用的数据库
在SQL里面,我们可以使用如下SQL来选择数据库
use
 mysql
那么在PHP里呢?我们可以使用如下代码:
1 
$db
->
select_db(dbname)
//
dbname为你选择的数据库
或者
1 
mysqli_select_db(db_resource,dbname)
//
db_resource就是前面提到的数据库的连接资源
执行SQL语句
要查询数据库,我们可以使用mysql_query()函数,在进行此操作前最好把你的sql建立以下,例如
$query
=
"
select
 
*
 
from
 bookmark
where
bm_url
like
 
'
abc
'
";
需要说明的一点是,这里不需要在SQL语句后加一个分号,这和在MySQL监视器里是不一样的。
现在我们可以调用以下的方式来执行SQL语句。
$result
=
$db
->
query($query)
以上是面向对象的方法,过程方法可以为:
$result
=
mysqli_qurey($db,$query)
面向对象版本返回一个结果对象,过程版本返回一个资源。无论何种方法,都会降结果保存在一个变量里($result)中,这个函数执行失败,将返回false。Ok,给个实例吧。
 1 
<
?php
 2 
$db 
=
 new mysqli("localhost", "bm_user", "password", "bookmarks");
 3 
 4 
/*
 check connection 
*/
 5 
if
 (mysqli_connect_errno()) {
 6 
   printf("Connect failed: 
%
s\n", mysqli_connect_error());
 7 
   
exit
();
 8 
}
 9 
10 
11 
/*
 Create table doesn't return a resultset 
*/
12 
if
 ($db
->
query("
CREATE
 
TEMPORARY
 
TABLE
 mybookmark 
LIKE
 bookmark") 
===
 TRUE) {
13 
   printf("
Table
 mybookmark successfully created.\n");
14 
}
15 
else
16 
{
17 
    echo 
'
error<br>
'
;
18 
}
19 
20 
$sql
=
"
select
 
*
 
from
 bookmark limit 
10
";
21 
/*
 Select queries return a resultset 
*/
22 
if
 ($result 
=
 $db
->
query($sql)) {
23 
   printf("
Select
 returned 
%
d rows.\n", $result
->
num_rows);
24 
25 
   
/*
 free result set 
*/
26 
   $result
->
close
();
27 
}
28 
29 
if
 ($result 
=
 $db
->
query("
SELECT
 
*
 
FROM
 mybookmark", MYSQLI_USE_RESULT)) {
30 
31 
   
if
 ($db
->
query("
SET
 
@a
:
=
'
this will not work
'
")) {
32 
       printf("Error: 
%
s\n", $db
->
error);
33 
   }
34 
   $result
->
close
();
35 
}
36 
37 
$db
->
close
();
38 
?
>
 
39 
  
40 
或者
ContractedBlock.gif
ExpandedBlockStart.gif
<?php
$db 
= mysqli_connect("localhost", "bm_user", "password", "bookmarks");
/* check connection */
if (mysqli_connect_errno()) {
   printf("Connect failed: 
%s\n", mysqli_connect_error());
   
exit();
}
/* Create table doesn't return a resultset */
if (mysqli_query($db,"CREATE TEMPORARY TABLE mybookmark LIKE bookmark") === TRUE) {
   printf("
Table mybookmark successfully created.\n");
}
else
{
    echo 
'error<br>';
}
$sql
="select * from bookmark limit 10";
/* Select queries return a resultset */
if ($result = mysqli_query($db,$sql)) {
   printf("
Select returned %d rows.\n", $result->num_rows);
   
/* free result set */
    mysqli_free_result($result);
}
if ($result = mysqli_query($db,"SELECT * FROM mybookmark", MYSQLI_USE_RESULT)) {
   
if (mysqli_query($db,"SET @a:='this will not work'")) {
       printf("Error: 
%s\n", $db->error);
   }
   mysqli_free_result($result);
}
mysqli_close($db);
?
> 
  
简单吧。
对查询结果的处理
首先确定结果集的行数。我们可以利用下面的代码实现它。
$num_rows
=
$result
->
num_rows;
$num_rows
=
mysqli_num_rows($result)
得到了结果的行数之后,我们就可以处理每个结果了。例如可以有以下代码:
1 
for
(
$index
=
0
;
$index
<
num_rows;
$index
++
)
2 
{
3 
  
//
Your code here to handle each record.
4 
  
dot.gifdot.gif
5 
}
为了得到每一行,我们可以调用$result->fetch_assoc()函数或者mysqli_fetch_assoc().如果函数没有返回行,循环将会停止执行。可以为:
$row
=
$result
->
fetch_assoc()
$row
=
mysqli_fetch_assoc
(
$result
)
来实现,如果你曾经在VC里用ODBC操作数据库的话,你会发现有些类似。
那么,我想得到每一列值怎么办呢?很简单,调用
$row
[
'
bm_url
'
]
字符串'bm_url'就是列名。
除了上面的方法还有没有其他方法得到每一行呢?还有2种方法:
1) 获取每一行的枚举数组
    可以为  
$row
=
$result
->
fetch_row()
  或  
$row
=
mysqli_fetch_row
(
$result
)
属性值就是每个数组值,例如$row[0],$row[1]等。
2) 还有一种方法就是将每行返回到一个对象里。
  可以为
 
   $row
=
$result
->
fetch_object()
  
或  
$row
=
mysqli_fetch_object
(
$result
)
如果访问个列值,实用$row->username,$row->bm_url
  
断开数据库连接
在前面已经见到了,
结果集的释放:
$result
->
free()
.
或者
mysqli_free_result
(
$result
)
.
数据库的关闭:
$db
->
close()
或者
mysql_close
(
$db
)
使用Prepared语句
 这个功能有点类似.net SqlParameter.
 先举个例子
1 
$insertSql
=
"
Insert into bookmark values(?,?)
"
;
2 
 
$stmt
=
$db
->
prepare(
$insertSql
);
3 
 
$stmt
->
bind_param(
$username
,
$bookmark_url
);
4 
 
$stmt
->
execute();
5 
 
echo
 
$stmt
->
affected_rows
.
'
 bookmarks inserted into database.
'
;
6 
 
$stmt
->
close();
解释一下。
line 1,需要注意的是2个问号。表示每个数据的位置。在C#里确实@+列名。
line 2:调用
$db
->
prepare()构建一个需要处理的资源,过程函数是mysqli_stmt_prepare().
line 3:调用
stmt
->
bind_param将相应的值绑定到相应的位置上。过程函数是mysqli_stmt_bind_param.
line 4:执行语句。
需要注意的是,在PHP5RC2版本里,Windows下执行有时会crash掉,但在unix下却运行正常。

转载地址:http://eqoix.baihongyu.com/

你可能感兴趣的文章
ERP群雄逐鹿市场预测
查看>>
边缘计算如何层次化部署?
查看>>
组织为什么没能采用CI和CD
查看>>
黑客通过控制麦克风窃取乌克兰600GB数据
查看>>
格物斯坦:机器人高手决战申城,IRM开启孩子新视界
查看>>
云智慧运维管理沙龙成功落幕 IT监控成亮点
查看>>
存储器市场经历严冬考验 多元化发展是出路
查看>>
MIT实验室主任:可穿戴设备的大数据梦
查看>>
MySQL 8.0.2复制新特性抢鲜看
查看>>
一篇文章学会spring boot(包括jms和hessian的集成)
查看>>
华南理工章熙春:移动应用推动数字校园
查看>>
Linux下c++程序内存泄漏检测代码范例
查看>>
FIDO联盟拥抱政府监管,全面打造安全可信网络
查看>>
Aruba携手中国电信云南公司共建 “智慧校园”
查看>>
zGlue选择 ASE 作为战略制造合作伙伴,加速物联网市场开发
查看>>
BlackNurse新型DoS攻击 15M流量就可以打瘫思科防火墙 思科做出了回应
查看>>
Linux下的APT攻击工具HDD Rootkit分析
查看>>
Interop 2015:思科为其SDN架构做好安全防护
查看>>
Windows 10中国普及速度慢 原因是盗版难
查看>>
第19届亚太反病毒研究者联盟(AVAR)国际大会开幕在即
查看>>