logo

额外区块类型 (EBT) - 全新的布局构建器体验❗

额外区块类型 (EBT) - 样式化、可定制的区块类型:幻灯片、标签页、卡片、手风琴等更多类型。内置背景、DOM Box、JavaScript 插件的设置。立即体验布局构建的未来。

演示 EBT 模块 下载 EBT 模块

❗额外段落类型 (EPT) - 全新的 Paragraphs 体验

额外段落类型 (EPT) - 类似的基于 Paragraph 的模块集合。

演示 EPT 模块 滚动

滚动

PHP课程 - 第3.3课 - 使用 MySQL 数据库。UPDATE 更新数据。

09/10/2025, by Ivan

我们已经学习了 MySQL 的 SELECTINSERT 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 的初学者。