You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

字符串变量比较方式存在问题?求排查剪刀石头布代码异常

问题分析与修复方案

你这段代码的核心问题是大小写不匹配,导致平局的逻辑永远无法触发:HTML表单里的选项值是首字母大写的(比如Rock),但PHP代码里的随机选择项是全小写的(比如rock),PHP里的==是区分大小写的字符串比较,所以两者永远不会相等,自然不会输出平局的提示。

下面是具体的问题拆解和修复后的代码:

原代码的关键问题点

  • HTML的<option>值为大写开头:<option value="Rock">Rock</option>
  • PHP的$items数组元素是全小写:$items = Array('rock','paper','scissors');
  • 缺少输入合法性验证,直接访问handle.php会报错
  • 跳转后未终止代码执行,可能引发意外问题

修复后的完整代码

修正后的HTML(index.php)

<!DOCTYPE html> 
<html> 
<head> 
<meta charset="utf-8"> 
<title>Rock Paper Scissors</title> 
</head> 
<body> 
<h3>Rock! Paper! Scissors</h3> 
<form action="handle.php" method="POST"> 
<p>Choose one of the options</p> 
<select name="choice" required> 
<!-- 将value改为全小写,和PHP数组保持一致 -->
<option value="rock">Rock</option> 
<option value="paper">Paper</option> 
<option value="scissors">Scissors</option> 
</select> 
<input type="submit" name="submit" value="Submit my choice"> 
</form> 
</body> 
</html>

修正后的PHP(handle.php)

<?php 
$items = ['rock','paper','scissors']; // 用短数组语法更简洁
$randomChoice = $items[array_rand($items)]; 

// 先检查是否为POST请求,避免直接访问handle.php报错
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    header('Location: index.php');
    exit;
}

$choice = $_POST['choice']; 
// 验证用户输入是否在合法选项内,防止恶意提交
if (in_array($choice, $items)) {
    if ($choice == $randomChoice) { 
        echo "It's a draw!"; 
        // 增加返回链接,提升用户体验
        echo '<br><a href="index.php">Play again</a>';
    } else { 
        // 后续可以在这里扩展胜负判断逻辑
        header('Location: index.php');
        exit; // 跳转后必须终止代码执行
    }
} else {
    // 非法输入,跳回首页
    header('Location: index.php');
    exit;
} 
?>

额外优化说明

  1. 输入合法性校验:通过in_array确保用户提交的内容是合法选项,避免恶意输入破坏逻辑。
  2. 请求方法校验:防止用户直接访问handle.php时出现$_POST['choice']未定义的报错。
  3. 跳转后终止代码:使用header跳转后必须调用exit,避免后续代码继续执行引发意外。
  4. 用户体验提升:平局时添加返回游戏页面的链接,方便用户快速再次游玩。

内容的提问来源于stack exchange,提问作者Garrett Rose

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:38:54