簡體   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