Just nu i M3-nätverket
Gå till innehåll

if($variabel==svar?variabel)


Niss3

Rekommendera Poster

Hej!

 

Jag har gjort en simpel frågesport sida.

 

Ett "problem" jag märkt är att svaret måste EXAKT för att få rätt.

 

Går det att säga till en if-sats att den får variera på någon bokstav?

Eller måste jag ange varje "OK" svar?

 

if($input == %svar?){

}

 

if($input == OKsvar1 or $input == OKsvar2 or $input == OKsvar3 $input == OKsvar4){

}

 

Exempel:

 

Rätt svar är pannkaka.

Skriver du pannkakor borde du också få rätt.

Därmed vore "pannkak" rätt svar, och vilken ändelse som helst OK.

 

-edit-

 

Jag upptäckte precis att det är samma problem med versaler. "Stora bokstäver".

 

Säg att rätt svar är "ballong".

 

Svarar jag Ballong, BALLONG eller BallONg är det också fel.

 

Finns det någon smart lösning på detta?

Länk till kommentar
Dela på andra webbplatser

Enklast är att du fkonverterar både svar och facit till antingen lowercase eller uppercase.

 

I php heter funktionerna strtolower() och strtoupper()

 

Så:

if (strtoupper($input) == strtoupper(OKsvar)) {

Problemet med att varje bokstav måste vara med / inte får vara med, är inte helt enkelt att lösa. Det går att göra det "hyfsat ok", men inte bra.

Länk till kommentar
Dela på andra webbplatser

Om du vill att allt som börjar med pannkak ska vara rätt svar så kan du skriva så här i facit:

 

$OKsvar = "pannkak*";

 

Sen när du ska kolla använder du funktionen substr för att bara hämta ut en del av texten. Till att börja med kollar du om facit innehåller tecknet * eftersom det då innebär att vi ska göra jämförelsen på ett annat sätt:

 

if (strpos($OKsvar, "*")) {

 

För att göra jämförelsen behöver vi först ta bort * från facit:

 

$OKsvar = substr($OKsvar, 0, strlen($OKsvar) - 1);

 

Därefter hämtar vi lika många tecken från början av användarens svar som nu finns i $OKsvar:

 

$input = substr($input, 0, strlen($OKsvar));

 

Och så jämför vi dem:

 

if (strtolower($input) == strtolower($OKsvar)) {

 

Så gör man för ditt pannkaksexempel. Men så undrade du också hur man gör för att kunna tolera att en bokstav är fel...

 

Ett sätt är att räkna hur många bokstäver som inte stämmer. Även här använder vi substr, men nu för att kolla en bokstav i taget:

 

function diff($input, $facit)

{

  $diff = 0;

  $input = strtolower($input);

  $facit = strtolower($facit);

  $facitl = strlen($facit);

  for ($i = 0; $i < strlen($input); $i++)

  {

    if ($i >= $facitl)

      $diff++;

    else

    {

      if (substr($input, $i, 1) != substr($facit, $i, 1))

        $diff++;

    }

  }

  return $diff;

}

 

Returnerar den 0 så är det helt rätt, returnerar den 1 så är en bokstav fel, returnerar den 2 så är 2 bokstäver fel osv... Så du får avgöra hur många fel det ska vara för att det ska räknas som rätt.

Länk till kommentar
Dela på andra webbplatser

är inte bättre om använder 

  • $re = "/pannkak/i";
  • $str = "Pannkak";
  • om du vill kolla på flera (pannkak|mat)
  •  
  • if(preg_match($re, $str, $matches)){
  •  
  • }

    jag skulle klass som kan se ut här
  •  
  • $data = $db->load('faset',1);

// ladda in faset 

  • $sport = new sport($data);
  • //ange frågan och svar

$sport->svar('1', $svar[0]);

$sport->svar('2', $svar[1]);

$sport->svar('3',$svar[2]);

 

//check

 

gör att den kopplar ihop svar med faset sedan loopar ut data sedan kollar om 

exempelvis så här 

  • if(preg_match($faset['rätta svaret '], $svar, $matches)){
  • $tmp[$fråga] = $svar // ja
  • }else{
  • $tmp[$fråga] = $faset['svar'] // nej
  • }

 

 

 

sport->check(); return true eller false

 

// spara med användare id  

$id = $sport->save($userid)

 

vid hämta frågor för användare 

$sport->getuserid($userid); eller $sport->getuserid($userid, $id);

 

 

skriva ut html tabellen 

$sport->print(); 

  •  
  •  


  •  
  •  
  • };
Länk till kommentar
Dela på andra webbplatser

  • 1 month later...

Jag har försökt länge nu att hitta en okej lösning på detta problemet, men jag är bra nära på att ge upp.

 

Svaren på mina frågor ligger i en SQLi databas. För varje fråga hämtar jag "svaret" i variabeln $svar.

 

I nuläget jämför jag bara input med svar;

if(strtolower($_POST['input'])==$svar){ "kod för att gå till nästa fråga" }

 

Har provat Thomas ide med att räkna antal rätt bokstäver, men jag hade väldigt svårt att bibehålla variabler från funktionen. Kan vara för att jag inte riktigt förstår hur funktioner fungerar, men jag använde diff($input, $svar). Sedan kontrollerade jag med echo $diff; men fick inget tillbaka även om "return $diff;" fanns med i funktionen. Kollade jag med echo innuti funktionen fungerade det bra. Provade då att lägga in lösenordskontrollen inom funktionen, men det fungerade inte så jag gav upp den iden.

 

Försökte också leka runt med preg_match som mac3 föreslog. Men jag förstod inte alls hur jag ska applicera det till min php kod. Jag är som jag kanske nämnt ganska ny med php..

Länk till kommentar
Dela på andra webbplatser

Jag tror på ett fält eller kopplingstabell med flera sätta svar, där man anger olika felstavningar som godkännes. 

Länk till kommentar
Dela på andra webbplatser

Jag tror på ett fält eller kopplingstabell med flera sätta svar, där man anger olika felstavningar som godkännes. 

 

Precis vad jag slutade upp med :) Inte helt nöjd, men det fungerar.

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...