html — php mysql регистрационная форма

Я пытался создать регистр 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>";
?>

Кстати, ввод электронной почты — это просто причина причин.

0

Решение

Я полагаю, из-за неопределенной переменной ваш запрос не выполняется:

Примечание: неопределенная переменная: 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-инъекций, но это достаточно близко, чтобы вы могли серьезно подумать об использовании подготовленных операторов.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector