Gå til innhold

Leketråden - PHP


Anbefalte innlegg

Videoannonse
Annonse

Begynner med første: Et script som generer 3000x3000 pseudotilfedig .PNG med litt morsom matte.

header("Content-type: image/png");
$im = imagecreatetruecolor(3000, 3000) or die("Cannot Initialize new GD image stream");
$color = imagecolorallocate($im, rand(100,900), rand(100,900), rand(100,900));
for ($y = rand(1,10); $y < 3000; $y++) {
    for ($x = rand(1,10); $x < 3000; $x++) {
        if (rand(0, 1)) {
            imagesetpixel($im, $x, $y, $color); 
        } 
    } 
} 
imagepng($im); imagedestroy($im);
Endret av Dan-Levi
Lenke til kommentar

Et veldig enkelt spill hvor du skal gjette tallet mellom 1-10.

 

PHP

function roll ($sides) {
    return mt_rand(1,$sides);
}
function select($selname,$sides) {
	$selector = '<select name="'.$selname.'">';
	$i = 1;
		while ($i <= $sides) {
			$selector .= '<option selected="selected" value="'.$i.'">'.$i.'</option>';
			$i++;
		}
	$selector .= '</select>';
	return $selector;	
}
$computer = roll(10);
if (!empty($_POST['choice']) == true) {
	$choice = $_POST['choice'];
	if (!is_numeric($choice)) {
		echo 'Not a integer';
	} else {
		if ($choice == $computer) {
			echo 'You won!';
		} else {
			echo 'You lost!';
		}
	}
} else {
	echo 'Choose a number';
}

HTML

<html>
<head>
	<title></title>
</head>
<body>
	<form method="POST" action="<?php echo $_SERVER['PHP_SELF']; ?>">
			<?php echo select('choice',10) ?>
		<input type="submit">
	</form>
</body>
</html>
Lenke til kommentar

En til. Denne regner ut hvor mange år du fyller i år ut i fra fødselsdagen din.

 

PHP

function day() {
	$i = 1;
	$day = '<select name="day">';
	while ($i <= 31) {
		$day .= '<option value="'.$i.'">'.$i.'</option>';
		$i++;
	}
	$day .= '</select>';
	return $day;
}
function month() {
	$i = 1;
	$month = '<select name="month">';
	while ($i <= 12) {
		$month .= '<option value="'.$i.'">'.$i.'</option>';
		$i++;
	}
	$month .= '</select>';
	return $month;
}
function year() {
	$i = 2013;
	$year = '<select name="year">';
	while ($i >= 1920) {
		$year .= '<option value="'.$i.'">'.$i.'</option>';
		$i--;
	}
	$year .= '</select>';
	return $year;
}
if (!empty($_POST['day']) == true && !empty($_POST['month']) == true && !empty($_POST['year']) == true) {
	$day = $_POST['day'];
	$month = $_POST['month'];
	$year = $_POST['year'];
    $birthDate = $day.'/'.$month.'/'.$year;
    $birthDate = explode('/', $birthDate);
    $age = (date('md', date('U', mktime(0, 0, 0, $birthDate[0], $birthDate[1], $birthDate[2]))) > date("md") ? ((date("Y")-$birthDate[2])-1):(date("Y")-$birthDate[2]));
    
    if ($age === 0) {
    	echo 'Velg bursdagen din.';
    } else {
    	echo 'Du fyller '.$age.utf8_decode(' år.');
    }
} else {
	echo 'Velg og kalkuler alder';
}

HTML

<html>
<head>
	<title></title>
</head>
<body>
	<form method="POST" action="<?php echo $_SERVER['PHP_SELF']; ?>">
		<?php
		echo day();
		echo month();
		echo year();
		?>
		<input type="submit" value="Kalkuler alder">
	</form>
</body>
</html>
Endret av Dan-Levi
Lenke til kommentar

 

Begynner med første: Et script som generer 3000x3000 pseudotilfedig .PNG med litt morsom matte.

header("Content-type: image/png");
$im = imagecreatetruecolor(3000, 3000) or die("Cannot Initialize new GD image stream");
$color = imagecolorallocate($im, rand(100,900), rand(100,900), rand(100,900));
for ($y = rand(1,10); $y < 3000; $y++) {
    for ($x = rand(1,10); $x < 3000; $x++) {
        if (rand(0, 1)) {
            imagesetpixel($im, $x, $y, $color); 
        } 
    } 
} 
imagepng($im); imagedestroy($im);

 

Her savner jeg en liten beskrivelse av hva du kaller "morsom matte".

Så vidt jeg kan se bruker du bare rand()-funksjonen for å velge ut én tilfeldig farge, deretter bruker du rand()-funksjonen for å velge hvilken rad du skal begynne på fra 1 til 10 (første rad vil altså alltid være uten farge), også nok en gang rand() for å finne ut hvilken kolonne du ønsker å begynne på, og nok en gang 1 til 10 (første kolonne vil alltid være uten farge).

Til slutt bruker du rand() for å bestemme "50/50" om pikselen det er snakk om skal få farge.

De vilkårlige verdiene du lager for farge er også litt feil, da du henter et tilfeldig tall mellom 100 og 900, mens funksjonen du bruker forventer verdier mellom 0 og 255.

 

Om du ønsket å legge til litt morsom matte kunne du heller alltid startet med x og y lik 0, og heller gjort det mindre sannsynlig at en piksel ble farget nær kanten av bildet, for eksempel:

header("Content-type: image/png");
$size = 3000;
$im = imagecreatetruecolor($size, $size) or die("Cannot Initialize new GD image stream");
$color = imagecolorallocate($im, rand(0,255), rand(0,255), rand(0,255));
for ($y = 0; $y < $size; $y++) {
    for ($x = 0; $x < $size; $x++) {
        $sum = 0;
        $sum += ($x > $size/2) ? $size-$x : $x;
        $sum += ($y > $size/2) ? $size-$y : $y;
        if (rand(0, $sum) > $size/2) {
            imagesetpixel($im, $x, $y, $color);
        } 
    } 
} 
imagepng($im); imagedestroy($im);

Eventuelt kan man dra inn noe trigonometri for å få til en sirkel/kule-effekt.

 

Mulig jeg kommer tilbake i morgen med kommentarer på de andre kodesnuttene også, eller deler noen helt nye :-)

  • Liker 1
Lenke til kommentar

 

Her savner jeg en liten beskrivelse av hva du kaller "morsom matte".

Så vidt jeg kan se bruker du bare rand()-funksjonen for å velge ut én tilfeldig farge, deretter bruker du rand()-funksjonen for å velge hvilken rad du skal begynne på fra 1 til 10 (første rad vil altså alltid være uten farge), også nok en gang rand() for å finne ut hvilken kolonne du ønsker å begynne på, og nok en gang 1 til 10 (første kolonne vil alltid være uten farge).

Til slutt bruker du rand() for å bestemme "50/50" om pikselen det er snakk om skal få farge.

De vilkårlige verdiene du lager for farge er også litt feil, da du henter et tilfeldig tall mellom 100 og 900, mens funksjonen du bruker forventer verdier mellom 0 og 255.

 

Om du ønsket å legge til litt morsom matte kunne du heller alltid startet med x og y lik 0, og heller gjort det mindre sannsynlig at en piksel ble farget nær kanten av bildet, for eksempel:

header("Content-type: image/png");
$size = 3000;
$im = imagecreatetruecolor($size, $size) or die("Cannot Initialize new GD image stream");
$color = imagecolorallocate($im, rand(0,255), rand(0,255), rand(0,255));
for ($y = 0; $y < $size; $y++) {
    for ($x = 0; $x < $size; $x++) {
        $sum = 0;
        $sum += ($x > $size/2) ? $size-$x : $x;
        $sum += ($y > $size/2) ? $size-$y : $y;
        if (rand(0, $sum) > $size/2) {
            imagesetpixel($im, $x, $y, $color);
        } 
    } 
} 
imagepng($im); imagedestroy($im);

Eventuelt kan man dra inn noe trigonometri for å få til en sirkel/kule-effekt.

 

Mulig jeg kommer tilbake i morgen med kommentarer på de andre kodesnuttene også, eller deler noen helt nye :-)

Den ble utrolig tøff den du postet tilbake! Jeg mente morsom matte fordi den er basert på random, men ser nå at det var noen feil der. Takk for at du tok tiden til å forklare!

Endret av Dan-Levi
Lenke til kommentar

 

En til. Denne regner ut hvor mange år du fyller i år ut i fra fødselsdagen din.

 

[....]

Viktig å leke seg litt :) Du gjorde enkelte valg jeg ikke ville ha gjort.

Litt tilbake meldinger til koden din, jeg sier ikke at det jeg nevner her er rett. Men for å utvikle oss må vi høre hva andre synes ;)

 

Du hardkodet inn årstallet i dag ( 2013 ) jeg ville ha brukt date("Y") så hadde den vært uptodate neste år også.

 

Du bruker også while() der jeg ville ha brukt for( $i = 1; $i >=31; $i++ )

 

Du gjentar også litt kode her, nesten identisk 3 plasser. Liker ikke gjøre det selv :)

 

Denne her forstår jeg ikke helt hvorfor du gjør:

    $birthDate = $day.'/'.$month.'/'.$year;
    $birthDate = explode('/', $birthDate);

Er det ikke like greit å bruke $day osv lenger ?

Hvis du absolutt skal ha dem inn i en array() gjør det slik:

$birthDate = array( $day, $month, $year );

// da kan du bruke
echo $birthDate[0]; // gir deg dagen

Eller 

$birthDate = array( 'day'=>$day, 'month'=>$month, 'year'=>$year );

// der du kan bruke 
echo $birthDate['day'];

Jeg liker heler ikke funksjoner som skriver ut noe ( echo / print ) for neste gang du skal bruke en av disse funksjonene du har laget deg. Så er det ikke sikkert du ønsker at innholdet skal bli skrevet ut.

 

Bruk heler "return" og velg å echo'e det etter på.

 

Jeg har også laget min versjon av denne koden. kom gjerne med spørsmål eller tilbakemeldinger hvis det er noe du lurer på hvorfor jeg valgte å gjøre det slik :) Du finner også en "live" versjon her: http://tronds.net/example/fodt.php

 

Jeg har valgt å plassere alt inni en fil.

<?php

// sjekker om alle $_POST feltene er satt
if( isset( $_POST['day'], $_POST['month'], $_POST['year'] ) ){
	$day = $_POST['day'];
	$year = $_POST['year'];
	$month = $_POST['month'];
	// henter alderen
	$age = how_old( $day, $month, $year ); 
	}
else{
	$age = 0;
	$day = 0;
	$year = 0;
	$month = 0;
	}

// lager <option> for oss. 
function mk_option_value( $selected, $start, $stop){
	$back = "";
	// plusser på en ekstra her slik at den kan telle opp/ned til rett $stop tall
	if( $start < $stop ) 
		$stop += 1;
	else
		$stop -= 1;
	for( $i = $start; $i != $stop; ( $start < $stop ?$i++:$i-- ) ){
		$back .= '<option value="'.$i.'" ';
		if( $i == $selected )
			$back .= ' selected ';
		$back .= '>'.$i.'</option>';	
		}
	return $back;
	}

// regner ut hvor gammel personen er
function how_old( $day, $month, $year ){
	$age = date("Y")-$year; // finner ut hvor mange år
	if( time() < mktime( 0,0,0,$month, $day, date("Y"))) // hvis personen ikke har hatt bursdag enda, så fjerner vi et år.
		$age--;
	return $age;
	}	

?>
<html>
<head>
	<title></title>
	<meta charset="UTF-8">
</head>
<body>
	<h1>Hvor gammel er du hvis du var født i:</h1>
	<form method="POST" action="">
		<select name="day">
			<?php echo mk_option_value( $day, 1, 31); ?>
			</select>
		<select name="month">
			<?php echo mk_option_value( $month, 1, 12); ?>
			</select>
		<select name="year">
			<?php echo mk_option_value( $year, 1970, date("Y")); ?>
			</select>
		<input type="submit" value="Kalkuler alder">
	</form>
	<?php 
		if( $age >= 0 )
			echo "<h1>Du er da ".$age."</h1>";
			?>
</body>
</html>
  • Liker 1
Lenke til kommentar
  • 2 uker senere...

Enda en liten doodle, QR kode generator ved hjelp av Google Charts.

 

HTML - index.html

<form id="qrgenerator" name="qrgenerator" action="genqr.php" method="POST">
<label>Skriv inn data her</label>
<input name="qrdata" type="text" placeholder="Skriv inn data her" />
<br>
<br>
<label>Størrelse</label>
<select name="qrsize">
    <option value="100x100">100x100</option>
    <option value="200x200">200x200</option>
    <option value="300x300">300x300</option>
</select>
<br>
<input type="submit" value="Lag QR-kode" />
</form>
<br>
<div id="qrresult" />
<script src="http://ajax.googleapis.com/ajax/libs/jquery/latest/jquery.js" />
<script src="script.js" />

jQuery - script.js

jQuery(document).ready(function() {
    $('#qrgenerator').submit(function() {
    var data = $('#qrgenerator').serialize();
    $.ajax({
        url: 'genqr.php',
        type: 'POST',
        data: data,
    })
    .done(function(data) {
        $('#qrresult').html(data);
    })  
    return false;
    });
});</pre>

PHP - genqr.php

