PHP新手按表单输入创建文件夹文件时出现报错求助
错误原因&修复方案
1. 两个报错的直接诱因
- Warning: A non-numeric value encountered:PHP的字符串拼接运算符是
.不是+,你代码中所有拼接字符串的位置都错误使用了+(比如$nameidf = $username + $userid、fopen('/usersaccounts/ids/' + $username + $email + '.txt' , 'w')),+在PHP中仅用于数值加法,传入字符串就会触发非数值警告。 - Notice: Undefined variable: progress6:PHP变量大小写敏感,你定义进度变量时用的是大写开头的
$Progresso3`$Progresso8`,后续判断的时候写的是小写开头的`$progresso3`$progresso8,所以系统提示变量未定义。
2. 其他隐藏错误
- 表单未正确提交:你直接用
<a href="?run">跳转,不会携带input中用户输入的内容,所有$_GET获取的参数都是空值,需要给表单套<form>标签设置提交方式。 - 变量判断逻辑错误:
if ($username = null)是赋值操作,会直接把$username设为null,判断变量是否为空要使用if ($username == null)或者empty()函数。 - 随机ID校验逻辑错误:
$tokens = $randger把单数值赋值给$tokens后又执行foreach ($tokens as $token),会直接报错- 校验逻辑顺序错误,应该先循环校验所有文件确认随机ID无重复,再写入ID文件,你现在是每读取一行文件就写一次ID文件,逻辑完全混乱
- 变量名写错:代码中使用了未定义的
$email变量,你实际定义的存储邮箱的变量是$usermail - 路径&函数参数错误:
- 路径拼接多处错误,绝对路径和相对路径混用
mkdir()缺少权限参数和递归创建参数,会导致文件夹创建失败- 生成
$nameidf的时候如果用户名和ID为空,会导致路径非法
完整修复后的代码
<?php if (isset($_GET['run'])){ run(); } function run(){ // 校验所有必填参数是否存在 $requiredFields = ['usernamesave','userxp','userid','userlevel','usermail','userprog1','userprog2','userprog3','userprog4','userprog5','userprog6','userprog7','userprog8','proceed']; foreach ($requiredFields as $field) { if (!isset($_GET[$field]) || empty($_GET[$field])) { echo "<script>alert('字段 ".htmlspecialchars($field)." 不能为空');</script>"; return; } } // 接收参数 统一变量名小写 $username = $_GET['usernamesave']; $userxp = $_GET['userxp']; $userid = $_GET['userid']; $userlevel = $_GET['userlevel']; $usermail = $_GET['usermail']; $progresso1 = $_GET['userprog1']; $progresso2 = $_GET['userprog2']; $progresso3 = $_GET['userprog3']; $progresso4 = $_GET['userprog4']; $progresso5 = $_GET['userprog5']; $progresso6 = $_GET['userprog6']; $progresso7 = $_GET['userprog7']; $progresso8 = $_GET['userprog8']; $proceed = $_GET['proceed']; // 拼接文件夹名 用.不是+ $nameidf = $username . $userid; $idsDir = __DIR__ . '/usersaccounts/ids/'; $userDir = __DIR__ . '/usersaccounts/' . $nameidf . '/'; // 生成唯一4位随机ID do { $randger = rand(1000, 9999); // 直接生成1000-9999的随机数更简单 $idExists = false; // 遍历所有ID文件校验重复 foreach (glob($idsDir . '*.txt') as $file) { $content = file_get_contents($file); if (strpos($content, (string)$randger) !== false) { $idExists = true; break; } } } while ($idExists); // 写入ID文件 if (!is_dir($idsDir)) { mkdir($idsDir, 0777, true); } $idFile = $idsDir . $username . $usermail . '.txt'; file_put_contents($idFile, $randger); // 创建用户文件夹 if (!is_dir($userDir)) { mkdir($userDir, 0777, true); } // 写入用户各个文件 file_put_contents($userDir . 'username.txt', $username); file_put_contents($userDir . 'xp.txt', $userxp); file_put_contents($userDir . 'id.txt', $userid); file_put_contents($userDir . 'level.txt', $userlevel); file_put_contents($userDir . 'email.txt', $usermail); file_put_contents($userDir . 'progresso1.txt', $progresso1); file_put_contents($userDir . 'progresso2.txt', $progresso2); file_put_contents($userDir . 'progresso3.txt', $progresso3); file_put_contents($userDir . 'progresso4.txt', $progresso4); file_put_contents($userDir . 'progresso5.txt', $progresso5); file_put_contents($userDir . 'progresso6.txt', $progresso6); file_put_contents($userDir . 'progresso7.txt', $progresso7); file_put_contents($userDir . 'progresso8.txt', $progresso8); echo "<script>alert('数据保存成功');</script>"; } ?> <div class="container"> <div class="row"> <!-- 加form标签 提交参数 --> <form method="get" action=""> <label for="usernamesave">Nome de usuario:</label> <input id="usernamesave" name="usernamesave" type="text"><hr> <label for="userxp">Minha Experiêcia:</label> <input id="userxp" name="userxp" type="text"><hr> <label for="userid">Meu TagID User:</label> <input id="userid" name="userid" type="text"><hr> <label for="userlevel">Level da Minha Conta:</label> <input id="userlevel" name="userlevel" type="text"><hr> <label for="usermail">Meu email pessoal:</label> <input id="usermail" name="usermail" type="text"><hr> <label for="userprog1">Meu uso Progress01:</label> <input id="userprog1" name="userprog1" type="text"><hr> <label for="userprog2">Meu uso Progress02:</label> <input id="userprog2" name="userprog2" type="text"><hr> <label for="userprog3">Meu uso Progress03:</label> <input id="userprog3" name="userprog3" type="text"><hr> <label for="userprog4">Meu uso Progress04:</label> <input id="userprog4" name="userprog4" type="text"><hr> <label for="userprog5">Meu uso Progress05:</label> <input id="userprog5" name="userprog5" type="text"><hr> <label for="userprog6">Meu uso Progress06:</label> <input id="userprog6" name="userprog6" type="text"><hr> <label for="userprog7">Meu uso Progress07:</label> <input id="userprog7" name="userprog7" type="text"><hr> <label for="userprog8">Meu uso Progress08:</label> <input id="userprog8" name="userprog8" type="text"><hr> <label for="proceed">Proseeguir pra sav</label> <input id="proceed" name="proceed" type="text"><hr> <button type="submit" name="run" value="1">Run</button> </form> </div> </div>
内容的提问来源于stack exchange,提问作者AlfredOmalley
相关产品推荐
相关产品推荐

