使用PHP连接MySQL数据库——查询
最近在学习《PHP和MySQL Web开发》这本书,下面简单介绍一下如何使用PHP连接MySQL数据库并进行查询。
先贴代码,再逐句进行解释:
//search.html
<html>
<head>
<title>Book-O-Rama Catalog Search</title>
</head>
<body>
<h1>Book-O-Rama Catalog Search</h1>
<form action="results.php" method="post">
Choose Search Type:<br />
<select name="searchtype">
<option value="author">Author
<option value="title">Title
<option value="isbn">ISBN
</select>
<br />
Enter Search Term:<br />
<input name="searchterm" type="text" size="40">
<br />
<input type="submit" name="submit" value="Search">
</form>
</body>
</html>
首先先建立一个search.html界面如下:
其中包含表单results.php如下,当点击serch.html页面中的"Search"按钮时,页面将跳转到results.php页面。
//results.php
<html>
<head>
<title>Book-O-Rama Search Results</title>
</head>
<body>
<h1>Book-O-Rama Search Results</h1>
<?php
// create short variable names
$searchtype=$_POST['searchtype'];
$searchterm=trim($_POST['searchterm']); //trim()除去字符串首尾的空白
if (!$searchtype || !$searchterm) {
echo 'You have not entered search details. Please go back and try again.';
exit;
}
if (!get_magic_quotes_gpc()){
$searchtype = addslashes($searchtype);
$searchterm = addslashes($searchterm);
}
@ $db = new mysqli('localhost', 'bookorama', 'bookorama123', 'books');
//host user_name password database
if (mysqli_connect_errno()) { //返回上次连接调用的错误代码(检查)
echo 'Error: Could not connect to database. Please try again later.';
exit;
}
$query = "select * from books where ".$searchtype." like '%".$searchterm."%'";
$result = $db->query($query); //发送一条SQL查询
$num_results = $result->num_rows; //返回记录行的行数
echo "<p>Number of books found: ".$num_results."</p>";
for ($i=0; $i <$num_results; $i++) {
$row = $result->fetch_assoc();
echo "<p><strong>".($i+1).". Title: ";
echo htmlspecialchars(stripslashes($row['title']));
//htmlspecialchars — 将特殊字符转换为 HTML 实体
//stripslashes — 反引用一个引用字符串(即去除转义反斜线)
echo "</strong><br />Author: ";
echo stripslashes($row['author']);
echo "<br />ISBN: ";
echo stripslashes($row['isbn']);
echo "<br />Price: ";
echo stripslashes($row['price']);
echo "</p>";
}
$result->free(); //释放结果集
$db->close(); //关闭数据库连接
?>
</body>
</html>
基本步骤
上面的result.php遵循以写5个步骤,这也是任何从web访问数据库的脚本都应遵循的步骤:
- 检查并过滤来自用户的数据
- 建立一个到适当数据库的连接
- 查询数据库
- 获取查询结果
- 将这些结果显示给用户
1.检查并过滤来自用户的数据
$searchtype=$_POST['searchtype'];
$searchterm=trim($_POST['searchterm']);
这两句的作用是把html表单中"searchtype"和"searchterm"两个值以POST方式传入php脚本,分别存入变量 $searchtype 和$searchterm中。注意在第二行中使用了trim()函数,此函数的作用是去除字符串首尾两端的空格。
if (!$searchtype || !$searchterm) {
echo 'You have not entered search details. Please go back and try again.';
exit;
}
if (!get_magic_quotes_gpc()){
$searchtype = addslashes($searchtype);
$searchterm = addslashes($searchterm);
}
第一个if语句是用来保证得到的两个变量不为空,如果为空就返回错误信息并结束。
第二个if语句中首先检查了get_magic_quotes_gpc()函数的返回值,如果为false则用addslashes()函数来过滤两个字符串。
- get_magic_quotes_gpc() 函数是一个用来判断是否为用户提供的数据增加斜线进行转义了,这个在php.ini配置文件中进行设置。当 magic_quotes_gpc 打开时,所有的 ‘ (单引号), ” (双引号), \(反斜线)和NULL空字符会自动转为其前面添加反斜线进行转义后的字符串。
- addslashes() 函数将返回在需要转义的字符之前添加了反斜杠的字符串。
- addslashes()不能用于已经使用magic_quotes_gpc进行转义的字符串,因为字符串将被双重转义。
- 在PHP 5.4.0之前,PHP指令magic_quotes_gpc默认处于启用状态,它基本上在所有GET,POST和COOKIE数据上运行addslashes().
2.建立一个到数据库的连接
PHP为连接MySQL提供了函数库mysqli(i表示改进)。当在PHP中使用mysqli函数库时,可以选择使用面向对象或者面向过程的语法,但在本文中,将介绍面向对象的语法。
在results.php中,使用如下语句连接MySQL服务器:
@ $db = new mysqli('localhost', 'bookorama', 'bookorama123', 'books');
//host user_name password database
以上代码实例化了mysqli类并且创建了到主机localhost的连接,该连接使用的用户名和密码分别是:bookorama和bookorama123,该连接被设置成使用books数据库。
为该脚本创建一个用户的sql语句如下,在本文中对sql不作过多介绍,可自行了解。
mysql> grant select, insert, update, delete, index, alter, create, drop
-> on books.*
-> to bookorama identified by 'bookorama123';
下面接着对php脚本进行解释:
if (mysqli_connect_errno()) { //返回上次连接调用的错误代码(检查)
echo 'Error: Could not connect to database. Please try again later.';
exit;
}
- 上述代码对尝试连接数据库的结果进行检查,因为其他的代码都不能在数据库连接失败的情况下工作。
- mysqli_connect_errno() 函数将在出现连接错误时返回一个错误号,如果成功,则返回0。
- 注意,当连接到数据库时,通常会以错误抑制符 @ 作为第一行代码,这样方便处理出现的错误。
除此之外,在使用MySQL命令行界面时,需要告诉它使用哪个数据库,命令如下:
mysql> use books;
在PHP中,也需要这么做,可以调用mysqli_select_db() 函数来实现:
$db->select_db(dbname);
3.查询数据库
$query = "select * from books where ".$searchtype." like '%".$searchterm."%'";
上述代码先用$query来建立一条需要运行的sql查询语句,在本例中,将在用户指定字段($searchtype)中搜索用户输入值($searchterm)。注意我们使用了相似(like)逻辑用于匹配而不是相等逻辑,而且PHP中发送给MySQL的查询不需要在后面加一个分号。
然后,可以运行如下查询:
$result = $db->query($query); //发送一条SQL查询
4.检索查询结果
当使用面向对象的方法时,返回的行数保存在结果对象的num_rows成员变量中,可以通过以下的形式访问它
$num_results = $result->num_rows;
知道了返回结果的行数了,就可以用一个for循环来对结果进行显示与输出:
for ($i=0; $i <$num_results; $i++) {
$row = $result->fetch_assoc();
echo "<p><strong>".($i+1).". Title: ";
echo htmlspecialchars(stripslashes($row['title']));
//htmlspecialchars — 将特殊字符转换为 HTML 实体
//stripslashes — 反引用一个引用字符串(即去除转义反斜线)
echo "</strong><br />Author: ";
echo stripslashes($row['author']);
echo "<br />ISBN: ";
echo stripslashes($row['isbn']);
echo "<br />Price: ";
echo stripslashes($row['price']);
echo "</p>";
}
在每轮循环中,我们都将调用$result->fetch_assoc() 函数,如果没有返回行,该循环将停止。该函数接受结果集合中每一行并以一个关联数组返回该行,每个关键词为一个属性名,每个值为数组中相应的值:
$row = $result->fetch_assoc();
给定关联数组$row,我们可以遍历每个字段并适当的显示它们,例如:
echo "<p><strong>".($i+1).". Title: ";
echo htmlspecialchars(stripslashes($row['title']));
htmlspecialchar()函数对HTML中的特殊意义字符进行编码。
stripslashes()函数与前面的addslashes()函数相对应,用来删除由 addslashes() 函数添加的反斜杠,避免反斜杠也被打印出来。
5.从数据库断开连接
通过调用如下语句,可以释放结果集:
$result->free();
然后再通过以下语句来关闭一个数据库:
$db->close();
结果
当选择Search Type=Title,且输入Search Term为"Java"时,搜索结果如下: