php - 为什么我的 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();
}
}
}
解决方案
当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])) {
我将做一个重要的说明:准备好的语句被设计为声明一次(在进入循环之前),然后在循环内根据需要执行多次。
推荐阅读
- python - 我怎样才能以数字方式(有效地)整合和绘制我的函数?
- node.js - Go 深入理解 REST API 中的自定义错误处理
- ssl-certificate - 有没有办法通过代码获取 Postman 响应的网络信息?
- python - 使用 rasterio 对光栅进行窗口读写
- java - 修补文件时资源提取器停止
- swift - SwiftUI:如何从一个视图传递数据并在另一个视图的 viewModel 中使用它
- python - 如何使用正则表达式仅匹配位于浮点数之后的字母并替换另一个字符串
- reactjs - 从一个 ID 页面链接到另一个 ID 页面
- java - Java Socketio 不发射
- c# - 如何用 AND、OR 连接两个表达式