繁体   English   中英

php mysql注册表格

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM