Goedenavond,

Ik heb een login pagina geschreven in pdo, alleen ik heb een klein probleempje, als ik probeer in te loggen dan kan hij geen rows vinden terwijl de login informatie correct is.

De login code

<?php
include_once('library/databaseconnectie.php');
if (isset($_POST['login'])) {
    $username = ($_POST['loginname']);
    $password = ($_POST['password']);
    $browser = $_SERVER['HTTP_USER_AGENT'];

    // Login
    try {
        
        $loginsql = "SELECT * FROM `mx_users` WHERE `loginname` = ':username' AND `password` = ':password'";
        $login_stmt = $db->prepare($loginsql);
        $login_stmt->bindParam(1, $username);
        $login_stmt->bindParam(2, $password);
        $login_stmt->execute();
        
        if($login_stmt->rowCount() == 1) {
            echo "Hooray, row exists!";
        } else if($login_stmt->rowCount() < 1) {
            echo "No rows found.";
        }
        
    } catch (PDOException $e) {
        echo '<pre>';
        echo 'Line: ' . $e->getLine() . '<br />';
        echo 'File: ' . $e->getFile() . '<br />';
        echo 'Error Message: ' . $e->getMessage();
        echo '</pre>';
    }
}
?>


Maar zodra ik de $username en $password variable in de query zet inplaats van :username and :password werkt het wel, doe ik hier iets verkeerd?
De [php]rowCount[/php]-functie doet niet wat jij denkt dat ie doet.
Voor het tellen van rows kun je beter [php]count[/php] gebruiken.

Dit weet ik ook niet helemaal zeker, ik ben namelijk nog geen PDO-guru.
RobertJan Doeternietoe op 06/09/2013 20:21:30

Goedenavond,

Ik heb een login pagina geschreven in pdo, alleen ik heb een klein probleempje, als ik probeer in te loggen dan kan hij geen rows vinden terwijl de login informatie correct is.

De login code

<?php
include_once('library/databaseconnectie.php');
if (isset($_POST['login'])) {
    $username = ($_POST['loginname']);
    $password = ($_POST['password']);
    $browser = $_SERVER['HTTP_USER_AGENT'];

    // Login
    try {
        
        $loginsql = "SELECT * FROM `mx_users` WHERE `loginname` = ':username' AND `password` = ':password'";
        $login_stmt = $db->prepare($loginsql);
        $login_stmt->bindParam(1, $username);
        $login_stmt->bindParam(2, $password);
        $login_stmt->execute();
        
        if($login_stmt->rowCount() == 1) {
            echo "Hooray, row exists!";
        } else if($login_stmt->rowCount() < 1) {
            echo "No rows found.";
        }
        
    } catch (PDOException $e) {
        echo '<pre>';
        echo 'Line: ' . $e->getLine() . '<br />';
        echo 'File: ' . $e->getFile() . '<br />';
        echo 'Error Message: ' . $e->getMessage();
        echo '</pre>';
    }
}
?>


Maar zodra ik de $username en $password variable in de query zet inplaats van :username and :password werkt het wel, doe ik hier iets verkeerd?


je variabeles werken niet omdat je het verkeerd aanroept. dit is het goede script(volgendsmij):

<?php
include_once('library/databaseconnectie.php');
if (isset($_POST['login'])) {
    $username = ($_POST['loginname']);
    $password = ($_POST['password']);
    $browser = $_SERVER['HTTP_USER_AGENT'];

    // Login
    try {
        
        $loginsql = "SELECT * FROM `mx_users` WHERE `loginname` = :username AND `password` = :password";
        $login_stmt = $db->prepare($loginsql);
        $login_stmt->bindParam(:username, $username,PDO::PARAM_STR);
        $login_stmt->bindParam(:password, $password,PDO::PARAM_STR);
        $login_stmt->execute();
        
        if($login_stmt->rowCount() == 1) {
            echo "Hooray, row exists!";
        } else if($login_stmt->rowCount() < 1) {
            echo "No rows found.";
        }
        
    } catch (PDOException $e) {
        echo '<pre>';
        echo 'Line: ' . $e->getLine() . '<br />';
        echo 'File: ' . $e->getFile() . '<br />';
        echo 'Error Message: ' . $e->getMessage();
        echo '</pre>';
    }
}
?>

de veranderingen zijn:
quotes om de variabeles weg gehaalt(in de query) en in bindvalue 2 kleine dingen verander, de param toevoegen en ze een naam geven
uit PHP manual:
'PDOStatement::rowCount() returns the number of rows affected by the last DELETE, INSERT, or UPDATE statement executed by the corresponding PDOStatement object.'
dit is een SELECT, dus werkt dat niet. je moet de PHP functie count() gebruiken op je resultaten in de if. verder:
- niet selecteren met *, maar ieder veld benoemen
- geen backticks
-niet variabelen kopieren in regel 4-6
Jeroen VD op 07/09/2013 11:06:14

uit PHP manual:
'PDOStatement::rowCount() returns the number of rows affected by the last DELETE, INSERT, or UPDATE statement executed by the corresponding PDOStatement object.'
dit is een SELECT, dus werkt dat niet. je moet de PHP functie count() gebruiken op je resultaten in de if. verder:
- niet selecteren met *, maar ieder veld benoemen
- geen backticks
-niet variabelen kopieren in regel 4-6

