PHP处理表单提交时无法动态创建指定名称MySQL表问题求助
错误原因
- 表名拼接语法错误:你使用单引号包裹表名片段,MySQL中单引号为字符串标识符,不能用于拼接表名;如果表名存在特殊字符,需要用反引号
`包裹,同时变量拼接逻辑有误,没有正确将两个变量用下划线连接。 - 建表语句不合法:MySQL不允许创建无任何字段的空表,你写的CREATE TABLE语句括号内未定义任何列结构。
- 存在冗余重复逻辑:代码中先后写了两次建表查询、两次插入数据查询,属于无效冗余代码。
- header跳转前存在输出:上传成功/失败的echo输出会导致header跳转失效,HTTP头部必须在任何内容输出前发送。
修复代码
<?php if(isset($_POST['mySubmit'])) { $db = mysqli_connect('localhost','root','','DBsito'); if (!$db) { die('数据库连接失败: ' . mysqli_error($db)); } $imagename = $_FILES['icona']['name']; $imagetemp = $_FILES['icona']['tmp_name']; $imagePath = "img/upload/"; $uploadStatus = ""; if(is_uploaded_file($imagetemp)) { if(move_uploaded_file($imagetemp, $imagePath . $imagename)) { $uploadStatus = "图片上传成功"; } else { $uploadStatus = "图片移动失败"; } } else { $uploadStatus = "图片上传失败"; } $categoria = mysqli_real_escape_string($db, $_POST['categoria']); $username = mysqli_real_escape_string($db, $_POST['utente']); $checkSql = "SELECT nome_categoria, user_utente FROM categoria WHERE BINARY nome_categoria = BINARY '$categoria' AND BINARY user_utente = BINARY '$username'"; $result = mysqli_query($db, $checkSql); if(!empty($categoria) && mysqli_num_rows($result)) { $name_error = "分类已存在!"; } else if (!empty($categoria)){ // 拼接合法表名,反引号包裹避免特殊字符问题 $tableName = "`{$categoria}_{$username}`"; // 建表必须定义字段,示例添加主键id,可按需扩展其他字段 $createTableSql = "CREATE TABLE {$tableName} ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;"; if ($db->query($createTableSql) === TRUE) { // 建表成功后执行分类插入 $insertSql = "INSERT INTO categoria (nome_categoria, user_utente, icona) VALUES ('$categoria','$username', '$imagename')"; if(mysqli_query($db, $insertSql)){ header("Location: confermaCategoria.php"); exit(); }else{ die("分类插入失败: " . mysqli_error($db)); } } else { die("建表失败: " . $db->error); } } else { $name_error = ""; } // 非跳转场景输出提示信息 echo $uploadStatus; if(!empty($name_error)) echo $name_error; mysqli_close($db); } ?>
内容的提问来源于stack exchange,提问作者asbarabungi
相关产品推荐
相关产品推荐

