Kjapp og trygg hosting for Wordpress

problemer med Undefined index

kuba9o

New Member
Jeg holder på å lage en enkel kalkulator (+-/* knapper), den funker men jeg får opp to feilmeldinger:

Notice: Undefined index: tall1
Notice: Undefined index: tall2

Her er koden:

PHP:
 <form action="" method="get">
        <strong>Tall 1:</strong> <br/>
        <input type="text" name="tall1" /><br/>
        
        <strong>Tall 2:</strong> <br/>
        <input type="text" name="tall2" /><br/>
        
        <input type="submit" name="addisjon" value="+" />
        <input type="submit" name="subtraksjon" value="-" />
        <input type="submit" name="divisjon" value="/" />
        <input type="submit" name="multiplikasjon" value="*" />
        </form>
        
        <?php
        $tall1 = $_GET["tall1"];
        $tall2 = $_GET["tall2"];
       
        if(isset($_GET["addisjon"]))
        {
            echo ($tall1 + $tall2);
        }
        else if (isset($_GET["subtraksjon"]))
        {
            echo ($tall1 - $tall2);
        }
        else if (isset($_GET["divisjon"]))
        {
            echo ($tall1 / $tall2);
        }
        else if (isset($_GET["multiplikasjon"]))
        {
            echo ($tall1 * $tall2);
        }

Kan noen hjelpe med å fikse dette?
 

kek91

Webutvikler
Det er egentlig bare en advarsel fordi du ikke sjekker om $_GET['tall1'] og $_GET['tall2'] er satt før du assigner de til en variabel.

For å gjøre det 100% etter boka må du gjøre:
PHP:
if(isset($_GET['tall1'])) { $tall1 = $_GET['tall1']; }
if(isset($_GET['tall2'])) { $tall2 = $_GET['tall2']; }

Ellers kan du benytte php's error_reporting() for å endre på hva du vil vise av feilmeldinger/advarsler.
Les mer her PHP: error_reporting - Manual
 

adeneo

Medlem
Problemet er at første gang du kjører den kalkulatoren inneholder ikke $_GET noe som helst.

Du må sjekke at det er innhold før du gjør noe, for eksempel:

PHP:
$tall1 = isset($_GET["tall1"])?$_GET["tall1"]:""; 
$tall2 = isset($_GET["tall2"])?$_GET["tall2"]:"";

Forøvrig ville jeg heller gjort dette med javascript, men det får være opp til hver enkelt !
 

xdex

Medlem
Du kan sette dem til å være null f.eks, og gjøre noen enkle sjekker deretter. Men, hvis du syntes det blir mye mas, kan du f.eks bruke @ som hindrer å vise feilmeldinger. Mange gjør dette, "lazynezz" mendet fungerer.

f.eks @$hei = $_GET['hei'];

men det beste er nok å sjekke om disse er satt, som nevnt øverst. En annen ting jeg ville gjort, er å sjekke om det som blir sendt i get faktisk skal brukes. Hva skjer om vi sender "heihei" istedet for minus? lag f.eks en array som sjekker om innholdet stemmer med det som skal skje, evt. skriver ut en feilmelding når noen prøver seg på andre ord.

Hint du kan lese om på PHP.net

Array
In_Array
Explode
 

JBB

New Member
Switch?

Hei, appropo submit knappene dine ville jeg endret navn til de slik at de blir metode istedenfor metoden ala.
Kode:
<input type="submit" name="metode" value="addisjon" />
Jeg ville startet med også å sjekke om de nødvendige variablene($_GET) eksisterer, ala
Kode:
<?php
	if(isset($_GET['motode'], $_GET['tall1'], $_GET['tall2')){
		// Hvis veridene eksisterer vill dette executes.
	}
?>

Anbefaler også å bytte til post istedenfor get da tallene ikke blir synlige i adresselinjen.

Jeg ville også satt metodene inn i en switch, noe du kan lese mer om på PHP Switch Statement
Edit: Når du debugger, kan du bruke <?php pring_R($_GET); ?>, den vil skrive ut alle variablene som har vært sendt over i get;

Hilsen 13 åring.

Kode:
 <form action="" method="get">
        <strong>Tall 1:</strong> <br/>
        <input type="text" name="tall1" /><br/>
        
        <strong>Tall 2:</strong> <br/>
        <input type="text" name="tall2" /><br/>
        
        <input type="submit" name="addisjon" value="+" />
        <input type="submit" name="subtraksjon" value="-" />
        <input type="submit" name="divisjon" value="/" />
        <input type="submit" name="multiplikasjon" value="*" />
        </form>
        
        <?php
        if(isset($_GET['motode'], $_GET['tall1'], $_GET['tall2')){
			$tall1 = $_GET["tall1"];
			$tall2 = $_GET["tall2"];
			
			switch($_GET['metode']){
				case 'addisjon':
					echo ($tall1 + $tall2);
					break;
				case 'subtraksjon':
					echo ($tall1 - $tall2);
					break;
				case 'divisjon':
					echo ($tall1 / $tall2);
					break;
				case 'multiplikasjon':
					echo ($tall1 * $tall2);
					break;
			}
		} ?>
 
Sist redigert:

adeneo

Medlem
Det er mulig dette er et skoleprosjekt, men det ser da umåtelig dustete ut å lage en kalkulator som må laste siden på nytt for å se resultatet, og det virker unødvendig komplisert etter min mening, så jeg lagde min egen på akkurat 11 minutter, og jeg ville gjort det slik :
Kalkulator !
 

xdex

Medlem
Det er mulig dette er et skoleprosjekt, men det ser da umåtelig dustete ut å lage en kalkulator som må laste siden på nytt for å se resultatet, og det virker unødvendig komplisert etter min mening, så jeg lagde min egen på akkurat 11 minutter, og jeg ville gjort det slik :
Kalkulator !

Hvis dette er ett skoleprosjekt, er nok også oppgaven å lage noe i PHP, og ikke ved å bruke jQuery og enkel javascript.

Du trenger ikke å bruke switch, som nevnt du kan fint klare deg med if/else da det så og si ikke er noen forskjell (med mindre vi snakker om enorme mengder data) derfor, kun smak og bebeag. Siden dette kun er en enkel kalkualtor, ville jeg ikke brukt noen av dem, men heller sjekket hva som skulle gjøres (pluss, minus, osv...) da kan du bruke eval uten noe problem.

OBS, folk nevner flere ganger at eval er usikkert, dersom det er user-input data. Men, her sjekker vi også dette, så det bør ikke være noe problem i det hele tatt, just less code.

PHP:
 <form action="" method="get">
 
        <strong>Tall 1:</strong> <br/>
        <input type="text" name="tall1" /><br/>
        
        <strong>Tall 2:</strong> <br/>
        <input type="text" name="tall2" /><br/>
        
        <input type="submit" name="action_calc" value="+" />
        <input type="submit" name="action_calc" value="-" />
        <input type="submit" name="action_calc" value="/" />
        <input type="submit" name="action_calc" value="*" />
 
 </form>
 
 <?php
 
 if(isset($_GET['tall1'],$_GET['tall2'],$_GET['action_calc']))
 {
    
    //Predefine VARS
    
    $num1 = $_GET['tall1'];
    $num2 = $_GET['tall2'];
    $operator = $_GET['action_calc'];
    
    $calc_actions = '+,-,/,*';
    $calc_actions_array = explode(',',$calc_actions);
    
    if(!in_array($_GET['action_calc'],$calc_actions_array))
    {
        // Execute if the action was invalid or not found
        die('The action was invalid');
    }
    
    eval ('$answer = $num1' . $operator . '$num2 ;') ;
    echo $answer;
    
 }
 
 ?>
 
Sist redigert:

adeneo

Medlem
Hvis dette er ett skoleprosjekt, er nok også oppgaven å lage noe i PHP, og ikke ved å bruke jQuery og enkel javascript.

Da er det på tide å gjøre krav på retur av skolepengene, ettersom det er feil oppgave for feil språk ?
 

xdex

Medlem
Har jeg missforstått? Jeg trodde slike oppgaver ble tildelt, nettopp for å lære seg grunnleggende elementer. Hvordan fungerer GET? Kan vi bruke GET sammen med PHP Operators for å lage en enkel kalkulator? Hvordan kan vi gjøre matematiske regnestykker i form av PHP Kode? Kan vi tegne grafer og andre elementer, samt trykke opp en grafisk oversikt over gjennomsnitts hastigheten på biler i Norge?

Ærlig talt, selv om dette kun er grunnleggende, trenger man ikke kreve noe som helst tilbake, god påske.
 

adeneo

Medlem
Poenget var vel at det finnes flere særdeles gode grunner til å sende et skjema tilbake til serveren og gjøre noen utregninger, men en slik kalkulator er ikke en av de.

Dersom det er en oppgave gitt av en lærer bør vedkommende ta på seg tenkehatten og komme opp med bedre oppgaver etter min mening.
 

JBB

New Member
Get er det du ser i urlen som url.no/index.php?get=this

Post er nesten det samme men da ser du ikke dataene i adresselinjen
 

xdex

Medlem
Ser at jeg hadde ett par feil i min forrige post, så kommer med en quick fix og liten security update bare for morroskyld, kan være greit å sjekke hva brukeren faktisk skriver inn.

PHP:
 <form action="" method="get">
 
        <strong>Tall 1:</strong> <br/>
        <input type="text" name="tall1" /><br/>
        
        <strong>Tall 2:</strong> <br/>
        <input type="text" name="tall2" /><br/>
        
        <input type="submit" name="action_calc" value="+" />
        <input type="submit" name="action_calc" value="-" />
        <input type="submit" name="action_calc" value="/" />
        <input type="submit" name="action_calc" value="*" />
 
 </form>
 
 <?php
 
 if(isset($_GET['tall1'],$_GET['tall2'],$_GET['action_calc']))
 {
    
    //Predefine VARS
    $num1 = $_GET['tall1'];
    $num2 = $_GET['tall2'];
    $operator = $_GET['action_calc'];
    
    // Simple validation for numbers
    if(preg_match("/^[0-9]{1,2}([.][0-9]{1,2})?$/",$num1) == FALSE)
    {
        // Return error if the number is invalid
        die('Invalid number, field #1');
    }
    
    if(preg_match("/^[0-9]{1,2}([.][0-9]{1,2})?$/",$num2) == FALSE)
    {
        // Return error if the number is invalid
        die('Invalid number, field #2');
    }
    
    // Create a simple array for security reasons
    $calc_actions = '+,-,/,*';
    $calc_actions_array = explode(',',$calc_actions);
    
    if(!in_array($_GET['action_calc'],$calc_actions_array))
    {
        // Execute if the action was invalid or not found
        die('The action was invalid');
    }
    
    // Set new type, fixing the comma/period "issue"
    settype($answer,'double');
    
    eval('$answer = $num1' . $operator . '$num2;') ;
    echo $answer;
    
 }
 
 ?>
 

adeneo

Medlem
Jeg får vel hive meg på PHP bølgen da, ettersom dette er et skoleprosjekt, og se om vi lærer noe?

For å gjøre det enkelt, så burde det vel bli noe sånt:

PHP:
<form action="" method="POST"> 
    <strong>Tall 1:</strong><br/> 
    <input type="text" name="tall1" autocomplete="off" /><br/> 
     
    <strong>Tall 2:</strong><br/> 
    <input type="text" name="tall2" autocomplete="off" /><br/> 
     
    <input type="submit" name="tegn" value="+" /> 
    <input type="submit" name="tegn" value="-" /> 
    <input type="submit" name="tegn" value="/" /> 
    <input type="submit" name="tegn" value="*" />
</form>
     
<?php
    $tall1 = isset($_POST["tall1"])?+$_POST["tall1"]:0;
    $tall2 = isset($_POST["tall2"])?+$_POST["tall2"]:0;
    $operator = (binary)isset($_POST['tegn'])?$_POST['tegn']:0;
    $operators = array('+' => 'bcadd', '-' => 'bcsub', '*' => 'bcmul', '/' => 'bcdiv' );
    bcscale(3); //maks antall desimaler i svaret
    if (array_key_exists($operator, $operators))
        echo (float)call_user_func($operators[$operator], $tall1, $tall2);
?>

I PHP er variabler noe løse, og vi trenger ikke sette typen slik vi må i diverse andre andre språk, slik som C e.l.
Vi kan derimot sette eller endre typen dersom vi ønsker det med "casting", som er veldig kjekt når man skal sikre brukergenerert input (og i mange andre tillfeller), og vi kan "cast'e" ved å sette inn "(float)", "(int)" osv. foran variabelen for å angi hvilken type det er. Roaa gjør noe av det samme ved å bruke setType(), bortsatt fra at "double" har utgått fra PHP, og det burde normalt vært brukt flytende punkt i stedet.

Enkleste måten å sette noe til tall på er å slenge på en pluss foran, og ovenfor gjør vi alt som dyttes inn i input feltene til tall, slik at det blir svært vanskelig å kjøre kode på serveren gjennom input feltene, som jo er en sikkkerhetsrisiko.
Ved å unngå eval() (som er evil), blir sikkerheten enda bedre, og ettersom PHP har innebygde BC mattefunksjoner kan vi bruke et array og samtidig sjekke at tegnet eksisterer og at det ikke er noe muffens på gang.

Operator'n setter vi selvfølgelig til binær form, da det er det den bør være!
Da har vi sikret alle tre input'en greit nok, og ettersom vi kjører dette med call_user_func unngår vi eval'ing av kode.
 

kuba9o

New Member
yes, takk for hjelpen! det var nok det at $_GET ikke inneholdt noe som helst. men fikset dette nå! takk for de andre tipsene også!
 
Topp