if (empty($_POST['qrdata'])) {
    echo 'Data empty';
} else {
    $qrsize = urlencode($_POST['qrsize']);
    $qrdata = urlencode($_POST['qrdata']);

    function getqr($qrsize, $qrdata){
        $qrresult = '<img src="http://chart.apis.google.com/chart?chs='.$qrsize.'&cht=qr&chl='.$qrdata.'&choe=%20​UTF-8&chld=M|0" />';
        return $qrresult;
    }
echo getqr($qrsize, $qrdata);

Link til fungerende eksempel: http://www.dan-levi.no/qr/

Endret av Dan-Levi
Lenke til kommentar

Hei,

 

Enda en liten morsom sak jeg eksperimenterte med, dynamiske $_POST tilordnet dynamiske variabler.

 

HTML

<!DOCTYPE html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>POST</title>
    <meta name="description" content="">
    <meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<h1>POST</h1>
	<form method="POST" action="test.php">
		<label>firstname</label>
		<br>
		<input type="text" name="firstname" />
		<br><br>
		<label>lastname</label>
		<br>
		<input type="text" name="lastname" />
		<br><br>
		<label>email</label>
		<br>
		<input type="email" name="email" />
		<br><br>
		<label>street</label>
		<br>
		<input type="text" name="street" />
		<br><br>
		<label>company</label>
		<br>
		<input type="text" name="company" />
		<br><br>
		<label>phone</label>
		<br>
		<input type="text" name="phone" />
		<input type="submit" value="POST" />
	</form>

    
</body>
</html>

PHP

<?php
// Sett opp Array
$data = array();
$i = 0;
// For hver $_POST ( eks. $_POST['email'] )
foreach ($_POST as $key => $value) {

	// lag dynamisk variabel basert på $_POST['navn']
	// og tildel dynamisk variabel informasjonen
	${$key} = utf8_decode($value);
	$i++;
}
// Da kan informasjonen lett brukes slik.
echo $firstname.'<br>';
echo $lastname.'<br>';
echo $email.'<br>';
echo $street.'<br>';
echo $company.'<br>';
echo $phone.'<br><br>';
echo '<b>Antall: '.$i.'</b>';
?>

Kjekk forutsatt at du kjenner POST navnene? :-)

Endret av Dan-Levi
Lenke til kommentar

[...]

	${$key} = utf8_decode($value);

Kjekk forutsatt at du kjenner POST navnene? :-)

 

Kan være farlig også, for du vet aldri hva brukeren putter inn av nye felt i <form> før han sender tilbake til deg :) men det er jo en smart løsning..... hva om vi gjorde slik i stede for:

<?php
// Sett opp Array
$data = array();
$i = 0;
// For hver $_POST ( eks. $_POST['email'] )

$wanted = array( "firstname", "lastname", "email", "street", "company", "phone" );
foreach ($wanted as $nr=> $key) {
	// lag dynamisk variabel basert på $_POST['navn']
	// og tildel dynamisk variabel informasjonen
	${$key} = utf8_decode( $_POST[$key] );
	$i++;
}
// Da kan informasjonen lett brukes slik.
echo $firstname.'<br>';
echo $lastname.'<br>';
echo $email.'<br>';
echo $street.'<br>';
echo $company.'<br>';
echo $phone.'<br><br>';
echo '<b>Antall: '.$i.'</b>';
?>

( Uprøvd kode )

 

For da har du bedre kontroll på hva som kommer inn.

Lenke til kommentar

 

Kan være farlig også, for du vet aldri hva brukeren putter inn av nye felt i <form> før han sender tilbake til deg :) men det er jo en smart løsning..... hva om vi gjorde slik i stede for:

<?php
// Sett opp Array
$data = array();
$i = 0;
// For hver $_POST ( eks. $_POST['email'] )

$wanted = array( "firstname", "lastname", "email", "street", "company", "phone" );
foreach ($wanted as $nr=> $key) {
	// lag dynamisk variabel basert på $_POST['navn']
	// og tildel dynamisk variabel informasjonen
	${$key} = utf8_decode( $_POST[$key] );
	$i++;
}
// Da kan informasjonen lett brukes slik.
echo $firstname.'<br>';
echo $lastname.'<br>';
echo $email.'<br>';
echo $street.'<br>';
echo $company.'<br>';
echo $phone.'<br><br>';
echo '<b>Antall: '.$i.'</b>';
?>

( Uprøvd kode )

 

For da har du bedre kontroll på hva som kommer inn.

Den likte jeg!

 

 

En reimplementasjon av register globals. Nydelig.

Mulig det ligner på noe annet, jeg er ingen PHP spesialist så du må gjerne demonstrere register globals med samme utfall. Jeg ser dog at register globals er deprecated og fjernet fra php etter versjon 5.4.0

Lenke til kommentar

En reimplementasjon av register globals. Nydelig.

Opps, helt rett. Min feil, får skylde på at jeg startet med programmering for tidlig på dagen ;)

 

linjen

${$key} = utf8_decode( $_POST[$key] );

Skal selvfølgelig være:

${$key} = utf8_decode( (isset( $_POST[$key] ) ? $_POST[$key]:"" ) );

Takk for at du pekte ut feilen, men neste gang synes jeg du heler kan gi noen eksempler, i stede for bare å være ironisk :)

Lenke til kommentar

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...