[英]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.