Vinnaren i pepparkakshustävlingen!
  • 1
  • 2
2021-02-25, 22:17
  #1
Medlem
Vill jämföra två teckensträngar i ett if statement men får det inte att funka.
Raden det gäller är:
Kod:
(strcmp($password[$_counter],$lösenord) == and strcmp($userID[$_counter],$användarnamn) == 0

vad är det för fel?

Kod:
<?php 
      $namnARRAY
;
      
$lösenordARRAY;
      
$presentationARRAY;
      
      if(
$_SERVER['REQUEST_METHOD'] === 'POST'){
    
    
$användarnamn $_POST['name'];
    
$lösenord $_POST['pwd'];
    
    
$userID=array('abc','def','ghi');
    
$password=array('volvo','bmw','opel');
    
$rows=count($password);
    
    for(
$_counter 0$_counter $rows$_counter++) {
        
        if(
strcmp($password[$_counter],$lösenord) == and strcmp($userID[$_counter],$användarnamn) == 0){
            echo 
'you are logged in';
            echo 
'<br/>';
        } else {
            echo 
'iteration '.$_counter '<br>';
        }
    };
    
      }
        
      
?>
Citera
2021-02-25, 22:46
  #2
Medlem
Kollade inte igenom, men vid en första anblick så hade jag testat de här två först, för att felsöka:

Kod:
(strcmp($password[$_counter],$lösenord) != and strcmp($userID[$_counter],$användarnamn) == 0

Kod:
(strcmp($password[$_counter],$lösenord) == and strcmp($userID[$_counter],$användarnamn) != 0

Vad får du om du testar dom?
Citera
2021-02-25, 22:54
  #3
Medlem
Citat:
Ursprungligen postat av bosscs2
Kod:
echo 'iteration '.$_counter '<br>'
Varför inte skriva ut värdet på alla variabler där?

Du kan också bryta ned ditt if-statement i mindre delar till att börja med, och även då logga allt.
Citera
2021-02-26, 00:14
  #4
Medlem
webbutvecklarens avatar
Citat:
Ursprungligen postat av bosscs2
Vill jämföra två teckensträngar i ett if statement men får det inte att funka.
Raden det gäller är:
Kod:
(strcmp($password[$_counter],$lösenord) == and strcmp($userID[$_counter],$användarnamn) == 0

vad är det för fel?

Kod:
<?php 
      $namnARRAY
;
      
$lösenordARRAY;
      
$presentationARRAY;
      
      if(
$_SERVER['REQUEST_METHOD'] === 'POST'){
    
    
$användarnamn $_POST['name'];
    
$lösenord $_POST['pwd'];
    
    
$userID=array('abc','def','ghi');
    
$password=array('volvo','bmw','opel');
    
$rows=count($password);
    
    for(
$_counter 0$_counter $rows$_counter++) {
        
        if(
strcmp($password[$_counter],$lösenord) == and strcmp($userID[$_counter],$användarnamn) == 0){
            echo 
'you are logged in';
            echo 
'<br/>';
        } else {
            echo 
'iteration '.$_counter '<br>';
        }
    };
    
      }
        
      
?>

Kör alltid med strict testing vid strcmp:
Kod:
(strcmp($password[$_counter],$lösenord) === and strcmp($userID[$_counter],$användarnamn) === 0

Kan det ha löst ditt problem? Dvs, istället för == 0 så använder du strict === 0, samt istället för and så bör du använda &&, lite pro tips!


Dessutom hade jag hellre kört så här, så slipper du overheaden med att räkna arrayn, och behöva hålla koll på vilken som är vad:

Kod:
<php
if($_SERVER['REQUEST_METHOD'] ===  'POST'){
$users = ['abc' => 'volvo''def' => 'bmw''ghi' => 'opel'];

$username = isset($_POST['name']) ? $_POST['name'] : '';
$password = isset($_POST['pwd']) ? $_POST['pwd'] : '';

  foreach(
$users as $user => $pswd){

    if(
$username === $user && $password === $pswd){
    echo 
'Yay! I was logged in.'; break;
    }
  }

}
?> 


Eller helt enkelt bara:
Kod:
<php
if($_SERVER['REQUEST_METHOD'] ===  'POST'){
$users = ['abc' => 'volvo''def' => 'bmw''ghi' => 'opel'];

$username = isset($_POST['name']) ? $_POST['name'] : '';
$password = isset($_POST['pwd']) ? $_POST['pwd'] : '';

    if(isset(
$users[$username]) && $password === $users[$username]){
    echo 
'Yay! I was logged in.';
    }
    else{
    echo 
'Wrong username or password';
    }
}
?> 

Har ej testat koden ovan då jag just nu sitter via mobilen. 😊
__________________
Senast redigerad av webbutvecklaren 2021-02-26 kl. 00:36.
Citera
2021-02-26, 00:51
  #5
Medlem
webbutvecklarens avatar
Citat:
Ursprungligen postat av DJ-Emerald
Kollade inte igenom, men vid en första anblick så hade jag testat de här två först, för att felsöka:

Kod:
(strcmp($password[$_counter],$lösenord) != and strcmp($userID[$_counter],$användarnamn) == 0

Kod:
(strcmp($password[$_counter],$lösenord) == and strcmp($userID[$_counter],$användarnamn) != 0

Vad får du om du testar dom?
Detta blir ju helt fel.

Det rätta ska isåfall vara:
Kod:
if(=== strcmp('bmw''bmw')) 
vilket resulterar till true, medan:
Kod:
if(=== strcmp('Bmw''bmw')) 
ger false, detta tack vare ===, s.k. strict Identical Comparison Operator. (ICO)

Strict mode operator (===) skall användas vid strcmp eftersom strcmp returnerar 0 ifall båda strängarna är exakt likadana, medan strcmp returnerar <= -1 eller >= 1 ifall sträng A är större eller mindre än sträng B, och vice versa.

T.ex:
strcmp('bmw', 'bmw') är lika med 0
strcmp('Bmw', 'bmw') är lika med 1, eftersom Bmw är större än bmw i binära systemet.
😁
Citera
2021-02-26, 14:56
  #6
Medlem
..eller om man vill trixa till det, leka med modern PHP-kod, spela kodgolf eller liknande:
Kod:
if ( /* Läge att kolla form submit */ ) {
    [
'name' => $username'pwd' => $password] = $_POST + ['name' => '''pwd' => ''];
    if ((
$users[$username] ?? null) === $password) {
        echo 
"yes";
    }
    else {
        echo 
"no";
    }

Citera
2021-02-26, 16:55
  #7
Medlem
Har inte ändrat koden ett dugg och ändå funkar det nu. Däremot har jag lagt till ett formulär och jag vill bli kopplad till index.php efter att ha fyllt i formuläret. <form> taggen är placerad i echo men det funkar inte. TRUE funkar som sagt innan form taggen placeras, jag länkas alltså inte vidare och undrar varför?

Kod:
<!DOCTYPE html>
<!-- 
Får inte if statement i php att bli true?
-->

<html>
  <head>
    <meta charset="UTF-8" lang="en">
    <title>Uppgift 2</title>
  </head>
  <body>
  <h1>Logga in </h1>
  <?php 
      $namnARRAY
;
      
$lösenordARRAY;
      
$presentationARRAY;
      
      if(
$_SERVER['REQUEST_METHOD'] === 'POST'){
    
    
$användarnamn $_POST['name'];
    
$lösenord $_POST['pwd'];
    
    
$userID=array('abc','def','ghi');
    
$password=array('volvo','bmw','opel');
    
$rows=count($password);
    
    for(
$_counter 0$_counter $rows$_counter++) {
        
        if(
strcmp($password[$_counter],$lösenord) == and strcmp($userID[$_counter],$användarnamn) == 0){
            echo 
'<form action="index2.php" method="post">';
        } else {
            echo 
'iteration '.$_counter '<br>';
        }
    };
    
      }
        
      
?>
  <!-- logga in formulär -->
          
          <input type ="text" name="name" placeholder="Anvandarnamn...">
          <input type ="password" name="pwd" placeholder="Losenord">
          <button type ="submit" name="loggaIn">Logga in</button>
          <button type ="submit" name="SparaNyAnvändare">Spara ny användare</button>
      </form>
      
  </body>
Citera
2021-02-26, 17:07
  #8
Medlem
Citat:
Ursprungligen postat av bosscs2
Har inte ändrat koden ett dugg och ändå funkar det nu. Däremot har jag lagt till ett formulär och jag vill bli kopplad till index.php efter att ha fyllt i formuläret.
action innehåller "index2.php", så komma till index.php lär du inte göra. Var 2 en typo?

Citat:
Ursprungligen postat av bosscs2
<form> taggen är placerad i echo men det funkar inte. TRUE funkar som sagt innan form taggen placeras, jag länkas alltså inte vidare och undrar varför?

När jag kör din kod så skrivs form-elementet ut, så...vad är det du menar inte fungerar?
Sandbox

Du vill kanske avbryta sök-loopen om du hittar en matchning.
Citera
2021-02-26, 18:41
  #9
Medlem
Citat:
Ursprungligen postat av Koenigsegg
action innehåller "index2.php", så komma till index.php lär du inte göra. Var 2 en typo?



När jag kör din kod så skrivs form-elementet ut, så...vad är det du menar inte fungerar?
Sandbox

Du vill kanske avbryta sök-loopen om du hittar en matchning.

Jag vill till index2.php, skrev fel tidigare.
Alltså när formuläret är ifyllt med matchande användare och lösen skickas man direkt till index2.

EDIT: Är det för att <form> är inuti en loop som gör att det inte funkar?
Vad är skillnaden på == och ===?
__________________
Senast redigerad av bosscs2 2021-02-26 kl. 19:16.
Citera
2021-02-26, 20:05
  #10
Medlem
Det är här det blir fel.
<form> funkar inte...

Kod:
for($_counter 0$_counter $rows$_counter++) {
        
        if(
strcmp($password[$_counter],$lösenord) == and strcmp($userID[$_counter],$användarnamn) == 0){
            [
b]echo '<form action="index2.php" method="post">';[/b]
        } else {
            echo 
'iteration '.$_counter '<br>';
        }
    }; 
Citera
2021-02-26, 20:52
  #11
Medlem
webbutvecklarens avatar
Citat:
Ursprungligen postat av bosscs2
Vad är skillnaden på == och ===?
if('0' == 0) resulterar i true medan if('0' === 0) resulterar i false, dvs. med === testar om båda variablerna är helt identiska, alltså av samma typ.

'0'(string) === 0(int) = false

Du kan läsa mer om PHP:s variabel hantering här:
https://www.php.net/manual/en/langua...comparison.php
Citera
2021-02-26, 21:35
  #12
Medlem
webbutvecklarens avatar
Citat:
Ursprungligen postat av bosscs2
Har inte ändrat koden ett dugg och ändå funkar det nu. Däremot har jag lagt till ett formulär och jag vill bli kopplad till index.php efter att ha fyllt i formuläret. <form> taggen är placerad i echo men det funkar inte. TRUE funkar som sagt innan form taggen placeras, jag länkas alltså inte vidare och undrar varför?

Kod:
<!DOCTYPE html>
<!-- 
Får inte if statement i php att bli true?
-->

<html>
  <head>
    <meta charset="UTF-8" lang="en">
    <title>Uppgift 2</title>
  </head>
  <body>
  <h1>Logga in </h1>
  <?php 
      $namnARRAY
;
      
$lösenordARRAY;
      
$presentationARRAY;
      
      if(
$_SERVER['REQUEST_METHOD'] === 'POST'){
    
    
$användarnamn $_POST['name'];
    
$lösenord $_POST['pwd'];
    
    
$userID=array('abc','def','ghi');
    
$password=array('volvo','bmw','opel');
    
$rows=count($password);
    
    for(
$_counter 0$_counter $rows$_counter++) {
        
        if(
strcmp($password[$_counter],$lösenord) == and strcmp($userID[$_counter],$användarnamn) == 0){
            echo 
'<form action="index2.php" method="post">';
        } else {
            echo 
'iteration '.$_counter '<br>';
        }
    };
    
      }
        
      
?>
  <!-- logga in formulär -->
          
          <input type ="text" name="name" placeholder="Anvandarnamn...">
          <input type ="password" name="pwd" placeholder="Losenord">
          <button type ="submit" name="loggaIn">Logga in</button>
          <button type ="submit" name="SparaNyAnvändare">Spara ny användare</button>
      </form>
      
  </body>

La till en array som du kan logga vad som gick fel med användarens försök, och sedan printa ut den.

Försök att alltid ha engelska mer konsistent och mer beskrivande namn i elementen. T.ex. "username" istället för bara "name" eller "password" istället för "pwd", och "login" hellre än "loggaIn".


Här har du en testad och fungerande kod:
Kod:
<?php
$errors 
= [];

if(isset(
$_POST['login'])){
$users = ['abc' => 'volvo''def' => 'bmw''ghi' => 'opel'];

$username = isset($_POST['username']) ? $_POST['username'] : '';
$password = isset($_POST['password']) ? $_POST['password'] : '';

  if(isset(
$users[$username]) && $password === $users[$username]){
  
header('location: index2.php'); exit;
  }

  
// There were a error
  
if(isset($users[$username])){
  
$errors['password'] = 'Lösenordet är felaktigt';
  }
  else{
  
$errors['username'] = 'Användarnamnet existerar inte';
  }
}   
?>

<!DOCTYPE html>
<!-- 
Får inte if statement i php att bli true?
-->

<html>
  <head>
    <meta charset="UTF-8" lang="en">
    <title>Uppgift 2</title>
  </head>
  <body>
  <h1>Logga in </h1>
  <!-- logga in formulär -->
     <form action="index.php" method="post">
          <input type="text" name="username" placeholder="Användarnamn">
          <input type="password" name="password" placeholder="Lösenord">
          <button type="submit" name="login">Logga in</button>
          <button type="submit" name="SparaNyAnvändare">Spara ny användare</button>

    <?php
      
// Lista alla errors
      
if($errors){ echo '<ul>'; foreach($errors as $err){ echo '<li>'$err .'</li>'; } echo '</ul>'; }

    
?>

      </form>
      
  </body>
Citera
  • 1
  • 2

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback