Ik heb een probleempje met een login, ik heb het niet zelf geschreven zoals jullie het van mij gewent zijn, maar toch vraag ik het hier maar. Het werkt met mysqli en php 5.4 en hoger. Er zit ook een registratie script waar het wachtwoord is beveiligt met hash, Maar het heeft alleen geen activatie script, en het werkt op zich prima,. Alleen heb ik een probleempje met inloggen. namelijk dat in de database mijn naam met een hoofdletter staat, maar dat ik kan inloggen zonder hoofdletter. En volgens mij hoef ik alleen in het inlog script iets te wijzigen, zodat de naam wel met een hoofdletter moet worden ingevuld, Alleen ik weet niet wat en waar.
Hier onder het inlog script.


<?php

/**
 * Class login
 * handles the user's login and logout process
 */
class Login
{
    /**
     * @var object The database connection
     */
    private $db_connection = null;
    /**
     * @var array Collection of error messages
     */
    public $errors = array();
    /**
     * @var array Collection of success / neutral messages
     */
    public $messages = array();

    /**
     * the function "__construct()" automatically starts whenever an object of this class is created,
     * you know, when you do "$login = new Login();"
     */
    public function __construct()
    {
        // create/read session, absolutely necessary
        session_start();

        // check the possible login actions:
        // if user tried to log out (happen when user clicks logout button)
        if (isset($_GET["logout"])) {
            $this->doLogout();
        }
        // login via post data (if user just submitted a login form)
        elseif (isset($_POST["login"])) {
            $this->dologinWithPostData();
        }
    }

    /**
     * log in with post data
     */
    private function dologinWithPostData()
    {
        // check login form contents
        if (empty ($_POST['user_name'])) {
            $this->errors[] = "Gebruikernaam is leeg.";
        } elseif (empty($_POST['user_password'])) {
            $this->errors[] = "Wachtwoord is leeg.";
        } elseif (!empty($_POST['user_name']) && !empty($_POST['user_password'])) {

            // create a database connection, using the constants from config/db.php (which we loaded in index.php)
            $this->db_connection = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);

            // change character set to utf8 and check it
            if (!$this->db_connection->set_charset("utf8")) {
                $this->errors[] = $this->db_connection->error;
            }

            // if no connection errors (= working database connection)
            if (!$this->db_connection->connect_errno) {

                // escape the POST stuff
                $user_name = $this->db_connection->real_escape_string($_POST['user_name']);

                // database query, getting all the info of the selected user (allows login via email address in the
                // username field)
                $sql = "SELECT user_name, user_email, user_password_hash
                        FROM users
                        WHERE user_name = '" . $user_name . "' OR user_email = '" . $user_name . "';";
                $result_of_login_check = $this->db_connection->query($sql);

                // if this user exists
                if ($result_of_login_check->num_rows == 1) {

                    // get result row (as an object)
                    $result_row = $result_of_login_check->fetch_object();

                    // using PHP 5.5's password_verify() function to check if the provided password fits
                    // the hash of that user's password
                    if (password_verify($_POST['user_password'], $result_row->user_password_hash)) {

                        // write user data into PHP SESSION (a file on your server)
                        $_SESSION['user_name'] = $result_row->user_name;
                        $_SESSION['user_email'] = $result_row->user_email;
                        $_SESSION['user_login_status'] = 1;

                    } else {
                        $this->errors[] = "Fout wachtwoord. probeer het opnieuw.";
                    }
                } else {
                    $this->errors[] = "Deze gebruikernaam bestaat niet.";
                }
            } else {
                $this->errors[] = "Database connectie  heeft een probleem.";
            }
        }
    }

    /**
     * perform the logout
     */
    public function doLogout()
    {
        // delete the session of the user
        $_SESSION = array();
        session_destroy();
        // return a little feeedback message
        $this->messages[] = "Je bent uitgelogt.";

    }

    /**
     * simply return the current state of the user's login
     * @return boolean user's login status
     */
    public function isUserLoggedIn()
    {
        if (isset($_SESSION['user_login_status']) AND $_SESSION['user_login_status'] == 1) {
            return true;
        }
        // default return
        return false;
    }
}

?>
[/code]
Ja dat probleem speelt nog steeds.
En ik kan inloggen username en password En met emailadres en wachtwoord.
Hier onder de database zoals ik het nu heb.

CREATE TABLE `users` (
  `user_id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'auto incrementing user_id of each user, unique index',
  `user_name` varchar(64) COLLATE latin1_general_cs NOT NULL COMMENT 'user''s name, unique',
  `user_password_hash` varchar(255) COLLATE latin1_general_cs NOT NULL COMMENT 'user''s password in salted and hashed format',
  `user_email` varchar(64) COLLATE latin1_general_cs NOT NULL COMMENT 'user''s email, unique',
  PRIMARY KEY (`user_id`),
  UNIQUE KEY `user_name` (`user_name`),
  UNIQUE KEY `user_email` (`user_email`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 COLLATE=latin1_general_cs COMMENT='user data' AUTO_INCREMENT=4 ;
Ik vraag me af of het eigenlijk wel zo belangrijk is om met hoofd of kleine letter het invoerveld username case sensitive te maken. Immers, als het wachtwoord niet samen met de username klopt kan er nooit een match ontstaan. Met andere woorden ben je niet een probleem aan het oplossen wat eigenlijk geen probleem is?
Je kunt inderdaad beter over de hele linie standaardiseren op UTF-8 (waaronder CHARSET=utf8 COLLATE=utf8_general_ci in MySQL) en daarna bijvoorbeeld deze query uitvoeren met SELECT BINARY inclusief de BINARY-operator.

SELECT 'a' = 'A' is namelijk 1 maar SELECT BINARY 'a' = 'A' is 0.
Bart V B
Ja heb je wel gelijk

Wart van der Put
Dat was ook de eerste database, en ik kan die ook zo weer terug zetten.
Niet dat het enig verschil uit maakt voor de uitvoer, ik heb dat alleen veranderd om te kijken of het wat uit maakte in verband met die hoofdletters.
Maar ik heb het weer terug gezet naar de orginele database zoals hier onder.

CREATE TABLE IF NOT EXISTS `users` (
  `user_id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'auto incrementing user_id of each user, unique index',
  `user_name` varchar(64) COLLATE utf8_unicode_ci NOT NULL COMMENT 'user''s name, unique',
  `user_password_hash` varchar(255) COLLATE utf8_unicode_ci NOT NULL COMMENT 'user''s password in salted and hashed format',
  `user_email` varchar(64) COLLATE utf8_unicode_ci NOT NULL COMMENT 'user''s email, unique',
  PRIMARY KEY (`user_id`),
  UNIQUE KEY `user_name` (`user_name`),
  UNIQUE KEY `user_email` (`user_email`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='user data' AUTO_INCREMENT=4 ;

En ik heb dat login script een beetje aangepast en de user_name veranders in user_email en of verwijderd, En nu kan ik alleen nog maar inloggen met emailadres en wachtwoord.
Opgelost ik heb voor de user_name de COLATE veranderd naar latin1_general_cs

Maar toch heel bedankt allemaan voor goed bedoelde adviezen.

Reageren