Gå til innhold

PHP·pub - Programming With Attitude - and beer


Anbefalte innlegg

Videoannonse
Annonse

Du kan i praksis det, koden på forrige side kunne også brukt "else if" og ville da hoppet ut.

F. eks.

if(!$_PAGE['exists']){ notice('error','Siden eksisterer ikke'); }
else if($_PAGE['access']!=1){ notice('error','Siden er ikke tilgjenlig');}

osv.

 

evt. fordi problemet kan løses elegant slik jeg viste, med en funksjon med return. ;)

Lenke til kommentar
Da må vel programmet kjøre else-delen. Jeg tenker meg en slik struktur, helt hypotetisk altså:
if{
   (test1){ 
       break;
   }
   runSomething();
   (test2){ 
       runAnotherThing();
       break;
   }
.
.
.
   (testn){ 
      break;
   }
   runSuccessful();
}

Kjøretiden hadde vel også vært raskere om noe slikt gikk an, da den kan f.eks. bryte ut av hele greia allerede etter kalkulering av første kondisjon.

Endret av kilik
Lenke til kommentar
  • 1 måned senere...

Sliter med spesialkarakterer.

 

Har en funksjon som henter ut ordrer for en vare slik:

	function getAllOrdreVare($sVareNr)
	{
		
		$sql = "SELECT	ordre.id,		
		FROM arbeidsordret ordre,
				arbeidsloggt logg,
				varet vare
		WHERE ordre.id = logg.arbeidsordreid AND 
				logg.vareid = vare.id AND
				vare.varenr = '$sVareNr'";

hvor $sVareNr kan inneholde både nummer og bokstaver.

 

Den fungerer helt fint utenom til enkelte varenr som f.eks:

 

'AU097AA#AC3' tolkes som 'AU097AA'

'ND218NO+40Y7734' tolkes som 'ND218NO 40Y7734'

 

Følgelig returnerer databasen ingen ordrer i disse tilfellene.

 

Noen som vet en løsning?

Endret av kilik
Lenke til kommentar

Ja, bruk prepared statements, koden din er åpen for sql-injections.

F.eks hva om man bruker ABC';DROP TABLE ordre som varenr? Da slettes hele databasen din!

Problemet nå er at varenr ikke tolkes som data men som en del av sql-spørringen, derav sikkerhetshull og rare resultater. PDO/prepared statements fikser begge deler i samme slengen.

  • Liker 1
Lenke til kommentar

Sliter med spesialkarakterer.

 

Har en funksjon som henter ut ordrer for en vare slik:

	function getAllOrdreVare($sVareNr)
	{
		
		$sql = "SELECT	ordre.id,		
		FROM arbeidsordret ordre,
				arbeidsloggt logg,
				varet vare
		WHERE ordre.id = logg.arbeidsordreid AND 
				logg.vareid = vare.id AND
				vare.varenr = '$sVareNr'";

hvor $sVareNr kan inneholde både nummer og bokstaver.

 

Den fungerer helt fint utenom til enkelte varenr som f.eks:

 

'AU097AA#AC3' tolkes som 'AU097AA'

'ND218NO+40Y7734' tolkes som 'ND218NO 40Y7734'

 

Følgelig returnerer databasen ingen ordrer i disse tilfellene.

 

Noen som vet en løsning?

 

med å bruke mysqli::escape_string( $value ) eller PDO::quote( $value ) så vil dette løse seg. Og som Matsemann skriver over er koden du nå har veldig utsatt for sql-injections.

 

Tronds

Lenke til kommentar

Hmm.. hvis jeg får inn  en variabel via $_GET jeg vet at den skal være et tall, og jeg bruker det som den. Vil det da ikke være nok å kjøre (int)$_GET['tall']  på den eller ( $_GET['tall'] + 0 ). Er vel ikke noe "ond" kode som vil overleve det hvis jeg bruker den i feks en SQL query ?

$test1 = "khkj";
$test2 = "' OR 1 OR '";
$test3 = ")(/&%¤#\"";
$test4 = 34;

print (int)$test1."<br>";  // output 0
print (int)$test2."<br>";  // output 0
print (int)$test3."<br>";  // output 0
print (int)$test4."<br>";  // output 34
Lenke til kommentar

Det skal være nok med type casting. Men er en god vane å bruke prepared statments uansett. Du kan også ta en titt på filter_var() og filter_input()

 

Joda, må velge det som gjør jobben. Men hvis jeg bare ønsker å ta et tall inn, og jeg ikke bryr meg om det er 0 ( vil ikke gjøre noe skadde ) så er (int) det enkleste. Ordnet til en run test bare for å se om det var noe forskjell. 

$startTime = microtime_float();

for( $i=0; $i < 2000000; $i++){
        $var = "kjhkh";
//      $tall = (int)$var; //                                0.28ms
//      $tall =  filter_var( $var, FILTER_VALIDATE_INT ); // 0.65ms
//      $tall = ($var+0); //                                 0.19ms
        }

print microtime_float()-$startTime."\n";

function microtime_float()
{
    list($usec, $sec) = explode(" ", microtime());
    return ((float)$usec + (float)$sec);
}

Fikk 0.28 på (int) og 0.65 på filter_var, den som kom best ut var ( $var+0). MEN dette var jo med 2 mill. ganger. Er vel sjelden det skal gjøres så mange ganger  :)

Endret av trondes
Lenke til kommentar
  • 3 uker senere...

Hvordan ville dere løst det her?

 

 

Har litt enkelt forklart en tekstboks og en søkeknapp fra før:

<TD><input type="text" name="sok_vare" maxlength="20" size="15"></TD>
<TD><input type="submit" value="Søk" name="sokvare"></TD>

<?php	if(isset($_POST['sokvare']) )
	{
		//vis søkesvar på siden
	} ?>
Da er det bare å skrive inn og trykke enter, så skjer søket.
 
Men så prøver jeg å legge til en knapp i tillegg øverst på siden:
//Trykk knapp for å forandre en verdi i databasen
<input type="submit" value="Oppdater i vareliste" name="submitpris"></TD>
	<?php <if(isset( $_POST['submitpris'])){
		//kjør database insert-funksjon
	} ?>

Problemet da er at enter-knapp for å søke ikke lenger fungerer. I stedet når man trykker enter, så blir "submitpris" kjørt. Jeg antar browseren da bruker den første submit-knappen den finner på siden som default ved enter-trykk.

 

Det enkle er jo å flytte søkefeltet øverst på siden, men det må da finnes en bedre løsning. CSS, Javascript?

 

Endret av kilik
Lenke til kommentar
  • 2 år senere...

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...