我尝试过创建一个寄存器PHP代码,这样我就可以在我不在计算机上时注册人员,但是由于某种原因,它不会创建表,即使没有在没有的情况下创建文件夹那里。
输出为:
(!)注意:未定义的变量:db_add_user
添加用户
用户文件夹已经创建
用户图像文件夹已经创建
用户个人资料图片已经在那里
没有创建用户表
完成
这是代码
connection.php
<?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_add_user
$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'];
}
}
如果查询为false(或返回没有结果),则永远不会运行,则永远不会设置变量。至少"不良形式"的一件事是这个
'$_POST[user]'"
无引号的键,这应该发出诸如未定义常数之类的警告,然后php将常数值默认为= =常数的名称或 name
。
这就是为什么它失败的原因,但人们永远不知道。在任何情况下,当期望单个结果时,这里的循环本身都是毫无意义的。尤其是使用fetch_array
而不是fetch
时。也就是说,我大约有4年没有使用Mysqli,所以这些天我使用PDO时,我有点生锈。但是,除非我误会了,否则 fetch_array
应该返回整个结果集,从而使while循环毫无意义。
如果查询确实运行,则您的用户可能不正确。
注意 - 这不是必需作为答案的,而是要发表评论。
遵循此操作,忽略它完全对SQL注入的事实,当将$_POST
值直接串联到SQL中时,您应该检查该帖子项目的值是否确实应该是它。如果不是这样,一切都会崩溃。IE $_POST['user']
是您认为的。
另外,在段循环中的另一件事。
通过我的代码工作。fetch_array
返回类似的东西
[
0 => ['item' => 'value' ]
]
换句话说,多维阵列。因此,由于编码的编码,您的way循环永远无法将正确的 $row['user']
值提出,因为 row
是整个结果集,包裹在容器阵列中。因此,您将在阵列中查看一个级别,然后您认为自己是的位置。IE。一排行,不是一行。
如@javad的评论中所述,您的file_exists
在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_add_user
用?
或undefined
替换。当它运行时,它将进入循环,因为肯定不等于发布的用户价值。并且由于存在不正确的格式文件,该文件将永远不存在,这会导致其创建适当的文件,因为这些文件已正确编码。因此,下次您运行它时,它会执行相同的操作,创建适当的文件/文件夹,该文件/文件夹不匹配"错过的编码文件"。
这条线非常令人不安(这就是为什么我花时间解释下面的原因):
$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')";
想象一下我将其发布为密码。
$_POST[pass] = "password', true, true, false )--";
--
评论了其余的SQL,因此我只是让自己成为您的网站的管理员和主人。(假设您是指true
而不是'true'
作为字符串),因为您的查询变成了类似的
"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')"
--
之后什么都没有计算,因为数据库认为这是一个评论。现在,我并不是说完全有效,因为我不是习惯于利用SQL注射漏洞,但是它足够接近,您应该认真考虑使用准备好的陈述。