From 0a68f5d893639e66cef39f1f1d86f2c13401a995 Mon Sep 17 00:00:00 2001 From: Carolina Tronci <81708295+bubu2323@users.noreply.github.com> Date: Sun, 24 Jul 2022 11:45:35 +0200 Subject: [PATCH] First commit Upload files --- README.md | 48 ++++++++++++++++ create_privilege.php | 68 ++++++++++++++++++++++ create_user.php | 121 +++++++++++++++++++++++++++++++++++++++ css/form.css | 104 ++++++++++++++++++++++++++++++++++ delete.php | 16 ++++++ edit_user.php | 110 +++++++++++++++++++++++++++++++++++ img/login.png | Bin 0 -> 16615 bytes img/logo.png | Bin 0 -> 15023 bytes img/show.png | Bin 0 -> 36394 bytes index.php | 83 +++++++++++++++++++++++++++ login/registration.php | 126 +++++++++++++++++++++++++++++++++++++++++ partials/head.php | 11 ++++ partials/js-bs.html | 3 + partials/nav.php | 26 +++++++++ show.php | 73 ++++++++++++++++++++++++ utils/validation.php | 8 +++ 16 files changed, 797 insertions(+) create mode 100644 README.md create mode 100644 create_privilege.php create mode 100644 create_user.php create mode 100644 css/form.css create mode 100644 delete.php create mode 100644 edit_user.php create mode 100644 img/login.png create mode 100644 img/logo.png create mode 100644 img/show.png create mode 100644 index.php create mode 100644 login/registration.php create mode 100644 partials/head.php create mode 100644 partials/js-bs.html create mode 100644 partials/nav.php create mode 100644 show.php create mode 100644 utils/validation.php diff --git a/README.md b/README.md new file mode 100644 index 0000000..2c4e904 --- /dev/null +++ b/README.md @@ -0,0 +1,48 @@ + +# Login and CRUD project +======================================= + +developed from scratch by Carolina Tronci + +* * * + +This is my first elaborated project in PHP and it's a crud with a login form to access. +The application allows you to show the list of users, create a new one, modify and delete it. +To access these features it is necessary to be registered and to login. It is possible to register yourself on the appropriate page. + +### List of features + +* Login +* Registration +* Create +* Read +* Update +* Delete + +### Demo project + +[Show demo](http://crud-carolina-tronci.42web.io) + + +### screenshot + +![screenshot show users](/img/show.png "table users") +![screenshot login page](/img/login.png "login page") + + +### What I learned + +I have learned to develop this application by putting into practice the theory learned in the last few weeks. +The biggest difficulties were in the editing part, for example in the blindvalues part, but this allowed me to better understand how to manipulate the data received from a user through a form and how to avoid external attacks. +After implementing the first part of the CRUD, I decided to add the login functionality and it was a bit tricky but I enjoyed it. I learned the basics of cryptography and in particular how to send encrypted data to the database and retrieve it to verify correspondence. +For the graphic part I decided to use bootstrap and for the forms I started from an existing template found on the web and I modified it for my needs. +The project was very interesting and I will continue to work on it to improve it further. + + +### Author + +* Carolina Tronci + +### License + +This project is licensed under the MIT License diff --git a/create_privilege.php b/create_privilege.php new file mode 100644 index 0000000..015f16f --- /dev/null +++ b/create_privilege.php @@ -0,0 +1,68 @@ +setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + +$name = ""; +$privilege = ""; + +$error = false; + +if ($_SERVER["REQUEST_METHOD"] == "POST") { + $name = $_POST['name']; + $privilege = $_POST['privilege']; + + if (!empty($name) && !empty($privilege)) { + + $statement = $pdo->prepare("INSERT INTO type (name_privilege, privilege) VALUES (:name, :privilege)"); + $statement->bindValue(':name', $name); + $statement->bindValue(':privilege', $privilege); + $statement->execute(); + header("location:show.php"); + } else $error = true; +} +?> + + + + + +
+ +
+ + +
+ + + +
+ +
+

Create privilege

+ +
+ + +
+
+
+ + +
+ + +
+
+
+ + + + + \ No newline at end of file diff --git a/create_user.php b/create_user.php new file mode 100644 index 0000000..b040d78 --- /dev/null +++ b/create_user.php @@ -0,0 +1,121 @@ +setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + +$name = ""; +$surname = ""; +$adress = ""; +$citta = ""; +$type_id = ""; + +$error = false; +if ($_SERVER["REQUEST_METHOD"] == "GET") { + $query = $pdo->query("SELECT * FROM type"); + $privileges = $query->fetchAll(); +} + +if ($_SERVER["REQUEST_METHOD"] == "POST") { + $name = htmlspecialchars($_POST['name']); + $surname = htmlspecialchars($_POST['surname']); + $adress = htmlspecialchars($_POST['adress']); + $city = htmlspecialchars($_POST['city']); + $type_id = htmlspecialchars($_POST['type_id'], 0); + + if (!empty($name) && !empty($surname) && !empty($adress) && !empty($city) && !empty($type_id)) { + $statement = $pdo->prepare("INSERT INTO users (name, surname, adress, city, type_id) VALUES (:name, :surname, :adress, :city, :type_id)"); + $statement->bindValue(':name', $name); + $statement->bindValue(':surname', $surname); + $statement->bindValue(':adress', $adress); + $statement->bindValue(':city', $city); + $statement->bindValue(':type_id', $type_id); + $statement->execute(); + header("location:show.php"); + } else $error = true; +} + + + +?> + + + + + + +
+ +
+ + +
+
+ + + +
+ +

Insert new user

