Σπίτι Αλλα Ακριβής ευρετήριο εγγραφή χρήστη php. Απλό σύστημα εγγραφής χρηστών

Ακριβής ευρετήριο εγγραφή χρήστη php. Απλό σύστημα εγγραφής χρηστών

Η διαδικασία δημιουργίας ενός συστήματος εγγραφής είναι αρκετή δουλειά. Πρέπει να γράψετε κώδικα που ελέγχει ξανά την εγκυρότητα των διευθύνσεων email, στέλνει email επιβεβαίωσης, προσφέρει τη δυνατότητα ανάκτησης κωδικών πρόσβασης, αποθηκεύει τους κωδικούς πρόσβασης σε ασφαλές μέρος, επικυρώνει φόρμες εισαγωγής και πολλά άλλα. Ακόμη και όταν τα κάνετε όλα αυτά, οι χρήστες θα είναι απρόθυμοι να εγγραφούν, αφού ακόμη και η πιο ελάχιστη εγγραφή απαιτεί τη δραστηριότητά τους.

Στο σημερινό σεμινάριο, θα αναπτύξουμε ένα απλό σύστημα εγγραφής που δεν θα απαιτεί κανέναν κωδικό πρόσβασης! Τα αποτελέσματα θα είναι ένα σύστημα που μπορεί εύκολα να τροποποιηθεί ή να ενσωματωθεί σε έναν υπάρχοντα ιστότοπο PHP. Αν σε ενδιαφέρει, συνέχισε να διαβάζεις.

PHP

Τώρα είμαστε έτοιμοι να ξεκινήσουμε με τον κώδικα PHP. Η κύρια λειτουργικότητα του συστήματος εγγραφής παρέχεται από την κατηγορία User, την οποία μπορείτε να δείτε παρακάτω. Η κλάση χρησιμοποιεί (), η οποία είναι μια μινιμαλιστική βιβλιοθήκη βάσης δεδομένων. Η κλάση χρήστη είναι υπεύθυνη για την πρόσβαση σε βάσεις δεδομένων, τη δημιουργία διακριτικών σύνδεσης και την επικύρωσή τους. Μας παρουσιάζει μια απλή διεπαφή που μπορεί εύκολα να ενσωματωθεί στο σύστημα εγγραφής των ιστοσελίδων σας που βασίζονται στην PHP.

User.class.php

// Ιδιωτική παρουσία ORM
ιδιωτική $orm;

/**
* Βρείτε έναν χρήστη με συμβολοσειρά διακριτικού. Λαμβάνονται μόνο έγκυρα διακριτικά
* εκτίμηση. Ένα διακριτικό είναι έγκυρο για 10 λεπτά μετά τη δημιουργία του.
* @param string $token Το διακριτικό για αναζήτηση
* @return Χρήστης
*/

Δημόσια στατική συνάρτηση findByToken($token)(

// Βρείτε το στη βάση δεδομένων και βεβαιωθείτε ότι η χρονική σήμανση είναι σωστή


->where ("token", $token)
->where_raw("token_validity > NOW()")
->find_one();

Αν(!$result)(
επιστροφή ψευδής?
}

Επιστροφή νέου χρήστη ($result);
}

/**
* Είτε συνδεθείτε είτε εγγραφείτε χρήστη.
* @return Χρήστης
*/

Δημόσια στατική συνάρτηση loginOrRegister($email)(

// Εάν υπάρχει ήδη ένας τέτοιος χρήστης, επιστρέψτε τον

If(User::exists($email))(
επιστροφή νέου χρήστη ($email);
}

// Διαφορετικά, δημιουργήστε το και επιστρέψτε το

Επιστροφή χρήστη::create($email);
}

/**
* Δημιουργήστε έναν νέο χρήστη και αποθηκεύστε τον στη βάση δεδομένων
* @param string $email Η διεύθυνση email του χρήστη
* @return Χρήστης
*/

Ιδιωτική στατική συνάρτηση δημιουργία($email)(

// Γράψτε έναν νέο χρήστη στη βάση δεδομένων και επιστρέψτε τον

$result = ORM::for_table("reg_users")->create();
$result->email = $email;
$result->save();

Επιστροφή νέου χρήστη ($result);
}

/**
* Ελέγξτε εάν υπάρχει ένας τέτοιος χρήστης στη βάση δεδομένων και επιστρέψτε ένα boolean.
* @param string $email Η διεύθυνση email του χρήστη
* @return boolean
*/

Υπάρχει δημόσια στατική συνάρτηση($email)(

// Υπάρχει ο χρήστης στη βάση δεδομένων;
$result = ORM::for_table("reg_users")
->where ("email", $email)
->count();

Επιστροφή $result == 1;
}

/**
* Δημιουργήστε ένα νέο αντικείμενο χρήστη
* @param $param Περίπτωση ORM, id, email ή null
* @return Χρήστης
*/

Δημόσια συνάρτηση __construct($param = null)(

If($param instanceof ORM)(

// Ένα στιγμιότυπο ORM πέρασε
$this->orm = $param;
}
else if(is_string($param))(

// Διαβιβάστηκε ένα μήνυμα ηλεκτρονικού ταχυδρομείου
$αυτό->
->where ("email", $param)
->find_one();
}
αλλού(

If(is_numeric($param))(
// Ένα αναγνωριστικό χρήστη μεταβιβάστηκε ως παράμετρος
$id = $param;
}
else if(isset($_SESSION["loginid"]))(

// Δεν μεταβιβάστηκε κανένα αναγνωριστικό χρήστη, κοιτάξτε τη συνεδρία
$id = $_SESSION["loginid"];
}

$this->orm = ORM::for_table("reg_users")
->where ("id", $id)
->find_one();
}

/**
* Δημιουργεί ένα νέο διακριτικό σύνδεσης SHA1, το γράφει στη βάση δεδομένων και το επιστρέφει.
* @return string
*/

Δημόσια συνάρτηση generateToken())(
// δημιουργεί ένα διακριτικό για τον συνδεδεμένο χρήστη. Αποθηκεύστε το στη βάση δεδομένων.

$token = sha1($this->email.time().rand(0, 1000000));

// Αποθηκεύστε το διακριτικό στη βάση δεδομένων,
// και σημειώστε το ως έγκυρο μόνο για τα επόμενα 10 λεπτά

$this->orm->set("token", $token);
$this->orm->set_expr("token_validity", "ADDTIME(NOW(),"0:10")");
$this->orm->save();

Επιστροφή $token;
}

/**
*Συνδεθείτε σε αυτόν τον χρήστη
* @return κενό
*/

Είσοδος δημόσιας λειτουργίας ()

// Επισήμανση του χρήστη ως συνδεδεμένου
$_SESSION["loginid"] = $this->orm->id;

// Ενημερώστε το πεδίο db last_login
$this->orm->set_expr("last_login", "NOW()");
$this->orm->save();
}

/**
* Καταστρέψτε τη συνεδρία και αποσυνδεθείτε από τον χρήστη.
* @return κενό
*/

Αποσύνδεση δημόσιας συνάρτησης()
$_SESSION = array();
unset($_SESSION);
}

/**
* Ελέγξτε εάν ο χρήστης είναι συνδεδεμένος.
* @return boolean
*/

Δημόσια συνάρτηση logedIn())(
return isset($this->orm->id) && $_SESSION["loginid"] == $this->orm->id;
}

/**
* Ελέγξτε εάν ο χρήστης είναι διαχειριστής
* @return boolean
*/

Δημόσια λειτουργία isAdmin())(
return $this->rank() == "διαχειριστής";
}

/**
* Βρείτε τον τύπο χρήστη. Μπορεί να είναι είτε admin είτε κανονικό.
* @return string
*/

Κατάταξη δημόσιας συνάρτησης())(
if($this->orm->rank == 1)(
επιστροφή "διαχειριστής"?
}

Επιστροφή "κανονική"?
}

/**
* Μαγική μέθοδος πρόσβασης στα στοιχεία του ιδιωτικού
* Το παράδειγμα $orm ως ιδιότητες του αντικειμένου χρήστη
* @param string $key Το όνομα της ιδιότητας στην οποία έχετε πρόσβαση
* @return μικτή
*/

Δημόσια συνάρτηση __get($key)(
if(isset($this->orm->$key))(
επιστροφή $this->orm->$key;
}

Επιστροφή null.
}
}
Τα διακριτικά δημιουργούνται χρησιμοποιώντας έναν αλγόριθμο και αποθηκεύονται σε μια βάση δεδομένων. Χρησιμοποιούμε MySQL για να ορίσουμε τη στήλη token_validity σε 10 λεπτά. Κατά την επικύρωση ενός διακριτικού, λέμε στον κινητήρα ότι χρειαζόμαστε ένα διακριτικό, το πεδίο token_validity δεν έχει ακόμη λήξει. Με αυτόν τον τρόπο περιορίζουμε το χρόνο κατά τον οποίο θα ισχύει το διακριτικό.

Σημειώστε ότι χρησιμοποιούμε τη μαγική μέθοδο __get() στο τέλος του εγγράφου για πρόσβαση στις ιδιότητες του αντικειμένου χρήστη. Αυτό μας επιτρέπει να έχουμε πρόσβαση σε δεδομένα που είναι αποθηκευμένα στη βάση δεδομένων ως ιδιότητες: $user->email, $user->token. Για παράδειγμα, ας δούμε πώς μπορούμε να χρησιμοποιήσουμε αυτήν την κλάση στο ακόλουθο απόσπασμα κώδικα:


Ένα άλλο αρχείο που αποθηκεύει την απαραίτητη λειτουργικότητα είναι το functions.php. Εκεί έχουμε μερικές βοηθητικές λειτουργίες που μας επιτρέπουν να διατηρήσουμε τον υπόλοιπο κώδικα πιο καθαρό.

Functions.php

Συνάρτηση send_email($from, $to, $subject, $message)(

// Λειτουργία βοήθειας για αποστολή email

$headers = "MIME-Έκδοση: 1.0" . "\r\n";
$headers .= "Τύπος περιεχομένου: text/plain; charset=utf-8" . "\r\n";
$headers .= "Από: ".$from . "\r\n";

Επιστροφή αλληλογραφίας ($to, $subject, $message, $headers);
}

συνάρτηση get_page_url())(

// Μάθετε τη διεύθυνση URL ενός αρχείου PHP

$url = "http".(empty($_SERVER["HTTPS"])?"":"s")."://".$_SERVER["SERVER_NAME"];

If(isset($_SERVER["REQUEST_URI"]) && $_SERVER["REQUEST_URI"] != "")(
$url.= $_SERVER["REQUEST_URI"];
}
αλλού(
$url.= $_SERVER["PATH_INFO"];
}

Επιστροφή $url;
}

συνάρτηση rate_limit($ip, $limit_hour = 20, $limit_10_min = 10)(

// Ο αριθμός των προσπαθειών σύνδεσης για την τελευταία ώρα από αυτήν τη διεύθυνση IP

$count_hour = ORM::for_table("reg_login_attempt")
->
->where_raw("ts > SUBTIME(NOW(),"1:00")")
->count();

// Ο αριθμός των προσπαθειών σύνδεσης για τα τελευταία 10 λεπτά από αυτήν τη διεύθυνση IP

$count_10_min = ORM::for_table("reg_login_ttempt")
->where("ip", sprintf("%u", ip2long($ip)))
->where_raw("ts > SUBTIME(NOW(),"0:10")")
->count();

If($count_hour > $limit_hour || $count_10_min > $limit_10_min)(
ρίχνει νέα Εξαίρεση ("Πάρα πολλές προσπάθειες σύνδεσης!");
}
}

συνάρτηση rate_limit_tick($ip, $email)(

// Δημιουργία νέας εγγραφής στον πίνακα προσπάθειας σύνδεσης

$login_attempt = ORM::for_table("reg_login_attempt")->create();

$login_attempt->email = $email;
$login_attempt->ip = sprintf("%u", ip2long($ip));

$login_attempt->save();
}

ανακατεύθυνση συνάρτησης($url)(
header("Τοποθεσία: $url");
έξοδος;
}
Οι συναρτήσεις rate_limit και rate_limit_tick μας επιτρέπουν να περιορίσουμε τον αριθμό των προσπαθειών εξουσιοδότησης για μια συγκεκριμένη χρονική περίοδο. Οι προσπάθειες εξουσιοδότησης καταγράφονται στη βάση δεδομένων reg_login_attempt. Αυτές οι λειτουργίες ενεργοποιούνται όταν επαληθευτεί η φόρμα σύνδεσης, όπως μπορείτε να δείτε στο παρακάτω απόσπασμα κώδικα.

Ο παρακάτω κώδικας ελήφθη από το index.php και είναι υπεύθυνος για την επικύρωση της φόρμας σύνδεσης. Επιστρέφει μια απάντηση JSON που καθοδηγείται από τον κώδικα jQuery που είδαμε στο assets/js/script.js.

index.php

If(!empty($_POST) && isset($_SERVER["HTTP_X_REQUESTED_WITH"]))(

// Εξαγωγή κεφαλίδας JSON

Header("Content-type: application/json");

// Είναι έγκυρη η διεύθυνση email;

If(!isset($_POST["email"]) || !filter_var($_POST["email"], FILTER_VALIDATE_EMAIL))(
ρίχνει νέα Εξαίρεση ("Παρακαλώ εισάγετε ένα έγκυρο email.");
}

// Αυτό θα δημιουργήσει μια εξαίρεση εάν το άτομο είναι παραπάνω
// τα επιτρεπόμενα όρια προσπάθειας σύνδεσης (δείτε το functions.php για περισσότερα):
rate_limit($_SERVER["REMOTE_ADDR"]);

// Καταγράψτε αυτήν την προσπάθεια σύνδεσης
rate_limit_tick($_SERVER["REMOTE_ADDR"], $_POST["email"]);

// Στείλτε το μήνυμα στον χρήστη

$message = "";
$email = $_POST["email"];
$subject = "Ο σύνδεσμος σύνδεσής σας";

Εάν(!Χρήστης::υπάρχει($email))(
$subject = "Σας ευχαριστούμε για την εγγραφή!";
$message = "Σας ευχαριστούμε για την εγγραφή σας στον ιστότοπό μας!\n\n";
}

// Προσπαθήστε να συνδεθείτε ή να εγγράψετε το άτομο
$user = Χρήστης::loginOrRegister($_POST["email"]);

$message.= "Μπορείτε να συνδεθείτε από αυτήν τη διεύθυνση URL:\n";
$message.= get_page_url()."?tkn=".$user->generateToken()."\n\n";

$message.= "Ο σύνδεσμος θα λήξει αυτόματα μετά από 10 λεπτά.";

$result = send_email($fromEmail, $_POST["email"], $subject, $message);

Αν(!$result)(
ρίχνει νέα Εξαίρεση ("Παρουσιάστηκε σφάλμα κατά την αποστολή του email σας. Δοκιμάστε ξανά.");
}

Die(json_encode(array(
"message" => "Ευχαριστούμε! Έχουμε στείλει έναν σύνδεσμο στα εισερχόμενά σας. Ελέγξτε επίσης το φάκελο ανεπιθύμητης αλληλογραφίας σας."
)));
}
}
catch(Εξαίρεση $e)(

Die(json_encode(array(
"error"=>1,
"message" => $e->getMessage()
)));
}
Μετά την επιτυχή εξουσιοδότηση ή εγγραφή, ο παραπάνω κωδικός στέλνει ένα email στο άτομο με έναν σύνδεσμο για εξουσιοδότηση. Το διακριτικό διατίθεται ως μεταβλητή $_GET "tkn" λόγω της διεύθυνσης URL που δημιουργείται.

index.php

If(isset($_GET["tkn"]))(

// Είναι αυτό ένα έγκυρο διακριτικό σύνδεσης;
$user = Χρήστης::findByToken($_GET["tkn"]);

//Ναί! Συνδεθείτε στο χρήστη και ανακατευθυνθείτε στην προστατευμένη σελίδα.

$user->login();
redirect("protected.php");
}