PDOStatement::rowCount() werkt idd niet als je direct een query uitvoerd, echter wel als je prepare en execute doet
Bedankt voor de tips, heb het aangepast en het werkt nu. Alleen ik zit met een klein probleempje, zodra ik inlog krijg ik de volgende 2 errors:


Strict Standards: Only variables should be passed by reference in C:\server\htdocs\mafiaxtremedev\modules\login\main.php on line 11

Strict Standards: Only variables should be passed by reference in C:\server\htdocs\mafiaxtremedev\modules\login\main.php on line 12


Deze 2 lijnen zijn

$stmt->bindParam(':username', sha1($_POST['loginname']), PDO::PARAM_STR);
$stmt->bindParam(':password', sha1($_POST['password']), PDO::PARAM_STR);


Hij logt wel gewoon in, en werkt zoals het moet.

Dit is de complete login code:


<?php
defined('IN_ENGINE') or exit;
define('module_title', 'Login');


if (isset($_POST['login'])) {
    // Login
    try {
        $sql = "SELECT id, loginname, password FROM mx_users WHERE loginname = :username AND password = :password";
        $stmt = $db->prepare($sql);
        $stmt->bindParam(':username', sha1($_POST['loginname']), PDO::PARAM_STR);
        $stmt->bindParam(':password', sha1($_POST['password']), PDO::PARAM_STR);
        $stmt->execute();
        $row = $stmt->fetch(PDO::FETCH_ASSOC);

        if ($row['loginname'] == sha1($_POST['loginname']) && $row['password'] == sha1($_POST['password'])) {
            $login_message = "Please wait, you are being logged in.";
            $_SESSION['id'] = $row['id'];
            echo '<meta http-equiv="refresh" content="1;url=/index.php">';
        } else {
            $login_message = "Invalid login details";
        }
    } catch (PDOException $e) {
        echo '<pre>';
        echo 'Line: ' . $e->getLine() . '<br />';
        echo 'File: ' . $e->getFile() . '<br />';
        echo 'Error Message: ' . $e->getMessage();
        echo '</pre>';
    }
}
?>
<?php
        if (isset($login_message)) {
            echo "<div class='signup_result' style='text-align:center;font-weight:bold;margin-bottom:10px;'>" . $login_message . "</div>";
        }
        ?>
        <form action="index.php?module=login" method="post">
            <table class="centertable">
                <tr>
                    <td><b>Username</b></td>
                    <td><input type="text" name="loginname" value="" maxlength="16" /></td>
                </tr>
                <tr>
                    <td><b>Password</b></td>
                    <td><input type="password" name="password" maxlength="30" /></td>
                </tr>
                <tr>
                    <td></td>
                    <td><input type="submit" name="login" value="Login" style="width: 145px;" /></td>
                </tr>
            </table>
        </form>


Weet iemand hoe ik deze 2 errors uit mijn script kan krijgen? Heb zitten googlen maar wordt er niet wijzer van.

Met vriendelijke groet,
Robert-Jan

[size=xsmall]Toevoeging op 17/09/2013 18:53:48:[/size]

Na verder te googlen heb ik het gevonden, blijkbaar kon ik dus niet gelijk sha1() invoegen in de bindparam.

Dus heb ik het zo gedaan een extra variable aanmaken en invoegen in de bindparam.


<?php
if (isset($_POST['login'])) {
    // Login
    try {
        $sql = "SELECT id, loginname, password FROM mx_users WHERE loginname = :username AND password = :password";
        $stmt = $db->prepare($sql);
        $loginname = sha1($_POST['loginname']);
        $password = sha1($_POST['password']);
        $stmt->bindParam(':username', $loginname, PDO::PARAM_STR);
        $stmt->bindParam(':password', $password, PDO::PARAM_STR);
        $stmt->execute();
        $row = $stmt->fetch(PDO::FETCH_ASSOC);

        if ($row['loginname'] == sha1($_POST['loginname']) && $row['password'] == sha1($_POST['password'])) {
            $login_message = "Please wait, you are being logged in.";
            $_SESSION['id'] = $row['id'];
            echo '<meta http-equiv="refresh" content="1;url=/index.php">';
        } else {
            $login_message = "Invalid login details";
        }
    } catch (PDOException $e) {
        echo '<pre>';
        echo 'Line: ' . $e->getLine() . '<br />';
        echo 'File: ' . $e->getFile() . '<br />';
        echo 'Error Message: ' . $e->getMessage();
        echo '</pre>';
    }
}
?>
RobertJan Doeternietoe op 17/09/2013 18:16:33

Na verder te googlen heb ik het gevonden, blijkbaar kon ik dus niet gelijk sha1() invoegen in de bindparam.

Dus heb ik het zo gedaan een extra variable aanmaken en invoegen in de bindparam.

En de uitleg waarom is dat bindparam een referentie naar de variabele pakt om meerdere queries achter elkaar uit te kunnen voeren. Dat betekent dat je bijvoorbeeld 10 records kan invoeren, zonder dat je de hele tijd de waardes direct hoeft mee te geven. Je verbind een variabele via bindparam en elke keer dat je de query uitvoert zal de database driver naar de waarde kijken die op dat moment in die variabele zit.
Een functie kan je echter niet op die manier meegeven, want een functie heeft geen vast geheugenadres. Vandaar dat je de foutmelding kreeg.

Reageren