2017-05-27 6 views
1

学校用のPHPとHTMLを使用してウェブサイトをプログラミングする必要があります。ログインに使用するスクリプトを作成しました。あなたが管理者としてログインしたときに最初に動作します。ただし、名前、名、ピンの学生としてログインすると、最後のif部分だけが実行され、再度ログインすることができます。すべての変数が正しいのに、econdを実行することはありませんか?

スクリプト

<html> 
<body> 
<?php 

mysql_connect("","root"); 
mysql_select_db("projekt"); 
$PinOG = "SELECT PIN FROM log_in WHERE Name =" . $_POST["Name"] . " and 
NName =" . $_POST["NName"]; 
$NameOG = "SELECT Name FROM log_in WHERE NName =" . $_POST["NName"] . " and 
PIN =" . $_POST["Pin"]; 
$NNameOG = "SELECT NName FROM log_in WHERE Name =" . $_POST["Name"] . " and 
PIN =" . $_POST["Pin"]; 

$resN = mysql_query($NameOG); 
$numN = mysql_num_rows($resN); 

if ($_POST["Name"] == "Admin" and $_POST["NName"] == "Admin" and 
$_POST["Pin"] == 1337){ 
    header("Location:http://localhost/Projekt/Dalkner.html"); 
    exit(); 

} 
if ($_POST["Name"] == $NameOG and $_POST["NName"] == $_NNameOG and 
$_POST["Pin"] == $PinOG){ 
    $localtime = localtime(); 
    $localtime_assoc = localtime(time(), true); 
    if ($localtime["6"] == 0 or $localtime["6"] == 6 or $localtime["6"] == 
1){ 
     $Day = "Montag";} 
    if ($localtime["6"] == 2){ 
     $Day = "Dienstag";} 
    if ($localtime["6"] == 3){ 
     $Day = "Mittwoch";} 
    if ($localtime["6"] == 4){ 
     $Day = "Donnerstag";} 
    if ($localtime["6"] == 3){ 
     $Day = "Freitag";} 

    $Week = strftime("%V"); 
    if ($Week % 2){ 
     $SP = "spgm"; 
     $SPO = "spg"; 
     $RP = "rpgm"; 
     $RPO = "rpg"; 
    } else { 
     $SP = "spum"; 
     $SPO = "spu"; 
     $RP = "rpum"; 
     $RPO = "rpu"; 
    } 
    $commandEX = "mysqldump -u -p " .$SPO. "_" .$NameOG. "_" .$NNameOG > 
$SP. "_" .$NameOG. "_" .$NNameOG.".sql"; 
    exec($commandEX); 
    $commandIM = "mysql -u -p " .$SP. "_" .$NameOG. "_" .$NNameOG < $SP. "_" 
.$NameOG. "_" .$NNameOG.".sql"; 
    exec($commandIM); 

    $Kurs = "SELECT Kurs FROM Lehrerf, kurse WHERE Lehrer = Lehrerf"; 
    $resK = mysql_query($Kurs); 
    $numK = mysql_num_rows($resK); 

    if ($numK != 0){ 

     mysql_query("UPDATE" .$SP."_".$NameOG."_".$NNameOG . " Set NULL 
WHERE " . $Day . " = " . $Kurs); 
    } 

    $commandREX = "mysqldump -u -p " .$RPO. "_" .$NameOG. "_" .$NNameOG > 
$RP. "_" .$NameOG. "_" .$NNameOG.".sql"; 
    exec($commandREX); 
    $commandRIM = "mysql -u -p " .$RP. "_" .$NameOG. "_" .$NNameOG < $RP. 
"_" .$NameOG. "_" .$NNameOG.".sql"; 
    exec($commandRIM); 

    $RLength = "SELECT RaumNeu FROM RaumÄ"; 

    $resL = mysql_query($RLength); 
    $numL = mysql_num_rows($resL); 

    if ($NumL != 0){ 

     while ($numL != 0){ 

      $RaumNeu = "SELECT RaumNeu FROM RaumÄ WHERE idx = " . $numL; 
      $RaumAlt = "SELECT RaumAlt FROM RaumÄ WHERE idx = " . $numL; 
      if (mysql_num_rows($RaumNeu) === 0){ 
       $numL = $numL - 1; 
      }else{ 
       $RaumN = "SELECT RaumNeu FROM RaumÄ WHERE idx = " . $numL; 
       $RaumA = "SELECT RaumAlt FROM RaumÄ WHERE idx = " . $numL; 
       mysql_query("UPDATE" .$Rp."_".$NameOG."_".$NNameOG . " Set " 
. $Day . " = " . $RaumN . " WHERE " . $Day . " = " .$RaumA); 
       $numL = $numL - 1; 
      } 
     } 
    } 
    $Vplan = "Select" . $Day . ", Stunden FROM " . $SP. "_" .$NameOG. "_" 
.$NNameOG . " ORDER BY stunden DESC"; 
    echo "<P>" . $Vplan . "</P>"; 
    $VplanR = "Select" . $Day . " FROM " . $RP. "_" .$NameOG. "_" .$NNameOG 
. " ORDER BY stunden DESC"; 
    echo "<PR>" . $VplanR . "</PR>"; 

} 
if ($numN == 0){ 
    header("Location:http://localhost/Projekt/Log_in.html") ; 
    exit(); 
} 

?> 
</body> 
</html> 

は、私は本当にそれが第二の部分を実行していない理由を知りません。しかし、私は、ログインに入力された変数とデータベースが完全に一致することを保証することができます。

+0

クエリ文字列と比較しますが、取得した結果とは異なりますか? – Jan

+1

あなたの学校は古い、推奨されていない、安全でないmysql_' APIを使用するよう教えていますか?もしそうなら、彼らは**あなたの授業料とあなたの時間を盗んでいます**。愚かな教授法のトリックは決して驚かされません。 –

+0

ええ、彼はあまりにも古いバージョンのMYSQLI is notを使用したいと思っています。しかし、どうやってこのタイプのNameOGなどがあるのだろうか? –

答えて

0

あなたが投稿したコードはたくさんあります。私には2つのことが分かります。

ここが1です。プログラムの最後のログインページへのリダイレクトは、プログラムの最初にゼロ行の結果セットを取得することにのみ依存します。この結果セットが0以外の数の行を持つためには、NNamePINの両方が一致しなければなりません。それが正しい行動かどうか私はあなたの論理からは分かりません。

$NameOG = "SELECT Name FROM log_in WHERE NName =" . $_POST["NName"] . " and PIN =" . $_POST["Pin"]; 
... 
$resN = mysql_query($NameOG); 
$numN = mysql_num_rows($resN); 
... 
if ($numN == 0){ 
    header("Location:http://localhost/Projekt/Log_in.html") ; 
    exit(); 
} 

もう1つです。

if ($_POST["Name"] == $NameOG and $_POST["NName"] == $_NNameOG and $_POST["Pin"] == $PinOG){ 
    ... 

$_NNameOGが定義されていません。 $NameOG$PinOGが定義されているところがわかります。それらは、SELECTクエリを含むテキスト文字列です。したがって、==のテストは決して実現しません。このコードは間違っているようです。

たとえば、値$NameOGはこのテキスト文字列です。あなたが実際にこの比較をやっている

if ($_POST["Name"] == $NameOG ...) 

:あなたはこのifステートメントを実行しますので、

SELECT Name FROM log_in WHERE NName = yadda yadda and PIN = 1234; 

、。

if ('yadda yadda' == 'SELECT Name FROM log_in WHERE NName = yadda yadda and PIN = 1234;' ...) 

これは決して起こりません。

テキスト文字列が格納されているSQLクエリを$NameOGに実行してから、結果セットを取得する必要があります。

この点について、皆さんはプログラムの中でphpとSQLの間に起こっていることの詳細な精神モデルを開発する必要があります。

+0

タイあなたのために助けてください。 $ NAMEOGは$ NameOGの直下に定義されています。 "=="を使用する代わりに何をすればいいのですか?これは真実です。$ NameOGなどの定義方法を変更する必要がありますか? –

+0

sqlステートメントから返される変数の型は何ですか?そして、それを文字列に変更するにはどうすればいいですか –

+0

私の編集をご覧ください。 –

関連する問題