php mysql注册表表
我尝试过创建一个注册php代码,这样当我不在我的计算机上时,我就可以注册用户,但由于某种原因,它不会创建表,也不会创建文件夹,即使没有 输出为: (!)注意:未定义变量:db\u add\u user 新增用户 已创建用户文件夹 已创建用户图像文件夹 用户配置文件图片已经存在 没有创建用户表 完成 这是代码 connection.phpphp mysql注册表表,php,html,mysql,Php,Html,Mysql,我尝试过创建一个注册php代码,这样当我不在我的计算机上时,我就可以注册用户,但由于某种原因,它不会创建表,也不会创建文件夹,即使没有 输出为: (!)注意:未定义变量:db\u add\u user 新增用户 已创建用户文件夹 已创建用户图像文件夹 用户配置文件图片已经存在 没有创建用户表 完成 这是代码 connection.php <?php $servername = "localhost"; $username = "root"; $password = ""; // Cre
<?php
$servername = "localhost";
$username = "root";
$password = "";
// Create connections
$main_db = new mysqli($servername, $username, $password, "main_db");
$user_db = new mysqli($servername, $username, $password, "u");
$chat_db = new mysqli($servername, $username, $password, "chat");
$log_db = new mysqli($servername, $username, $password, "log");
?>
index.php
<?php
require('/website/live/includes/checkadmin.php')
?>
<html>
<head>
<title>register</title>
<link rel="stylesheet" type="text/css" href="/main.css">
</head>
<body class="disableNotifications">
<?php include("/website/live/includes/nav.php"); ?>
<form action="register.php" method="post" >
<input type="text" name="user" placeholder="user" required>
<input type="text" name="login" placeholder="login" required>
<input type="text" name="pass" placeholder="pass" required>
<input type="text" name="email" placeholder="" required>
<input type="text" name="year" placeholder="" required>
<button type="submit"><h2>register</h2></button>
<button type="reset"><h2>reset</h2></button>
</form>
</body>
</html>
登记
登记
重置
register.php
<?php
#makes sure user is admin
require("/website/live/includes/checkadmin.php");
#opens connection to database
require("/website/live/includes/connection.php");
$query = $main_db->query("SELECT user FROM main_table WHERE user = '$_POST[user]'", MYSQLI_USE_RESULT);
if ($query) {
while ($row = $query->fetch_array()) {
$db_add_user = $row['user'];
}
}
if ($db_add_user != $_POST['user']) {
#adds user to main database
$inserttable = "INSERT INTO `main_table` (`ID`, `user`, `email`, `year`, `login`, `pass`, `admin`, `master`, `banned`) VALUES (NULL, '$_POST[user]', '$_POST[email]','$_POST[year]' ,'$_POST[login]', '$_POST[pass]', 'False', 'False', 'False')";
if ($main_db->query($inserttable, MYSQLI_USE_RESULT) === TRUE) {
echo "added user <br>";
}
else {
echo "didn't add user <br>";
}
#makes folders
if (file_exists("'/website/live/u/' . $_POST[user]") === TRUE) {
mkdir('/website/live/u/' . $_POST['user']);
echo "created user folder <br>";
}
else {
echo "user folder already created <br>";
}
if (file_exists("'/website/live/u/' . $_POST[user] . '/images'") === TRUE) {
mkdir('/website/live/u/' . $_POST['user'] . '/images');
echo "created user image folder <br>";
}
else {
echo "user image folder already created <br>";
}
if (file_exists("'/website/live/images/logo.png','/website/live/u/'.$_POST[user].'/logo.png'") === TRUE) {
copy('/website/live/images/logo.png','/website/live/u/'.$_POST['user'].'/logo.png');
echo "copyed user logo across <br>";
}
else {
echo "user profile picture already there <br>";
}
#adds folders to user database
$makeimages = "CREATE TABLE `$_POST[user]` ('name' TEXT NOT NULL , `time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP , `upvotes` INT NOT NULL DEFAULT '0' , `downvotes` INT NOT NULL DEFAULT '0' , UNIQUE `name` (`name`))";
if ($user_db->query($makeimages, MYSQLI_USE_RESULT) === TRUE) {
echo "created user table <br>";
}
else {
echo "didn't create user table <br>";
}
}
else {
echo "user already added <br>";
die;
}
#not going to redirect so erros can be displayed
echo "done <br>";
?>
我想由于未定义的变量,您的查询会失败:
注意:未定义变量:db\u add\u user
如果查询为false(或不返回任何结果),而从不运行,则从不设置变量。至少有一件事是“糟糕的形式”,那就是
键没有引号,这会发出类似undefined constant的警告,然后PHP将默认常量值设置为=常量的名称,或name
这就是它失败的原因,这是值得怀疑的,但人们永远不知道。在任何情况下,当期望得到一个结果时,while循环本身是没有意义的。尤其是在使用fetch\u数组
而不仅仅是fetch
时。也就是说,我已经有4年没有使用Mysqli了,所以我现在在使用PDO时对它有点生疏。但是,除非我弄错了,fetch\u array
应该返回整个结果集,从而也使得while循环毫无意义
如果查询没有运行,您的用户可能不正确
注意-这不是必要的,只是作为一个答案,但对于评论来说太多了
接下来,当将$\u POST
值直接连接到SQL中时,忽略它完全可以接受SQL注入的事实,就是您应该检查该POST项的值是否确实是它应该的值。如果不是这样,那么一切都会分崩离析。ie$\u POST['user']
就是你认为的那样
还有,while循环中的另一件事
以我的方式通过你的代码fetch\u数组
返回如下内容
[
0 => ['item' => 'value' ]
]
"INSERT INTO `main_table` (`ID`, `user`, `email`, `year`, `login`, `pass`, `admin`, `master`, `banned`) VALUES (NULL, 'god', 'gad@heaven.com','2017' ,'God', 'password', true, true, false) --', 'False', 'False', 'False')"
换句话说,是一个多维数组。因此,您的while循环在编码时永远无法提取正确的$row['user']
值,因为row
是包装在容器数组中的整个结果集。因此,您将在阵列中查看一个级别,然后查看您所处的位置。即,一组行,而不是一行
正如@Javad在评论中提到的,您的文件\u存在
检查if语句也不正确
file_exists("'/website/live/u/' . $_POST[user]");
包含单引号和双引号(键周围也缺少引号)。并应采用以下形式:
file_exists('/website/live/u/' . $_POST['user']);
file_exists("/website/live/u/{$_POST['user']}"); //I prefer the {} for variable interpolation, yep that's a big word that means variable interpretation, or more simply PHP will just fill the variable value in.
等等
实际上,只要想想第一个错误对您的代码意味着什么,在您的脑海中,用?
或未定义的替换这个$db\u add\u user
。当它运行时,它将进入循环,因为这肯定不等于发布的用户值。如果选中格式不正确的文件存在检查,该文件将永远不存在,这将导致它创建正确的文件,因为这些文件的编码正确。因此,下次运行它时,它会执行相同的操作,创建与未命中编码文件不匹配的正确文件/文件夹
这句话非常令人不安(这就是我花时间解释以下内容的原因):
想象一下我把它作为我的密码发布
$_POST[pass] = "password', true, true, false )--";
--
注释了sql的其余部分,所以我只是让自己成为了你网站的管理员和主人。(假设您的意思是true
,而不是'true'
作为字符串)因为您的查询变成这样
[
0 => ['item' => 'value' ]
]
"INSERT INTO `main_table` (`ID`, `user`, `email`, `year`, `login`, `pass`, `admin`, `master`, `banned`) VALUES (NULL, 'god', 'gad@heaven.com','2017' ,'God', 'password', true, true, false) --', 'False', 'False', 'False')"
其中,--
后面的内容不起作用,因为DB认为这是注释。现在我并不是说这将是有效的,因为我没有使用SQL注入漏洞的习惯,但是它已经足够接近了,你应该认真考虑使用准备好的语句。你可以在EFER条件下尝试ECHECK $插入表吗?然后直接在数据库中运行精确的查询,以便在查询中使用之前对输入进行清理,以防止sql注入,这并不重要,因为它在管理页面中,但最好这样做,我相信您的代码是倾向于sql注入攻击的,请使用dynamic(prepared语句)查询-最好每个用户使用PDO1表是一个糟糕的设计要检查文件_exists()输入并更新您的答案,他在单引号周围使用双引号,同时试图用双引号将用户连接到文件_exists(“'/website/live/u/”。$_POST[user]”
@Javad-我还没有做到这一点,但我还是很感激。我的意思是,它应该像文件存在('/website/live/u/')。$\u POST[user])
,无论如何,很好地指出了所有这些!
"INSERT INTO `main_table` (`ID`, `user`, `email`, `year`, `login`, `pass`, `admin`, `master`, `banned`) VALUES (NULL, 'god', 'gad@heaven.com','2017' ,'God', 'password', true, true, false) --', 'False', 'False', 'False')"