私はこれを理解しようとしています。それはかなり簡単ですが、私はミスを見つけることができません。間違いがforeachにあるように見えます。それを上回るすべてが機能するからです。私は入力を埋めるとログインボタンをクリックすると、スクリプトは動作しません。ログインは機能しません
if (isset($_POST['submit']) AND (!empty($_POST['username']) AND (!empty($_POST['password'])))) {
$username = $_POST['username'];
$password = $_POST['password'];
$pass = hash('sha256',$password);
$select = $db->prepare("SELECT * FROM users WHERE username= :username AND password= :password");
$select->bindParam(':username', $username);
$select->bindParam(':password', $pass);
$select->execute();
foreach ($select as $data) {
if ($data['username'] == $username AND $data['password'] == $pass) {
$_SESSION['username'] = $username;
$_SESSION['id'] = $data['id'];
?>
<div class="echos">
<?php
echo "Login completed" . "<br>";
echo "<a href='http://jezecek.nostools.cz/'>Homepage</a>";
}
else {
echo "Wrong username or password!" . "<br>";
echo "<a href='http://jezecek.nostools.cz/include/registration.php'>Try again</a>";
}
}
}
else {
echo "Fill all fields!" . "<br>";
echo "<a href='http://jezecek.nostools.cz/include/login.php'>Try again</a>";
}
?>
</div>
私はこのようにはfetchAll()を使用する場合でも、あなたのクエリからデータを取得していないので、それはまだdoesntの仕事
$select = $db->prepare("SELECT * FROM users WHERE username= :username AND password= :password");
$select->bindParam(':username', $username);
$select->bindParam(':password', $pass);
$select->execute();
$result = $select->fetchAll();
foreach ($result as $data) {
if ($data['username'] == $username AND $data['password'] == $pass) {
$_SESSION['username'] = $username;
$_SESSION['id'] = $data['id'];
?>
<div class="echos">
<?php
echo "Login completed" . "<br>";
echo "<a href='http://jezecek.nostools.cz/'>Homepage</a>";
}
まずは、 'paパスワードを安全に*ハッシュするためにssword_hash() 'を実行します。 sha256を一度呼び出すだけで安全です**。 –
'execute()'の後にデータをフェッチするのを忘れてしまいます。 http://php.net/manual/en/pdostatement.fetch.phpを参照してください – Saty
PDOで例外をスローするなど、データベース呼び出しにエラー処理を追加する必要があります。論理が間違っていることに注意してください。ユーザー名とパスワードの両方を選択すると、見つかる行は常にこれらの条件と一致します。この場合、行が見つからない場合は間違ったユーザー名/パスワードが発生します。 – jeroen