// Μη έγκυρο διακριτικό. Ανακατεύθυνση πίσω στη φόρμα σύνδεσης.
ανακατεύθυνση ("index.php");
}
Η εκτέλεση της $user->login() θα δημιουργήσει τις απαραίτητες μεταβλητές περιόδου λειτουργίας, επιτρέποντας στον χρήστη να παραμείνει συνδεδεμένος στις επόμενες συνδέσεις.

Η αποσύνδεση από το σύστημα υλοποιείται με τον ίδιο περίπου τρόπο:

Ευρετήριο.php

If(isset($_GET["logout"]))(

$user = νέος χρήστης();

If($user->loggedIn())(
$user->logout();
}

Ανακατεύθυνση ("index.php");
}
Στο τέλος του κώδικα, ανακατευθύνουμε ξανά τον χρήστη στο index.php, οπότε η παράμετρος ?logout=1 στη διεύθυνση URL εξαλείφεται.

Το αρχείο μας index.php θα χρειαστεί επίσης προστασία - δεν θέλουμε οι ήδη συνδεδεμένοι χρήστες να βλέπουν τη φόρμα. Για να το κάνουμε αυτό χρησιμοποιούμε τη μέθοδο $user->loggedIn():

Ευρετήριο.php

$user = νέος χρήστης();

if($user->loggedIn())(
redirect("protected.php");
}
Τέλος, ας δούμε πώς μπορείτε να προστατεύσετε τη σελίδα του ιστότοπού σας και να την κάνετε προσβάσιμη μόνο μετά από εξουσιοδότηση:

προστατευμένο.php

// Για να προστατεύσετε οποιαδήποτε σελίδα php στον ιστότοπό σας, συμπεριλάβετε το main.php
// και δημιουργήστε ένα νέο αντικείμενο χρήστη. Είναι τόσο απλό!

require_once "includes/main.php";

$user = νέος χρήστης();

if(!$user->loggedIn())(
ανακατεύθυνση ("index.php");
}
Μετά από αυτόν τον έλεγχο, μπορείτε να είστε σίγουροι ότι ο χρήστης έχει συνδεθεί με επιτυχία. Θα έχετε επίσης πρόσβαση σε δεδομένα που είναι αποθηκευμένα στη βάση δεδομένων ως ιδιότητες του αντικειμένου $user. Για να εμφανίσετε το email του χρήστη και την κατάταξή του, χρησιμοποιήστε τον ακόλουθο κώδικα:

Echo "Το email σας: ".$user->email;
echo "Η κατάταξη σας: ".$user->rank();
Εδώ η rank() είναι η μέθοδος επειδή η στήλη κατάταξης στη βάση δεδομένων περιέχει συνήθως αριθμούς (0 για κανονικούς χρήστες και 1 για διαχειριστές) και πρέπει να μετατρέψουμε όλους αυτούς σε ονόματα κατάταξης, κάτι που υλοποιείται χρησιμοποιώντας αυτήν τη μέθοδο. Για να μετατρέψετε έναν τυπικό χρήστη σε διαχειριστή, απλώς επεξεργαστείτε την καταχώριση του χρήστη στο phpmyadmin (ή σε οποιοδήποτε άλλο πρόγραμμα βάσης δεδομένων). Ως διαχειριστής, ο χρήστης δεν θα έχει ειδικές δυνατότητες. Εσείς έχετε το δικαίωμα να επιλέξετε ποια δικαιώματα θα παραχωρήσετε στους διαχειριστές.

Ετοιμος!

Με αυτό το απλό σύστημα εγγραφής μας είναι έτοιμο! Μπορείτε να το χρησιμοποιήσετε σε έναν υπάρχοντα ιστότοπο PHP ή να τον εκσυγχρονίσετε ώστε να ταιριάζει στις δικές σας απαιτήσεις.

Γεια σας, φίλοι σε αυτό το σεμινάριο θα μάθουμε την εγγραφή χρήστη και τη σύνδεση χρησιμοποιώντας την αποθηκευμένη διαδικασία PHP.
Δομή αρχείου για αυτό το σεμινάριο
config.php
index.php
check_availability.php
login.php
καλωσορίσατε.php
αποσύνδεση.php
Δομή του πίνακα sql tblregistration

ΔΗΜΙΟΥΡΓΙΑ ΠΙΝΑΚΑΣ `tblregistration` (`id` int(11) NOT NULL, `FullName` varchar(200) NOT NULL, `EmailId` varchar(200) NOT NULL, `Password` varchar(255) NOT NULL, Timestamp `RegDate` NOT NULL DEFAULT CURRENT_TIMESTAMP) ENGINE=InnoDB DEFAULT CHARSET=latin1;

config.php

Δημιουργήστε αρχείο διαμόρφωσης db χρησιμοποιώντας την επέκταση mysqli. Παρέχετε διαπιστευτήρια σύμφωνα με τη διαμόρφωσή σας

index.php

Δημιουργήστε μια φόρμα html για εγγραφή χρήστη.

Εγγραφή Ονοματεπώνυμο E-mail Κωδικός πρόσβασης

Εχουν ήδη καταχωρηθεί. συνδεθείτε εδώ

Jquery / Ajax για διαθεσιμότητα email χρήστη

check_availability.php

Σε αυτή τη σελίδα θα ελέγξουμε τη διαθεσιμότητα email του χρήστη. Δημιουργήστε μια διαδικασία καταστήματος με διαθεσιμότητα ελέγχου ονόματος
Κωδικός διαδικασίας αποθήκευσης:

DELIMITER $ CREATE DEFINER=`root`@`localhost` PROCEDURE `checkavailbilty`(IN `email` VARCHAR(255)) NO SQL SELECT EmailId FROM tblregistration WHERE EmailId=email$ DELIMITER ;

Τώρα δημιουργήστε μια διαδικασία καταστήματος για εγγραφή χρήστη.
Διαδικασία αποθήκευσης για εγγραφή χρήστη

DELIMITER $ CREATE DEFINER=`root`@`localhost` PROCEDURE `registration`(IN `fname` VARCHAR(200), IN `emailid` VARCHAR(200), IN `password` VARCHAR(255)) ΚΑΜΙΑ εισαγωγή SQL στην tblregistration( Πλήρες Όνομα, Αναγνωριστικό ηλεκτρονικού ταχυδρομείου, Κωδικός πρόσβασης) VALUES (όνομα, διεύθυνση ηλεκτρονικού ταχυδρομείου, κωδικός πρόσβασης)$ DELIMITER ;

Μετά τη δημιουργία της διαδικασίας αποθήκευσης, εκτελέστε τη διαδικασία αποθήκευσης.

Εδώ είναι ο πλήρης κώδικας που έχουμε γράψει για εγγραφή (index.php):

Εγγραφή χρησιμοποιώντας τη λειτουργία Store Procedure checkAvailability() ( $("#loaderIcon").show(); jQuery.ajax(( url: "check_availability.php", data:"emailid="+$("#email").val (), τύπος: "POST", success:function(data)( $("#user-availability-status").html(data); $("#loaderIcon").hide(); ), error:function ()() )); ) Εγγραφή Ονοματεπώνυμο Κωδικός e-mail

Εχουν ήδη καταχωρηθεί. συνδεθείτε εδώ

login.php

Δημιουργήστε μια φόρμα σύνδεσης σύνδεση χρήστη.

Σύνδεση

Δεν έχετε εγγραφεί; Δημιουργία λογαριασμού

Τώρα δημιουργήστε μια διαδικασία αποθήκευσης για σύνδεση με όνομα σύνδεσης.
Διαδικασία σύνδεσης στο κατάστημα:

DELIMITER $ CREATE DEFINER=`root`@`localhost` PROCEDURE `login`(IN `useremail` VARCHAR(255), IN `password` VARCHAR(255)) NO SQL SELECT EmailId,Password from tblregistration όπου EmailIdsword=use κωδικός$ DELIMITER ;

Τώρα εκτελέστε τη διαδικασία αποθήκευσης σύνδεσης

Νέο στον ιστότοπο

>

Δημοφιλέστερος