首页 > 解决方案 > 为什么我的 if else 语句有效,但是当我用函数替换它时却不起作用?

问题描述

我正在动态创建一些包含输入表单的手风琴(数量取决于数据库输出),并且如果在输入验证后报告错误,我希望它们保持打开状态。当我在我的 echo 中使用 if else 语句来创建表单时,它会按预期工作。但是,如果我将 if else 替换为函数,则页面甚至无法正确加载。

以下代码(简化为一个最小示例)向 div 类添加“w3-show”或不添加任何内容,并且工作正常。将$player_edit_err[$id]包含错误消息作为其值,或者如果没有报告错误,则将是一个空数组。在像这样提交 $_POST 之后,我正在初始化这个数组:$player_edit_err = array();并且在这样的验证之后:if (empty($new_player_name)) {$player_edit_err[$id] = "Please enter a Name.";}数组将为空或包含作为字符串的错误。最后,我展示了完整的 $_POST 代码。

foreach ($players_in_tourn as $id => $name) {
  echo "<div class='w3-hide";

  if (!empty($player_edit_err[$id])) {
    echo " w3-show";
  } else {
    echo "";
  }

  echo "'><form action='" . htmlspecialchars($_SERVER['PHP_SELF']) . "' method='post'>
            <input type='text' name='new_player_name' value='$name'>
            <input type='hidden' name='player_id' value='$id'>
            <span>" . $player_edit_err[$id] . "</span>
          </form>
        </div>";
}

但是,如果我想将 if else 语句放在一个函数中,以便像这样处理代码:

function accordionShow($error) {
  if (!empty($error)) {
    return " w3-show";
} else {
    return "";}
}

并尝试通过像这样替换 if else 语句来调用该函数:echo accordionShow($player_edit_err[$id]);否则accordionShow($player_edit_err[$id]);它不起作用。请注意,我已经在函数中使用 echo 或 return 对此进行了测试。事实上,当我尝试调用该函数时,手风琴列表并未完全创建。它在第一个之后停止,页面的其余部分也没有加载。我不知道这是否相关,但我也在Uninitialized string offset:php 日志文件中收到一条错误消息。$player_edit_err[$id]当代码运行良好时(即不使用函数时),php 错误指的是 字符串。

非常感谢任何有助于理解这个问题的帮助。谢谢!

编辑:这是完整的 $_POST 代码

// Processing form data when form is submitted
foreach ($players_in_tourn as $id => $name) {
    if (($_SERVER["REQUEST_METHOD"] == "POST") && isset($_POST["edit_player$id"])) {
        $message = "POST for edit_player";

        //Define variables
        $player_id = $_POST["player_id"];
        $player_name = $_POST["player_name"];
        $new_player_name = $_POST["new_player_name"];
        $player_edit_err = array();

        // Make the function for form data input validation available 
        require('functions/functions.php');

        // Validate tourn_name
        if (empty($new_player_name)) {
            $player_edit_err[$id] = "Please enter a Name.";
        } else {
            $new_player_name = test_input($new_player_name);
        }

        // // Validate player ... check if it exists already in the tournament
        $new_array = $_SESSION['playersInTourn'];
        unset($new_array[$player_id]);

        if (in_array($new_player_name, $new_array)) {
            $player_edit_err[$id] = "Player $new_player_name already exists.";
        }

        $_SESSION['errors'] = $player_edit_err;

        // Then insert the tournament player
        if ($player_edit_err[$id] == "") {
            // If no errors insert the tournament player
            $stmt = $db->prepare("UPDATE Players SET name =? WHERE idPlayers=?");
            $stmt->execute([$new_player_name, $player_id]);

            // Redirect to Tournament page
            header("location: add_players.php");
            exit();
        }
    }
}

标签: phpfunctionecho

解决方案


if (empty($new_player_name)) {if (in_array($new_player_name, $new_array)) {不满足/true时,if ($player_edit_err[$id] == "") {会产生错误,因为数组的$id$player_edit_err不存在。

老实说,我会重写整个流程(事实上,我会重新设计指向该脚本的表单,以便命名数组类型字段edit_player[$id]而不是edit_player$id)。

但是,要快速修补脚本,只需使用empty()检查。

if (empty($player_edit_err[$id])) {

我将做一个重要的说明:准备好的语句被设计为声明一次(在进入循环之前),然后在循环内根据需要执行多次。


推荐阅读