php mysql注册表表

php mysql注册表表,php,html,mysql,Php,Html,Mysql,我尝试过创建一个注册php代码,这样当我不在我的计算机上时,我就可以注册用户,但由于某种原因,它不会创建表,也不会创建文件夹,即使没有 输出为: (!)注意:未定义变量:db\u add\u user 新增用户 已创建用户文件夹 已创建用户图像文件夹 用户配置文件图片已经存在 没有创建用户表 完成 这是代码 connection.php <?php $servername = "localhost"; $username = "root"; $password = ""; // Cre

我尝试过创建一个注册php代码,这样当我不在我的计算机上时,我就可以注册用户,但由于某种原因,它不会创建表,也不会创建文件夹,即使没有

输出为:

(!)注意:未定义变量:db\u add\u 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\u add\u user

如果查询为false(或不返回任何结果),而从不运行,则从不设置变量。至少有一件事是“糟糕的形式”,那就是

键没有引号,这会发出类似undefined constant的警告,然后PHP将默认常量值设置为=常量的名称,或
name

这就是它失败的原因,这是值得怀疑的,但人们永远不知道。在任何情况下,当期望得到一个结果时,while循环本身是没有意义的。尤其是在使用
fetch\u数组
而不仅仅是
fetch
时。也就是说,我已经有4年没有使用Mysqli了,所以我现在在使用PDO时对它有点生疏。但是,除非我弄错了,
fetch\u array
应该返回整个结果集,从而也使得while循环毫无意义

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

注意-这不是必要的,只是作为一个答案,但对于评论来说太多了

接下来,当将
$\u POST
值直接连接到SQL中时,忽略它完全可以接受SQL注入的事实,就是您应该检查该POST项的值是否确实是它应该的值。如果不是这样,那么一切都会分崩离析。ie
$\u POST['user']
就是你认为的那样

还有,while循环中的另一件事

以我的方式通过你的代码
fetch\u数组
返回如下内容

 [
   0 => ['item' => 'value' ]
 ]
"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')"
换句话说,是一个多维数组。因此,您的while循环在编码时永远无法提取正确的
$row['user']
值,因为
row
是包装在容器数组中的整个结果集。因此,您将在阵列中查看一个级别,然后查看您所处的位置。即,一组行,而不是一行

正如@Javad在评论中提到的,您的
文件\u存在
检查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\u add\u user
。当它运行时,它将进入循环,因为这肯定不等于发布的用户值。如果选中格式不正确的文件存在检查,该文件将永远不存在,这将导致它创建正确的文件,因为这些文件的编码正确。因此,下次运行它时,它会执行相同的操作,创建与未命中编码文件不匹配的正确文件/文件夹

这句话非常令人不安(这就是我花时间解释以下内容的原因):

想象一下我把它作为我的密码发布

$_POST[pass] = "password', true, true, false )--";
--
注释了sql的其余部分,所以我只是让自己成为了你网站的管理员和主人。(假设您的意思是
true
,而不是
'true'
作为字符串)因为您的查询变成这样

 [
   0 => ['item' => 'value' ]
 ]
"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注入漏洞的习惯,但是它已经足够接近了,你应该认真考虑使用准备好的语句。

你可以在EFER条件下尝试ECHECK $插入表吗?然后直接在数据库中运行精确的查询,以便在查询中使用之前对输入进行清理,以防止sql注入,这并不重要,因为它在管理页面中,但最好这样做,我相信您的代码是倾向于sql注入攻击的,请使用dynamic(prepared语句)查询-最好每个用户使用PDO1表是一个糟糕的设计要检查文件_exists()输入并更新您的答案,他在单引号周围使用双引号,同时试图用双引号将用户连接到文件_exists(“'/website/live/u/”。$_POST[user]”
@Javad-我还没有做到这一点,但我还是很感激。我的意思是,它应该像
文件存在('/website/live/u/')。$\u POST[user])
,无论如何,很好地指出了所有这些!
"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')"