【问题标题】:Why does my if else stament work but when I replace it with a function it doesn't?为什么我的 if else 语句有效,但是当我用函数替换它时却无效?
【发布时间】:2021-01-25 01:04:12
【问题描述】:

我正在动态创建一些包含输入表单的手风琴(数量取决于数据库输出),并且如果在输入验证后报告错误,我希望它们保持打开状态。当我在我的 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 对此进行了测试。事实上,当我尝试调用该函数时,手风琴列表并未完全创建。它在第一个之后停止,页面的其余部分也没有加载。我不知道这是否相关,但我还在 php 日志文件中收到 Uninitialized string offset: 错误消息。当代码运行良好时(即不使用函数时),php 错误指的是$player_edit_err[$id] 字符串。

非常感谢您对理解此问题的任何帮助。 谢谢!

编辑:这是完整的 $_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();
        }
    }
}

【问题讨论】:

  • 为什么要一个 div 同时拥有 w3-hidew3-show 类?我们看不到您的 $player_edit_err 数组数据,所以我们不知道为什么您的第一个 $id 不是您的数组中找到的键。 $player_edit_err 是什么?它是数组还是字符串?它是在某处声明的吗?无论如何,我不会为此创建新的自定义函数...echo !empty($player_edit_err[$id]) ? ' w3-show' : '';
  • echo '&lt;div class="w3-hide' . (!empty($player_edit_err[$id]) ? ' w3-show' : '') . '"&gt;';
  • 嗨!谢谢你的提示。我编辑了我的帖子以包含有关我如何构建$player_edit_err array 的更多信息。您的建议效果很好,尽管我仍然不明白为什么用函数调用替换它时它不起作用。我应该将此标记为已解决吗?
  • 回答您的其他问题...为什么我要在与 w3-hide 相同的 div 中添加 w3-show?因为当我的跨度包含错误消息时,这是我设法保持手风琴打开的唯一方法。我是一个完全使用 javascript 的菜鸟,我在网上找到并尝试过的每种方法都不起作用。我知道手风琴在 POST 之后关闭,因为页面在与数据库交互后重新加载并且其初始状态是隐藏的。

标签: php function echo


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

    如果你想让它执行,你必须调用它。使用您的代码,您刚刚完成了它。你必须这样称呼它:accordionShow()

    所以你的代码会是这样的:

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

    不要忘记将 $error 作为参数传递给函数

    【讨论】:

    • 但我在帖子中确实提到我已经尝试过以各种方式调用该函数。例如,我尝试了accordionShow($player_edit_err[$id]); 或确保从数组中获取的$player_edit_err[$id] 没有任何问题,我尝试使用一些手动输入的字符串来调用它,如下所示:accordionShow("My error message here");
    猜你喜欢
    • 1970-01-01
    • 2019-12-11
    • 1970-01-01
    • 1970-01-01
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-16
    相关资源
    最近更新 更多