Vinnaren i pepparkakshustävlingen!
2020-10-19, 20:46
  #25
Medlem
Ontogeness avatar
Citat:
Ursprungligen postat av Koenigsegg
Som sagts ovan:
Kod:
switch(isset(...)) 
"gör en switch" om huruvida variabeln är satt eller inte.

switch tittar på det mellan parenteserna, och i det här fallet så är det isset(). Isset() returnerar en bool, true om variabeln finns, false annars. $_GET['error'] finns i det här fallet, så koden blir
Kod:
switch(true) { 
. Det är strängar i case-satserna under, så det borde väl aldrig kunna matcha varann, eller hur? Fel. Men det kändes så rätt tidigt, eller hur ..

switch gör inte en strikt jämförelse(===) utan (==), så då omvandlar PHP värdena i case-satserna till samma typ som i switch(...). Och nu kan man kanske börja känna vad man får om man omvandlar en sträng(inte den tomma strängen) till en bool? Just det, true.
Kod:
php var_dump((bool) '');
bool(false)
php var_dump((bool) 'empty_fields');
bool(true
(Det blir samma för alla strängar i case-satserna, dvs true.)

Så switch-satsen får true att leta efter, av isset(). Och det blir träff direkt, på första "string-caset".

Okej, så min condition bör vara if(isset($_GET[])) och ett case bör vara "error=empty_fields" medan ett annat bör vara "error=username_2_short" exempelvis?

Nu förstår jag i alla fall vad du menar med det du skrev nu plus det du skrivit innan, oavsett vilket fel jag testar för så är $_GET[] = "error" och då kör den bara på mitt första case, jag ska testa detta nu och återkommer om det fungerar!

Tack förresten för att du inkluderade lite exempel på hur man debuggar, var_dump()-funktionen verkar vara synnerligen användbar i sådana slags sammanhang.

EDIT: Okej, så jag förstår verkligen principen av vad du försöker förmedla (tror jag), men jag vet inte riktigt hur jag ska implementera det. Och först och främst vill jag säga att jag har googlat! Jag vet kanske inte exakt vad jag ska googla efter men har letat lite på Stack Overflow och ska fortsätta med det efter att jag skrivit detta inlägg.

Men i alla fall, att bara köra switch(if(isset($_GET[])) utan något värde ger ett felmeddelande, och en tom sträng, alltså switch(if(isset($_GET['']))) triggar tyvärr inga felmeddelanden. Har du något tips på hur jag bör tänka här?

Och ja, jag vet att jag skulle kunna lösa detta problem med en if-sats följt av flertalet else if-satser men anledningen till att jag istället vill använda mig av en switch är för att jag anser att det snyggar till koden och förtydligar allting betydligt bättre än ett if/else if-metoden, så att säga.
__________________
Senast redigerad av Ontogenes 2020-10-19 kl. 20:52.
Citera
2020-10-19, 20:57
  #26
Medlem
Ontogeness avatar
Citat:
Ursprungligen postat av xpqr12345
Förresten, ett tips: det är ganska irriterande att fylla i ett formulär fel, och få veta om felen, ett fel i taget. Jag rekommenderar att du använder tex flaggor för att meddela användaren vilka fel som denne begått.

I detta sammanhang är flaggor en variabel som du använder för att kommunicera flera olika saker. Gemensamt för alla är att de kan vara antingen sanna eller falska, inget annat. I detta fall är det information om vilka fält som fyllts i som är det relevanta. Det kan se ut ungefär så här (jag gör inga anspråk på att koden är rätt, utan bara visar på principen):

I koden som tar hand om datan från formuläret:
- sätt flagga till noll
- kolla namnfältet, är det rätt ifyllt? Om ja, gå vidare, annars sätt flagga till flagga||1
- kolla emailfältet, är det rätt ifyllt? Om ja, gå vidare, annars sätt flagga till flagga||2
- kolla adressfältet, är det rätt ifyllt? Om ja, gå vidare, annars sätt flagga till flagga||4
- kolla telefonnummerfältet, är det rätt ifyllt? Om ja, gå vidare, annars sätt flagga till flagga||8
- och så vidare....
- när alla fält är kollade så kontrollera om flagga==0: om ja gå vidare med bearbetningen av formulärdatat, annars skicka tillbaka formuläret med flagga

Sedan i den kod som skriver ut formuläret:
- är flagga&&1!=0? Om ja (dvs något fel sedan tidigare försök att fylla i) skriv ut ett felmeddelande och skriv sedan ut formulärrutan
- är flagga&&2!=0? Om ja (dvs något fel sedan tidigare försök att fylla i) skriv ut ett felmeddelande och skriv sedan ut formulärrutan
- är flagga&&4!=0? Om ja (dvs något fel sedan tidigare försök att fylla i) skriv ut ett felmeddelande och skriv sedan ut formulärrutan
- är flagga&&8!=0? Om ja (dvs något fel sedan tidigare försök att fylla i) skriv ut ett felmeddelande och skriv sedan ut formulärrutan

Observera mönstret som återkommer i båda fallen: för varje nytt fält multipliceras en konstant (1, 2, 4, 8) med två. Detta medför att flaggan är en enda bit i binärtalet, och om den sätts till 1 skall det tolkas som ett fel.

Du kan på det viset gå igenom hela formuläret en enda gång, och upptäcka alla felen på en gång.

Intressant. Detta ska jag ta och kika på ytterligare när jag bara fått allting att fungera på en basic-nivå, och där är jag på det sista steget (att visa felmeddelanden som HTML baserat på URL-parametrar). Efter denna "lägst accepterade nivå" så ska jag kolla in det du beskriver för att förbättra min kod, och jag hade också tänkt att lära mig git så jag kan ladda upp allting så ni kan få kika på det själva och komma med eventuella synpunkter osv

Se gärna mitt senaste inlägg här i tråden, jag tror att jag är nära på att knäcka nöten
Citera
2020-10-19, 21:04
  #27
Medlem
Citat:
Ursprungligen postat av Ontogenes
Okej, så min condition bör vara if(isset($_GET[])) ....

Nej, eftersom if(isset(xxx)) alltid kommer att ge samma resultat. Däremot kan du ha något i stil med:

Kod:
$slask=$_GET['error'];
if(isset(
$slask))
{
   switch(
$slask)
      {
         ....
         ....
         ...
      }

Citera
2020-10-19, 21:07
  #28
Medlem
Ontogeness avatar
Jag har kommit fram till en lösning!

Kod:
<?php

    
switch($_SERVER['QUERY_STRING']) {

        case 
'error=empty_fields':
        echo 
'<div class="error"><p>Please fill in all input fields.</p></div>';
        break;

        case 
'error=username_2_short':
        echo 
'<div class="error"><p>Your username is too short (minimum username length - 6 characters).</p></div>';
        break;

        case 
'error=username_2_long':
        echo 
'<div class="error"><p>Your username is too long (maximum username length - 15 characters).</p></div>';
        break;

        case 
'error=password_2_short':
        echo 
'<div class="error"><p>Your password is too short (minimum password length - 9 characters).</p></div>';
        break;

        case 
'error=passwords_not_matching':
        echo 
'<div class="error"><p>Your passwords does not match.</p></div>';
        break;

        case 
'error=username_taken':
        echo 
'<div class="error"><p>That username is already taken.</p></div>';
        break;

    }

?>

Tydligen så möjliggör den globala variabeln $_SERVER med värdet "QUERY_STRING" att man kan fetcha URL-datan som kommer efter frågetecknet, resten var ju redan kodat.

Stort tack till alla som orkade med mig och hjälpte mig, ni är hjältar!!! <3

Om ni vill kolla in projektet får ni vänta tills jag lärt mig git annars kan ni PM:a mig så får ni projektet i en .zip-fil via mail eller dylikt (hoppas jag inte bryter mot någon regel nu förlåt mig i sådana fall men detta borde väl vara okej).
Citera
2020-10-20, 14:07
  #29
Medlem
Din switch-sats kommer att få problem om query string skulle innehålla nåt mer än "error=..."(Läs: Om du skulle bestämma dig för att utöka ditt program på ett sätt som påverkar query string i framtiden) Detta eftersom $_SERVER['QUERY_STRING'] som du väl redan förstått innehåller hela query string, som en sträng.

PHP: parse_str kan vara bra att känna till. Ex:
Kod:
> echo $_SERVER['QUERY_STRING'];
error=empty_fields&field=value

parse_str("error=empty_fields&field=value"$result);
print_r($result);
Array
(
    [
error] => empty_fields
    
[field] => value
)

switch(
$result['error']) {
    ... 

..eller så kan du förstås använda $_GET också, det är som att köra parse_str() på $_SERVER['QUERY_STRING'], parse_str() är mer för om du har en annan sträng än den som användes för nuvarande request, men i samma format.. Min uppmärksamhet är lite splittrad här, tror jag, brainfart-varning :-p
__________________
Senast redigerad av Koenigsegg 2020-10-20 kl. 14:19.
Citera
2020-10-23, 14:17
  #30
Medlem
SKetchers avatar
Citat:
Ursprungligen postat av Ontogenes
Jag har kommit fram till en lösning!

Kod:
... 

Tydligen så möjliggör den globala variabeln $_SERVER med värdet "QUERY_STRING" att man kan fetcha URL-datan som kommer efter frågetecknet, resten var ju redan kodat.

Stort tack till alla som orkade med mig och hjälpte mig, ni är hjältar!!! <3

Om ni vill kolla in projektet får ni vänta tills jag lärt mig git annars kan ni PM:a mig så får ni projektet i en .zip-fil via mail eller dylikt (hoppas jag inte bryter mot någon regel nu förlåt mig i sådana fall men detta borde väl vara okej).

Citat:
Ursprungligen postat av Koenigsegg
[..]
Som Koenigsegg, nämnde. Så har du programmerat in fel logik.
$_SERVER['QUERY_STRING'] är en samling av alla url queries.
"www.hemsida.se/a=123&b=123"
querystring blir --> "a=123&b=123"
medan $_GET blir --> "123"

$_GET, som du använt från början är den du ska använda i det här fallet.
Lägg till en felhanteringslogik innan switch-caset och lägg släng in en 'default' i parametern också.

Kod:
$error $_GET['error'];

if (!isset(
$error)) {
    
$error "";
}

switch (
$error) {

    case 
'empty_fields':
        echo 
'<div class="error"><p>Please fill in all input fields.</p></div>';
        break;

    case 
'username_2_short':
        echo 
'<div class="error"><p>Your username is too short (minimum username length - 6 characters).</p></div>';
        break;

    case 
'username_2_long':
        echo 
'<div class="error"><p>Your username is too long (maximum username length - 15 characters).</p></div>';
        break;

    case 
'password_2_short':
        echo 
'<div class="error"><p>Your password is too short (minimum password length - 9 characters).</p></div>';
        break;

    case 
'passwords_not_matching':
        echo 
'<div class="error"><p>Your passwords does not match.</p></div>';
        break;

    case 
'username_taken':
        echo 
'<div class="error"><p>That username is already taken.</p></div>';
        break;

    default:
        echo 
"<p style=\"color:red;\">Something went wrong";
        break;

Citera
2020-11-10, 12:39
  #31
Medlem
Ontogeness avatar
Citat:
Ursprungligen postat av Koenigsegg
Din switch-sats kommer att få problem om query string skulle innehålla nåt mer än "error=..."(Läs: Om du skulle bestämma dig för att utöka ditt program på ett sätt som påverkar query string i framtiden) Detta eftersom $_SERVER['QUERY_STRING'] som du väl redan förstått innehåller hela query string, som en sträng.

PHP: parse_str kan vara bra att känna till. Ex:
Kod:
> echo $_SERVER['QUERY_STRING'];
error=empty_fields&field=value

parse_str("error=empty_fields&field=value"$result);
print_r($result);
Array
(
    [
error] => empty_fields
    
[field] => value
)

switch(
$result['error']) {
    ... 

..eller så kan du förstås använda $_GET också, det är som att köra parse_str() på $_SERVER['QUERY_STRING'], parse_str() är mer för om du har en annan sträng än den som användes för nuvarande request, men i samma format.. Min uppmärksamhet är lite splittrad här, tror jag, brainfart-varning :-p

Jag har inte hållt på med detta på ett tag men som jag förstår det så är det lugnt såtillvida att mitt query string inte innehåller någonting annat än det gör för tillfället (om användaren triggar en error handler). Jag ska kolla in parse_str()-funktionen, jag antar att du menar att jag kan använda mig av den istället på något sätt? Alltså det som din kod visar. Jag förstår den inte riktigt men det klarnar nog när jag kollar upp funktionen i PHP-manualen
Citera
2020-11-10, 14:37
  #32
Medlem
Alltså, GET requests(på svenska, nån??) skickar data/parametrar i query string. Det är rådatat. Sen tolkar PHP automatiskt den strängen och stoppar de snygga, processade delarna i $_GET. Det görs automatiskt.

Om du hämtar /minfil.php?error=boring_answer så finns $_GET['error'] med strängen "boring_answer" som innehåll. Och $_SERVER['QUERY_STRING'] innehåller "error=boring_answer".

Om du hämtar /minfil.php?error=boring_answer&redirect=flashback. org så innehåller $_GET
Kod:
[
    
'error' => 'boring_answer',
    
'redirect' => 'flashback.org'

och $_SERVER['QUERY_STRING'] innehåller "error=boring_answer&redirect=flashback.org".

Dvs $_GET är förmodligen det du vill titta på nu.

Om du skulle köra
Kod:
parse_str($_SERVER['QUERY_STRING'], $result); 
så skulle $result innehålla detsamma som $_GET ovan. Dvs du har redan fått samma sak gratis utan parse_str(). Men den har förstås användningsområden i andra situationer, om man håller på och bygger ihop en adress för ett anrop eller liknande. Om det är inkommande requests till servern, dvs andra hållet, så gör PHP mycket av det gratis åt dig .
Citera
2020-11-22, 19:14
  #33
Medlem
Ontogeness avatar
Citat:
Ursprungligen postat av Koenigsegg
Din switch-sats kommer att få problem om query string skulle innehålla nåt mer än "error=..."(Läs: Om du skulle bestämma dig för att utöka ditt program på ett sätt som påverkar query string i framtiden) Detta eftersom $_SERVER['QUERY_STRING'] som du väl redan förstått innehåller hela query string, som en sträng.

PHP: parse_str kan vara bra att känna till. Ex:
Kod:
> echo $_SERVER['QUERY_STRING'];
error=empty_fields&field=value

parse_str("error=empty_fields&field=value"$result);
print_r($result);
Array
(
    [
error] => empty_fields
    
[field] => value
)

switch(
$result['error']) {
    ... 

..eller så kan du förstås använda $_GET också, det är som att köra parse_str() på $_SERVER['QUERY_STRING'], parse_str() är mer för om du har en annan sträng än den som användes för nuvarande request, men i samma format.. Min uppmärksamhet är lite splittrad här, tror jag, brainfart-varning :-p

Jag har kikat lite på parse_str()-funktionen nu, och som jag förstår det så tar den en string som första parameter, och så döper man en variabel som andra parameter vilket kommer att bli en associativ array. Om jag kör $_SERVER['QUERY_STRING'] som min string så blir den associativa array:en ([error] => username_2_short) om jag till exempel försöker registrera mig med användarnamnet "kuk".

Så det du menar att jag ska göra är att skriva en switch som har $result som argument (det vill säga att där finns ett error) och mina case borde bestå av de olika felmeddelandena (t.ex. "username_2_short")?

Ska testa nu
Citera
2020-11-22, 19:29
  #34
Medlem
Ontogeness avatar
Jag har använt mig av metoden som användaren Koenigsegg rekommenderade, men nu visas tyvärr enbart felmeddelandet för ej igenfyllda fält och inga andra felmeddelanden (även när de syns som URL-parametrar).

Kod:
parse_str($_SERVER['QUERY_STRING'], $result);

switch(
$result) {

        case 
$result 'empty_fields':
        echo 
'<div class="error"><p>Please fill in all input fields.</p></div>';
        break;

        case 
$result 'username_2_short';
        echo 
'<div class="error"><p>Your username is too short (minimum username length - 6 characters).</p></div>';
        break;

        case 
$result 'username_2_long';
        echo 
'<div class="error"><p>Your username is too long (maximum username length - 15 characters).</p></div>';
        break;

        case 
$result 'password_2_short';
        echo 
'<div class="error"><p>Your password is too short (minimum password length - 9 characters).</p></div>';
        break;

        case 
$result 'passwords_not_matching';
        echo 
'<div class="error"><p>Your passwords does not match.</p></div>';
        break;

        case 
$result 'username_taken';
        echo 
'<div class="error"><p>That username is already taken.</p></div>';
        break;

        case 
$result 'sql_error';
        echo 
'<div class="error"><p>Database error.</p></div>';
        break;

        case 
$result 'success';
        echo 
'<div class="success"><p>Your user has been successfully created!</p></div>';
        break;

    } 

Vad gör jag för fel?
Citera
2020-11-22, 20:26
  #35
Medlem
Med en switch-sats kommer bara en av vägarna att exekveras, men om du vill kunna rapportera flera fel på en gång duger det inte med en switch. Möjligen kan du använda en rad if-satser, med en sats per fel du vill rapportera.

Edit:
på din andra och alla efterföljande case-sats avslutar du raden med ett semikolon istället för ett kolon.
Citera
2020-11-22, 21:48
  #36
Medlem
hasenfrasens avatar
Citat:
Ursprungligen postat av Ontogenes
Vad gör jag för fel?

Kika lite på hur "foreach" kan användas för att iterera igenom inparametrarna och som sen kan parse'as av din switch-sats.
Citera

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