Я пытался создать регистр 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 (или не возвращает результатов), а while никогда не выполняется, то есть переменная никогда не устанавливается. Одна вещь, которая по крайней мере «плохая форма» это
'$_POST[user]'"
Нет кавычек для ключа, это должно выдать предупреждение как неопределенная константа, тогда PHP по умолчанию будет использовать постоянное значение = имя константы, или name
,
Это сомнительно, поэтому оно терпит неудачу, но никто не знает. В любом случае, сам цикл while здесь не имеет смысла, когда ожидается единственный результат. Особенно при использовании fetch_array
вместо просто fetch
, Тем не менее, я не использовал Mysqli около 4 лет, так что я немного устала от этого, так как сейчас использую PDO. Но если я не ошибаюсь, fetch_array
должен возвращать весь набор результатов, тем самым делая цикл while бессмысленным.
В случае, если запрос действительно выполняется, ваш пользователь может быть неверным.
Примечание — это не обязательно предназначено как ответ, но слишком много для комментария.
Выполняя это, игнорируя тот факт, что он полностью открыт для внедрения SQL, при конкатенации $_POST
значения непосредственно в SQL, это то, что вы должны проверить, что значение этого элемента записи действительно, что это должно быть. Если нет, то все развалится. т.е. $_POST['user']
это то, что вы думаете.
Кроме того, еще одна вещь во время цикла.
Прорабатывая мой путь через ваш код. 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
с ?
или же 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-инъекций, но это достаточно близко, чтобы вы могли серьезно подумать об использовании подготовленных операторов.
Других решений пока нет …