字符串变量比较方式存在问题?求排查剪刀石头布代码异常
问题分析与修复方案
你这段代码的核心问题是大小写不匹配,导致平局的逻辑永远无法触发: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; } ?>
额外优化说明
- 输入合法性校验:通过
in_array确保用户提交的内容是合法选项,避免恶意输入破坏逻辑。 - 请求方法校验:防止用户直接访问
handle.php时出现$_POST['choice']未定义的报错。 - 跳转后终止代码:使用
header跳转后必须调用exit,避免后续代码继续执行引发意外。 - 用户体验提升:平局时添加返回游戏页面的链接,方便用户快速再次游玩。
内容的提问来源于stack exchange,提问作者Garrett Rose
相关产品推荐
相关产品推荐

