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