[英]php mysql register form
我已经尝试创建一个注册php代码,这样我可以在即时消息不在我的计算机上时注册人们,但是由于某种原因,即使不在那儿,它也不会创建表,也不会创建文件夹。
输出为:
(!)注意:未定义变量:db_add_user
添加的用户
用户文件夹已创建
用户图像文件夹已创建
用户个人资料图片已经在那里
没有创建用户表
DONE
这是代码
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'];
}
}
如果query为false(或不返回任何结果),而while从不运行,则永远不会设置该变量。 至少是“不良形式”的一件事是这样的
'$_POST[user]'"
键没有引号,这将发出警告,例如未定义的常量,然后PHP将默认的常量值=常量的名称或name
。
令人怀疑的是,它为什么会失败,但没人知道。 无论如何,当期望单个结果时,while循环本身毫无意义。 特别是在使用fetch_array
而不是仅fetch
。 那就是说我已经有4年没有使用过Mysqli了,所以我最近在使用PDO时对此感到有些生锈。 但是除非我弄错了,否则fetch_array
应该返回整个结果集,从而也使while循环毫无意义。
如果查询确实在运行,则您的用户可能不正确。
注意-不一定要作为答案,但对于评论来说太多了。
接着,忽略将$_POST
值直接连接到SQL中时完全可以进行SQL注入的事实是,您应该检查该发布项目的值确实是应该的。 如果没有,那一切都会崩溃。 即$_POST['user']
是您认为的。
另外,while循环上还有另一件事。
通过我的代码遍历。 fetch_array
返回类似这样的内容
[
0 => ['item' => 'value' ]
]
换句话说,是多维数组。 因此,由于编码时,while循环永远无法提取正确的$row['user']
值,因为row
是整个结果集,包装在容器数组中。 因此,您将在阵列中上一层,然后在您认为的位置上看。 即。 行数组,而不是单行。
如@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
替换$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')"
在--
不重要的部分是因为DB认为它是注释。 现在,我并不是说这完全可行,因为我没有养成利用SQL注入漏洞的习惯,但是它足够接近,您应该认真考虑使用准备好的语句。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.