+
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+ +
+ +
+
+ +
+ + + +
+ +
+ +
+
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/css/form.css b/css/form.css new file mode 100644 index 0000000..ab427b1 --- /dev/null +++ b/css/form.css @@ -0,0 +1,104 @@ +.alert-width { + width: 20em; + margin: 0 auto; +} +.blue { + background-color: #15172b !important; +} +.form { + background-color: #15172b; + border-radius: 20px; + box-sizing: border-box; + padding: 1.3em; + width: 20em; + margin: 2em auto; +} + +.title { + color: #eee; + font-family: sans-serif; + font-size: 2.3em; + font-weight: 600; + margin-top: 0.3em; +} + +.input-container { + height: 3em; + position: relative; + width: 100%; +} + +.ic1, +.ic2 { + margin-top: 1.5em; +} + +.input, +select { + background-color: #303245; + border-radius: 12px; + border: 0; + box-sizing: border-box; + color: #eee; + height: 100%; + padding-left: 1em; + width: 100%; + outline: 0; +} + +.cut { + background-color: #15172b; + border-radius: 10px; + height: 20px; + left: 20px; + position: absolute; + top: -20px; + transform: translateY(0); + transition: transform 200ms; + width: 76px; +} + +.cut-short { + width: 50px; +} + +.input:focus ~ .cut, +.input:not(:placeholder-shown) ~ .cut { + transform: translateY(8px); +} + +.placeholder { + color: #65657b; + font-family: sans-serif; + left: 1em; + line-height: 14px; + pointer-events: none; + position: absolute; + transform-origin: 0 50%; + transition: transform 200ms, color 200ms; + top: 1.4em; + background-color: transparent; +} + +.input:focus ~ .placeholder, +.input:not(:placeholder-shown) ~ .placeholder { + transform: translateY(-30px) translateX(10px) scale(0.75); +} + +.input:focus ~ .placeholder { + color: #dc2f55; +} + +.submit { + background-color: rgb(18, 104, 157); + border-radius: 12px; + border: 0; + box-sizing: border-box; + color: #eee; + cursor: pointer; + font-size: 18px; + height: 50px; + margin-top: 1.5em; + text-align: center; + width: 100%; +} diff --git a/delete.php b/delete.php new file mode 100644 index 0000000..30fc214 --- /dev/null +++ b/delete.php @@ -0,0 +1,16 @@ +setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + +$id = $_POST['id']; +$error = false; + +if ($_SERVER["REQUEST_METHOD"] == "POST") { + if (!empty($id)) { + $statement = $pdo->prepare("DELETE FROM users WHERE users.id = $id"); + + $statement->execute(); + } else echo $error = true; + header("location:show.php"); +} diff --git a/edit_user.php b/edit_user.php new file mode 100644 index 0000000..8ceb9fb --- /dev/null +++ b/edit_user.php @@ -0,0 +1,110 @@ +setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); +$error = false; +$link_css = "'css/form.css'"; + + +if ($_SERVER['REQUEST_METHOD'] == 'GET') { + $query = $pdo->query("SELECT id,name,surname,adress FROM users"); + $data = $query->fetchAll(PDO::FETCH_ASSOC); + + $query = $pdo->query("SELECT * FROM type"); + $privileges = $query->fetchAll(); +} +if ($_SERVER['REQUEST_METHOD'] == 'POST') { + $name = htmlspecialchars($_POST['name']); + $surname = htmlspecialchars($_POST['surname']); + $adress = htmlspecialchars($_POST['adress']); + $city = htmlspecialchars($_POST['city']); + $type_id = (int) htmlspecialchars($_POST['type_id']); //privilegio id + + $id = $_POST['edit_user']; + if (!empty($name) && !empty($surname) && !empty($adress) && !empty($city) && !empty($type_id)) { + $query = $pdo->prepare("UPDATE users SET name = :name, surname = :surname, adress = :adress,city = :city, type_id = :type_id WHERE id = :id"); + $query->bindValue(':name', $name); + $query->bindValue(':surname', $surname); + $query->bindValue(':adress', $adress); + $query->bindValue(':city', $city); + $query->bindValue(':type_id', $type_id); + $query->bindValue(':id', $id); + $query->execute(); + header("location:show.php"); + }else $error = true; +} +?> + + + + + + +
+ +
+
+ + + +
+
+
Edit user
+ +
+ + + +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ + +
+ +
+ + + + + + \ No newline at end of file diff --git a/img/login.png b/img/login.png new file mode 100644 index 0000000000000000000000000000000000000000..176df15d97a9f160c899680c49f63af2a5e56258 GIT binary patch literal 16615 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 IJ3ReA00$QQ761SM literal 0 HcmV?d00001 diff --git a/img/logo.png b/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..51e37c6ac1fd657e3f85d359b7298f6e06e03caa GIT binary patch literal 15023 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 Rbu5vG4U7-u?02~I{{Zxp{9XV6 literal 0 HcmV?d00001 diff --git a/img/show.png b/img/show.png new file mode 100644 index 0000000000000000000000000000000000000000..61bf495d33ccab0475330b0d7250ce66b946e99f GIT binary patch literal 36394 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 literal 0 HcmV?d00001 diff --git a/index.php b/index.php new file mode 100644 index 0000000..46d4822 --- /dev/null +++ b/index.php @@ -0,0 +1,83 @@ +setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); +$title = 'login'; +$error = false; +$incorrect_psw = false; +$not_registred = false; + + + +if ($_SERVER['REQUEST_METHOD'] == 'POST') { + $username = htmlspecialchars($_POST['username']); + $psw = htmlspecialchars($_POST['psw']); + + if (!empty($username) && !empty($psw)) { + $query = $pdo->prepare('SELECT * FROM registered_users WHERE username = :username'); + + $query->bindValue(':username', $username); + $query->execute(); + + //find corrispondence insert user - db + $users = $query->fetchAll(PDO::FETCH_ASSOC); + + //verify if user exist and password matches + if (!empty($users)) { + if (password_verify($psw, $users[0]['password'])) header("location:show.php"); + else $incorrect_psw = true; + } else $not_registred = true; + } else $error = true; +} + + + + + +?> + + + + + + +
+ + + + insert all the fields +
" + ?> + + User not registered +
" + ?> + + Incorrect password. Try again + " + ?> + +
+

Login

+ +
+
+ +
+ +
+ +
+ +
+ +
+ + + +
+
+ + + + \ No newline at end of file diff --git a/login/registration.php b/login/registration.php new file mode 100644 index 0000000..ad93065 --- /dev/null +++ b/login/registration.php @@ -0,0 +1,126 @@ +setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); +$title = 'registration form'; + +$link_css = "'../css/form.css'"; +$error = false; +$psw_length_error = false; +$data_exist = false; + + + +if ($_SERVER["REQUEST_METHOD"] == "POST") { + + + + $email = test_input(filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)); + $username = test_input($_POST['username']); + $psw = test_input($_POST['password']); + $repeat_psw = test_input($_POST['repeat_password']); + + if (!empty($email) && !empty($username) && !empty($psw) && !empty($repeat_psw)) { + + if (strlen($psw) < 5 || strlen($repeat_psw) < 5) $psw_length_error = true; + else if ($psw == $repeat_psw) { + echo 'parametri rispettati.'; + //verify if insert data exist in db + $query = $pdo->prepare('SELECT username,email FROM registered_users WHERE username = :username OR email = :email'); + $query->bindValue(':username', $username); + $query->bindValue(':email', $email); + $query->execute(); + + $users = $query->fetchAll(PDO::FETCH_ASSOC); + + if (empty($users)) { + //crypy password and insert into database + $crypt_psw = password_hash($psw, PASSWORD_DEFAULT); + + + $statement = $pdo->prepare("INSERT INTO registered_users(id,username,password,email,registration_data) VALUES(NULL,:username,:password,:email,NULL)"); + $statement->bindValue(':username', $username); + $statement->bindValue(':password', $crypt_psw); + $statement->bindValue(':email', $email); + $statement->execute(); + echo 'dati inseriti.'; + header("location:../show.php"); + + } else $data_exist = true; + } + } else $error = true; +} + +?> + + + + + + +
+
+ + + Insert data +
" ?> + + + + + 5 is the min length for the password + " ?> + + + + + + username or email already exist + " ?> + + + + + + +
+ +

Registration form

+
> + +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+ +
+ + + + \ No newline at end of file diff --git a/partials/head.php b/partials/head.php new file mode 100644 index 0000000..1cc5c11 --- /dev/null +++ b/partials/head.php @@ -0,0 +1,11 @@ + + + + + + <?php echo $title ?> + + + > + + \ No newline at end of file diff --git a/partials/js-bs.html b/partials/js-bs.html new file mode 100644 index 0000000..5c32444 --- /dev/null +++ b/partials/js-bs.html @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/partials/nav.php b/partials/nav.php new file mode 100644 index 0000000..c0e592f --- /dev/null +++ b/partials/nav.php @@ -0,0 +1,26 @@ +
+ +
\ No newline at end of file diff --git a/show.php b/show.php new file mode 100644 index 0000000..e776966 --- /dev/null +++ b/show.php @@ -0,0 +1,73 @@ +setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + +if ($_SERVER['REQUEST_METHOD'] == 'GET') { + $statement = $pdo->prepare('SELECT users.*, type.name_privilege FROM users LEFT JOIN type ON users.type_id = type.id;'); + $statement->execute(); + $users = $statement->fetchAll(PDO::FETCH_ASSOC); +} + +?> + + + + + + +
+ +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameSurnameAdressCityType privilegeEditDelete
+ edit + +
+ +
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/utils/validation.php b/utils/validation.php new file mode 100644 index 0000000..64bd2c8 --- /dev/null +++ b/utils/validation.php @@ -0,0 +1,8 @@ +