$stmt->bind_result(...) (even veel variabele als geselecteerde kolommen (PS. star select zuigt omdat je niet weet hoeveel dat er zijn)) zorgt er voor dat telkens wanneer je $stmt->fetch() aan roept de volgende rij in de opgegeven variabelen gezet wordt.
De query selecteert alleen het password veld. $stmt->bind_result($hash) bind het veld wachtwoord aan de variabele $hash.
$stmt->fetch(); fetchet de volgende (de enige) rij waarna $hash bruikbaar is.
$stmt->bind_result(...) (even veel variabele als geselecteerde kolommen (PS. star select zuigt omdat je niet weet hoeveel dat er zijn)) zorgt er voor dat telkens wanneer je $stmt->fetch() aan roept de volgende rij in de opgegeven variabelen gezet wordt.
De query selecteert alleen het password veld. $stmt->bind_result($hash) bind het veld wachtwoord aan de variabele $hash.
$stmt->fetch(); fetchet de volgende (de enige) rij waarna $hash bruikbaar is.
De s geeft aan dat de parameter die je bind een string is.
Als je meer velden wilt selecteren zoals uid, die ik blijkbaar over het hoofd heb gezien. Moet je inderdaad de query aanpassen.
<?php
// nieuwe regel 5
$stmt = $mysqli->prepare('SELECT uid, password FROM users WHERE username=? LIMIT 1');
// nieuwe regel 15
$stmt->bind_result($uid, $hash);
//nieuwe regel 27
$_SESSION['uid'] = $uid;
?>
De s geeft aan dat de parameter die je bind een string is.
Als je meer velden wilt selecteren zoals uid, die ik blijkbaar over het hoofd heb gezien. Moet je inderdaad de query aanpassen.
<?php
// nieuwe regel 5
$stmt = $mysqli->prepare('SELECT uid, password FROM users WHERE username=? LIMIT 1');
// nieuwe regel 15
$stmt->bind_result($uid, $hash);
//nieuwe regel 27
$_SESSION['uid'] = $uid;
?>
kan der ook gwn * staan?
[size=xsmall]Toevoeging op 27/09/2014 23:50:55:[/size]
De s geeft aan dat de parameter die je bind een string is.
Als je meer velden wilt selecteren zoals uid, die ik blijkbaar over het hoofd heb gezien. Moet je inderdaad de query aanpassen.
<?php
// nieuwe regel 5
$stmt = $mysqli->prepare('SELECT uid, password FROM users WHERE username=? LIMIT 1');
// nieuwe regel 15
$stmt->bind_result($uid, $hash);
//nieuwe regel 27
$_SESSION['uid'] = $uid;
?>
kan der ook gwn * staan?
nee dus
Warning: mysqli_stmt::bind_result(): Number of bind variables doesn't match number of fields in prepared statement in
[size=xsmall]Toevoeging op 27/09/2014 23:54:13:[/size]
heb nu dit
ik heb hem echt verkloot xd
<?php
require "config.php";
if ($_SERVER['REQUEST_METHOD'] == "POST" && isset($_POST['username'], $_POST['password'])) {
$stmt = $mysqli->prepare('SELECT * FROM user WHERE username=? LIMIT 1');
if ($stmt === FALSE) {
exit('er is een interne fout opgetreden, probeer het later nog eens');
}
$stmt->bind_param('s', $_POST['username']);
$stmt->execute();
$stmt->bind_result($username, $password, $id, $hash);
$fetched = $stmt->fetch();
if ($fetched === FALSE){
exit('er is een interne fout opgetreden, probeer het later nog eens');
}
if ($fetched) {
if (password_verify($_POST['password'], $hash)) {
$_SESSION['loggedin'] = "pizza";
$_SESSION['username'] = $_POST['username'];
echo $id;
echo "hallo";
exit;
} else {
echo 'username/wachtwoord combinatie incorrect'; // liever opslaan en netjes in de html zetten?
}
} else {
echo "user bestaat niet"; // zie bovenstaand
}
}
?>
<html>
<head>
<title>titel?</title>
<link rel="stylesheet" type="text/css" href="index.css" />
</head>
<body>
<div id="header">
<div id="links">
<img src="http://www.catalogs.com/info/bestof/wp-content/uploads/2011/09/62.jpg" width="172" height="100" align="center" />
</div>
<div id="midden">
</div>
<div id="rechts">
<form action="index.php" method="POST">
<?php echo $langusername; ?>:<br />
<input type="text" placeholder="gebruikersnaam" name="username" /><br />
Wachtwoord:<br />
<input type="password" name="password" placeholder="wachtwoord" /><br />
<input type="submit"id="login" value="login">
<input type='hidden' name='hidden' value=1>
</form>
</div>
</div>
<div class="clear"></div><!-- clear -->
<div id="footer" >
pizza met pereroni
</div>
</body>
</html>
star select zuigt omdat je niet weet hoeveel [velden] er zijn
Een sterretje selecteert alle velden uit de tabel.
Als dat 42 velden zijn moet je ook 42 variabele in bind_result() stoppen...
Wanneer je een veld toevoegt of weghaalt uit de tabel moet je ook de code weer aanpassen.
Een sterretje heeft de volgende 'voordelen':
- de query is iets kleiner
en de volgende nadelen
- je moet véél meer typen doordat elk veld door een variabele gerepresenteerd moet worden in bind_result()
- ook al voeg je een veld toe / verwijder/verplaats je een veld dat helemaal niets met je login script te maken heeft dan moet je nog steeds je login script aanpassen. (en mogelijk andere scripts waar je het zelfde doet
Alleen de juiste velden selecteren heeft de volgende voordelen:
- blijft werken als je velden toevoegt/verwijderd/verplaats die niets met inloggen te maken hebben
- je haal alleen op wat je nodig hebt
- minder typen
- je haalt meer informatie op uit de database dan nodig
en het volgende 'nadeel'
- de query is iets langer doordat deze specifieker is
Dus JA, het kan. Maar je bent dom bezig als je het doet.
Waarom wil je trouwens de username uit de database halen? Je hebt die al.
Het enige wat je nodig hebt in de bcrypt hash (ik ging er vanuit dat je deze opslaat in een veld genaamd 'password') en de primary key (waarschijnlijk een veld genaamd 'id') is ook wel fijn.
De select query en bind_result() moeten de zelfde volgorde gebruiken. Doe je dat niet dan komt de data niet in de juiste variabele te staan, PHP kan je gedachten namelijk niet lezen. Als het dat kon zouden we niet hoeven te programmeren, alleen denken aan wat we willen.