PHP课程 - 第3.3课 - 使用 MySQL 数据库。UPDATE 更新数据。
我们已经学习了 MySQL 的 SELECT 和 INSERT INTO 操作符,现在是时候了解如何更新已存入数据库的数据了。为此,我们将使用 SQL 操作符 UPDATE。但首先,我们需要修改 index.php 文件,添加一个新的路径处理。找到如下代码:
if( $_GET['admin'] == 1 ){ // 如果 URL 中存在 admin 参数 print $obj->display_admin(); // 如果存在该参数,显示添加表单 }else{ print $obj->display_public(); // 如果没有该参数,显示消息 }
将其替换为以下代码:
switch ($_GET['admin']){ case 'add': print $obj->display_admin(); // 如果变量等于 add,则显示添加表单 break; case 'update': print $obj->display_update(); // 如果变量等于 update,则显示修改表单 break; default: print $obj->display_public(); // 如果变量不存在,则显示消息 }
我将原来的 if 条件语句换成了 switch 语句,这样我们就可以根据 $_GET['admin'] 的不同值进行多种选择。以后我们还会添加 delete 选项。现在我把 “1” 改成了 “add”,并添加了新的 “update” 分支。由于我们修改了 URL 参数,现在需要在 simpleCMS.php 文件中更新链接输出:
$content .= '<p><a href="/index.php?admin=1">Добавить сообщение</a></p>';
改为:
$content .= '<p><a href="/index.php?admin=add">添加消息</a></p>';
接下来,我们需要添加一个新的方法 display_update(),当 GET 请求中 admin 参数为 update 时调用。添加如下方法:
public function display_update(){ }
现在路径处理部分已经完成,会调用我们新的 display_update() 方法。接下来我们要在页面上添加对应的链接,并实现这个方法。
先思考一下如何实现记录的更新。我们需要向数据库发送一个带有 WHERE 条件的查询,以便精确地更新指定的记录。要做到这一点,最可靠的方式是使用记录的 id,即我们的列 mid。因此,需要在调用 display_update() 方法时传递 mid 的值。
可以通过 GET 请求传递参数,例如:
http://test/index.php?admin=update&mid=3
也可以直接在方法参数中传递,例如:
public function display_update($mid){ }
并像这样调用方法:
switch ($_GET['admin']){ case 'add': print $obj->display_admin(); // 如果变量等于 add,显示添加表单 break; case 'update': $mid = 1; // 或者可以传入 $_GET['mid'] print $obj->display_update($mid); // 如果变量等于 update,显示修改表单 break; default: print $obj->display_public(); // 如果变量不存在,显示消息 }
不过更简单的方式是通过 GET 请求传递参数。因此,我们采用第一种方法:
public function display_update(){ $message_id = $_GET['mid']; }
这样我们就能通过 GET 获取 mid 的值,但如果 GET 请求中没有该值呢?我们需要进行检查:
public function display_update(){ $message_id = $_GET['mid']; // 将 mid 赋值给变量 if(!empty($message_id)){ }else{ $content .= '<p>没有 mid 值!</p>'; $content .= '<p><a href="/index.php">返回首页</a></p>'; } return $content; }
现在如果 GET 请求中存在 admin=update 但没有 mid 值,我们就会看到一条提示信息和返回首页的链接:
http://test/index.php?admin=update
接下来,我们需要在每条消息下添加“编辑”链接,以便进入编辑页面。修改 display_public() 方法如下:
public function display_public() { // 输出消息方法 $content = ''; $sql = 'SELECT * FROM Messages ORDER BY mid DESC'; // 查询语句 $result = mysql_query($sql) or die(mysql_error()); // 执行查询并保存结果 while($row = mysql_fetch_array($result)){ // 使用 mysql_fetch_array() 处理结果集 $content .= '<div class="post">'; // 包裹每条记录 $content .= '<span class="time">#' . $row['mid'] . ' 于 ' . date('d-m-Y', $row['created']) . '</span><h2>' . $row['title'] . '</h2>'; // 输出时间和标题 $content .= '<p>' . $row['bodytext'] . '</p>'; // 输出消息正文 $content .= '<p><a href="/index.php?admin=update&mid=' . $row['mid'] . '">编辑消息</a>'; // 添加编辑链接 $content .= '</div>'; // 结束 div } $content .= '<p><a href="/index.php?admin=add">添加消息</a></p>'; return $content; }
现在每条消息下方都会显示一个“编辑消息”链接。编辑表单将通过 display_update() 方法输出。接下来我们来编写该方法的代码。编辑表单与添加表单几乎相同,只是我们要从数据库中加载现有数据并添加一个隐藏的 mid 字段。
public function display_update(){ $message_id = $_GET['mid']; // 获取 mid if(!empty($message_id)){ $result = mysql_query('SELECT * FROM Messages WHERE mid='.$message_id); // 获取对应记录 $message = mysql_fetch_object($result); // 将结果转为对象 $content = ''; $content .= '<form action="/index.php?admin=update" method="post">'; // 表单提交到当前页 $content .= '<label for="title">名称:</label><br />'; $content .= '<input name="title" id="title" type="text" maxlength="150" value=' . $message->title .' />'; // 显示标题 $content .= '<div class="clear"></div>'; $content .= '<input name="mid" id="mid" type="hidden" value="'.$message->mid.'" />'; // 隐藏字段保存 mid $content .= '<label for="bodytext">消息内容:</label><br />'; $content .= '<textarea name="bodytext" id="bodytext">'. $message->bodytext .'</textarea>'; // 显示消息内容 $content .= '<div class="clear"></div>'; $content .= '<input type="submit" value="保存" />'; $content .= '</form>'; $content .= '<p><a href="/index.php">返回首页</a></p>'; }else{ if (!empty($_POST)) { // 检查表单提交结果 print_r($_POST); // 打印 POST 数组 $content .= '<p><a href="/index.php">返回首页</a></p>'; }else{ $content .= '<p>没有 mid 值!</p>'; $content .= '<p><a href="/index.php">返回首页</a></p>'; } } return $content; }
注释中已说明表单的变化。现在我们处理提交后的 POST 数据数组。示例如下:
Array( [title] => asdf [mid] => 1 [bodytext] => asdfasf )
该数组与插入记录的字段类似,只是多了一个 mid。让我们为它编写处理逻辑,执行更新查询:
public function display_update(){ $message_id = $_GET['mid']; if(!empty($message_id)){ $result = mysql_query('SELECT * FROM Messages WHERE mid='.$message_id); $message = mysql_fetch_object($result); $content = ''; $content .= '<form action="/index.php?admin=update" method="post">'; $content .= '<label for="title">名称:</label><br />'; $content .= '<input name="title" id="title" type="text" maxlength="150" value=' . $message->title .' />'; $content .= '<div class="clear"></div>'; $content .= '<input name="mid" id="mid" type="hidden" value="'.$message->mid.'" />'; $content .= '<label for="bodytext">消息内容:</label><br />'; $content .= '<textarea name="bodytext" id="bodytext">'. $message->bodytext .'</textarea>'; $content .= '<div class="clear"></div>'; $content .= '<input type="submit" value="保存" />'; $content .= '</form>'; $content .= '<p><a href="/index.php">返回首页</a></p>'; }else{ if (!empty($_POST)) { // 检查表单提交 mysql_query('UPDATE Messages SET title="'.$_POST["title"].'", bodytext="'.$_POST["bodytext"].'" WHERE mid='.$_POST["mid"]); $content .= '<p>消息已更新!'; $content .= '<p><a href="/index.php#mid-'.$_POST['mid'].'">跳转到该记录</a></p>'; }else{ $content .= '<p>没有 mid 值!</p>'; $content .= '<p><a href="/index.php">返回首页</a></p>'; } } return $content; }
以上就是完整的 display_update() 方法。让我们来分析 UPDATE 查询的结构:
首先是操作符 UPDATE,后跟表名。之后使用 SET 操作符指定需要更新的字段和值。接着用 WHERE 操作符添加条件,表示仅更新 mid 等于指定值的记录。稍后我会总结所有 MySQL 操作符。本课主要面向刚开始学习 PHP 和 MySQL 的初学者。