私は学校プロジェクト用のウェブサイトを作っていて、変数の取得に問題があります。mysqlクエリを実行する必要があります。行171の$ username変数は定義されていませんが、別のPHPコードから変数を取得する方法
<?php
session_start();
$_SESSION['visited']=false;
require_once ('../php/dblink.php');
?>
<html>
<head>
<link href="../css/style.css" rel="stylesheet" type="text/css" media="screen" />
<meta charset="UTF-8">
<title>test</title>
</head>
<body>
<div id = "logo">
</div>
<div id = "header">
</div>
<div id = "login">
<?php
$rConn = mysql_connect('localhost', 'root' , '');
require_once ('../php/dblink.php');
if((false === is_resource($rConn)) || (false === mysql_select_db('accounts', $rConn)))
{
echo mysql_error();
exit;
}
if(isset($_POST['login']))
{
if(!empty($_POST['benutzername']) && !empty ($_POST['passwort']))
{
mysql_select_db("accounts");
$username = mysql_real_escape_string($_POST['benutzername']);
$pw = mysql_real_escape_string($_POST['passwort']);
$result = mysql_query("SELECT * FROM benutzer where benutzer_name='$username'and password = '$pw' LIMIT 1");
if(!$result)
{
die(mysql_error());
}else
{
$row = mysql_fetch_array($result);
if ($row['benutzer_name']==$username && $row['password']==$pw)
{
echo"login erfolgreich !!!";
echo"Willkommen";
echo" ";
echo"$username";
$_SESSION['visited']=true;
echo $row['benutzer_name'];
}
else
{
echo"falsche daten";
$_SESSION['visited']=false;
}
}
}
else
{
echo"bitte Benutzernamen und Passwort eingeben !";
}
}
?>
<?php
echo "<form method='post'>";
if ($_SESSION['visited']==true)
{
echo "<center><button type='submit' name='Logout'>Auslogen</button></center>";
IF(isset($_POST['Logout']))
{
$_SESSION['visited']=false;
session_destroy();
}
}
else{
?>
<form method='post'>
<label>Benutzername:</label> <input type='text' name='benutzername' /><br />
<label>Vorname:</label> <input type='text' name='vorname' /><br />
<label>Passwort:</label> <input type='password' name='passwort' /><br />
<input type='submit' name='speichern' value='Registrieren' />
</form>
<form method='post' action="../html/index.php">
<label>Benutzername:</label> <input type='text' name='benutzername' /><br />
<label>Passwort:</label> <input type='password' name='passwort' /><br />
<input type='submit' name='login' value='Login' />
</form>
<?php
}
if(isset($_POST['speichern'] ))
{
$vorname = $_POST['vorname'];
$benutzername = $_POST['benutzername'];
$passwort = $_POST['passwort'];
// $sql = 'UPDATE person SET name="'.$name.'" WHERE benutzername="1"';
$sql = 'INSERT INTO benutzer (benutzer_name, vorname, password)
VALUES (
"'.mysqli_real_escape_string($db_link, $benutzername).'",
"'.mysqli_real_escape_string($db_link, $vorname).'",
"'.mysqli_real_escape_string($db_link, $passwort).'"
)';
$db_erg = mysqli_query($db_link, $sql);
$error_meld = mysqli_error($db_link);
$dublikat = strpos($error_meld, "Duplicate") !== false;
if($db_erg == 1)
{
echo "<span style='color:darkgreen;'>Neuer Benutzer ".$benutzername." angelegt!</span>";
}
else
{
if($dublikat)
echo "<span style='color:darkred;'>".$benutzername." ist schon vorhanden!</span>";
else
echo "<span style='color:darkred;'>Fehler!</span>";
}
}
?>
</div>
<div id = "links_mid">
</div>
<div id = "rechts_mid">
</div>
<div id = "textarea">
<?php
echo '<pre>';print_r($_SESSION);print_r($_POST);echo '</pre>';
if ($_SESSION['visited']==true) // Hier ist Content für Leute die eingeloggt sind !
{
echo"<form action='?aendern=1' method='post'>";
echo"<label>Passwort Ändern :</label> <input type='password' name='new_pw' /><br />";
echo"<input type='submit' name='change' value='aendern' />";
echo"</form>";
}
IF(isset($_POST['change']))
{
$neues_psw = $_POST['new_pw'];
$ch_query=mysql_query("update benutzer set password='$neues_psw' where benutzer_name='$username'");
$db_erg = mysqli_query($db_link , $ch_query);
if(! $db_erg)
{
die(mysql_error());
}else
{
echo"Passwort wurde geändert";
}
}
?>
</div>
<div id = "footer">
<address>
test
</address>
</div>
</body>
</html>
強盗のルール:あなたがそれを防ぐことができるならば、関数は単一のスクリーンの高さより長くならないべきです。あなたのコードは現在の状態では追いつくのが本当に難しいです。 – arkascha
それとは別に、廃止予定の古い「mysql」拡張機能を使用しています。最新の 'mysqli'または' PDO'拡張モジュールに切り替えると、PHPをアップグレードする瞬間にコードが動作しなくなります。また、 "prepared statements"と "parameter binding"を使うことのメリットについても読んで学びましょう。これは現在行っている手動エスケープの必要性を取り除きます。 – arkascha
次に、1つのデータベースにパスワードを格納しません。平文ではなく、「暗号化されていない」。あなたが保存するものは、パスワードの_ハッシュです。次に、認証時に、提供されたログインパスワードを再度ハッシュし、パスワードではなく、両方のハッシュを比較します。そうすれば、誰かがあなたのデータベースの詳細を取得しても、あなたのユーザーアカウントを妥協することはありません。 – arkascha