使用PHP连接MySQL数据库——查询

使用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界面如下:
使用PHP连接MySQL数据库——查询
其中包含表单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"时,搜索结果如下:
使用PHP连接MySQL数据库——查询