gpt4 book ai didi

php mysql 注册表

转载 作者:行者123 更新时间:2023-11-29 10:37:40 29 4
gpt4 key购买 nike

我尝试创建一个注册 php 代码,这样当我不在计算机旁时我就可以注册人们,但由于某种原因,它不会创建表,也不会创建文件夹,即使不存在。

输出是:

( ! ) Notice: Undefined variable: db_add_user

added user

user folder already created

user image folder already created

user profile picture already there

didn't create user table

done

这是代码

连接.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>

注册.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>";
?>

顺便说一句,电子邮件输入只是一些原因。

最佳答案

我想由于 undefined variable ,您的查询失败了:

Notice: Undefined variable: 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 时。也就是说,我已经有大约 4 年没有使用 Mysqli 了,所以当我这些天使用 PDO 时,我对此有点生疏了。但除非我弄错了,否则 fetch_array 应该返回整个结果集,从而也使 while 循环变得毫无意义。

如果查询确实运行,您的用户可能不正确。

注意 - 这不一定是答案,但对于评论来说太多了。

接下来,忽略它完全对 SQL 注入(inject)开放的事实,当将 $_POST 值直接连接到 SQL 中时,您应该检查该帖子项的值是否确实是它应该是。如果不是,那么一切都会崩溃。即 $_POST['user'] 就是您所想的。

此外,还有关于 while 循环的另一件事。

通过我的方式完成您的代码。 fetch_array 返回类似这样的内容

 [
0 => ['item' => 'value' ]
]

换句话说,是一个多维数组。因此,您的 while 循环在编码时永远无法提取正确的 $row['user'] 值,因为 row 是整个结果集,包装在容器数组中。因此,您将查看数组中您认为自己所在位置的上一级。 IE。行数组,而不是单行。

正如 @Javad 的评论中提到的,您在 if 语句中的 file_exists 检查也是不正确的。

 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 注入(inject)漏洞,但它已经足够接近了,您应该认真考虑使用准备好的语句。

关于php mysql 注册表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46126933/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com