Gå til innhold

PHP kode som andre kanskje kan bruke


Anbefalte innlegg

det 'mest korrekte' blir vel å bruke konstanten DIRECTORY_SEPERATOR som der definert i php til \ på windows og / på *nix

 

Tusen takk!

 

Endelig kan jeg kaste funksjonen min som sjekker etter hvordan O/S serveren kjører for å bestemme hvorvidt den skal bruke \ eller /.

 

Irriterer meg sykt at jeg ikke har tenkt over at det antakelig er en konstant for det ja ...

 

 

Må si mæ uenig i at selvlært ikke alltid er vellært.

 

Ærlig talt.

Selvlært er ikke alltid vellært.

 

Såklart gir skole mer kompetanse da man faktisk har ett pensum man må igjennom.

 

Jeg, som hobbybruker av php, har ingen problemer med å innse at jeg hadde SLETET om noen ba meg forklare datasortering av diverse ymse typer.

 

(For genial film, se her: http://www.youtube.com/watch?v=F3oKjPT5Khg )

 

Med mindre man har litt disiplin kommer ikke programmeringstankegangen av seg selv, og igjennom en skole blir man gjerne tvunget til å holde på med elementære ting lenge nok til at man faktisk får det inn i fingrene og vel så det. Det selvlærte folk typisk gjør er å haste seg frem så de kan lage noe spennende og stort, dette være seg CMS, mafiaspill, script for nyhetspublisering e.l.

 

Disiplin?

Det trengs da ærlig talt ikke noe annet enn ørlite granne selvinnsikt.

 

Jeg skal tilstå at jeg ikke var bedre enn mange her da jeg begynte. Ser tilbake til mine første poster i VB delen av forumet med gru!

 

Men virkeligheten innhentet meg etter hvert, og jeg så at etter hvert at den eneste måten å lære riktig tankegang er ved å ta ett skritt av gangen.

 

Og heldigvis har jeg MYYYYYE igjen å lære enda. Å lære er noe av det morsomste med dette.

Endret av ze5400
Lenke til kommentar
  • 2 uker senere...
Videoannonse
Annonse

Har en email viser (viser en email i et bilde) som jeg lagde til et prosjekt

Klikk for å se/fjerne innholdet nedenfor
 <?php

header('content-type: image/png');

 

//hente info

$id = htmlspecialchars($_GET['id']);

$admin = htmlspecialchars($_GET['admin']);

 

if(!empty($id)) {

//sql spørring er, ork ikke å koble til db og sånt nå

$text = $id;

} else {

$text = 'Fant ikke bruker';

}

 

$length = strlen($text);

 

if($admin == true) {

$admin_add = 16;

$icon = imagecreatefrompng('admin.png');

} else {

$admin_add = 0;

}

$font = 2;

$font_height = imagefontheight($font);

$img_length = $length * 6; //antall pixler per bokstav

$img_length += 20 + $admin_add; //antall pixler på sidene

$font_height = imagefontheight($font);

$img_height = $font_height + 11;

 

 

$im = @imagecreate($img_length, $img_height);

$bg = imagecolorallocate($im, 255, 255, 255);

 

$black = imagecolorallocate($im, 0, 0, 0);

$white = imagecolorallocate($im, 255, 255, 255);

imagecolorset($im, $white, 0, 0, 0);

 

if($admin) {

imagecopymerge($im,$icon,1,5,0,0,16,16,100);

 

}

 

 

imagestring($im, $font, 5 + $admin_add, 5, $text, $black);

 

imagepng($im);

imagedestroy($im);

imagedestroy($icon);

?>[/code

Grunnen til at det er støtte for et admin bilde (admin.png) er fordi dette er til et nettsamfunn

Forslag til forbedringer mottas med takk :)

 

Demo http://alexander.no-ip.org/email_viser.php

 

EDIT:

Skal forbedre et opplastnings script jeg har og trenger et script som finner skadlige filer.

kan alltids finne på noe sjøl, men orker ikke xD

Endret av AlecTBM
Lenke til kommentar

Kode som regner ut hvor lenge det er til lønning =)

Herlig <3 Laget dette nettopp ;p

 

<?php

if(isset($_GET["submit"]))
{
$lonningsdag = $_GET["lonningsdato"];
$dagerimnd = date("t");
$dagnummer = date("d");
$dagerigjen = (($dagerimnd-$dagnummer)+$lonningsdag);
echo "Det er ".$dagerigjen.($dagerigjen==1?" dag til lønning OMFG!":" dager til lønning!");
}
else
{
	echo
	'<h1>Hvilken dato får du lønning?</h1>
	<form action="" method="get">
	<select name="lonningsdato">
	  <option value ="1">1</option>
	  <option value ="2">2</option>
	  <option value ="3">3</option>
	  <option value ="4">4</option>
	  <option value ="5">5</option>
	  <option value ="6">6</option>
	  <option value ="7">7</option>
	  <option value ="8">8</option>
	  <option value ="9">9</option>
	  <option value ="10">10</option>
	  <option value ="11">11</option>
	  <option value ="12">12</option>
	  <option value ="13">13</option>
	  <option value ="14">14</option>
	  <option value ="15">15</option>
	  <option value ="16">16</option>
	  <option value ="17">17</option>
	  <option value ="18">18</option>
	  <option value ="19">19</option>
	  <option value ="20">20</option>
	  <option value ="21">21</option>
	  <option value ="22">22</option>
	  <option value ="23">23</option>
	  <option value ="24">24</option>
	  <option value ="25">25</option>
	  <option value ="26">26</option>
	  <option value ="27">27</option>
	  <option value ="28">28</option>
	  <option value ="29">29</option>
	  <option value ="30">30</option>
	  <option value ="31">31</option>
	</select>
	<input type="submit" name="submit" value="OK"/>
	</form>';
}


?>

Lenke til kommentar
Gjest Slettet+6132

Hva om jeg får lønn hver 14. dag? Hva skjer om jeg skriver inn den 31. februar? Koden er nok et eksempel på hva som ikke hører hjemme her i tråden. Du kunne da i det minste brukt date('t') sammen med en loop for å ikke skrive ut flere dager enn det faktisk er i måneden.

 

<?php
if(){}
else
{
?>
<h1>blabla</h1>
<form>
<select>
<?php for($i = 1;$i<=$dagerimnd;$i++) { echo "<option value=\"{$i}\">{$i}</option>\n"; } ?>
</select>
</form>
<?php } ?>

 

Og dessuten funker ikke koden din. I dag er det den 23., om jeg får lønn den 24. er det i følge ditt script 32 dager (((31-23)+24) = 32) til jeg får lønn.

Se litt her heller

Endret av Slettet+6132
Lenke til kommentar

Synes denne tråden er moden for å få et nytt navn:

Stort sett crappy kode du ikke burde se

Vranglærtes kodeeksempler (dessverre vil denne ramme de få gode kodesnuttene her)

How-not-to

Kodespøkelser for sarte programmeringssjeler

 

osv.

Endret av Peter
  • Liker 1
Lenke til kommentar
[........]
do
{
	if (($char = $allowed_chars[mt_rand(0, strlen($allowed_chars) - 1)]) !== false && ($unique ? strpos($ret, $char) === false : true))
	{
		$ret .= $char;
	}
}
while (strlen($ret) < $len);

[.........]
}

 

Jeg får følelse av at den if'en ikke var ment å vises til andre? Jeg synes iallefall at den var litt vel vanskelig å dekode. :)

Lenke til kommentar
  • 5 måneder senere...

her er en liten bbcode som jeg og en kompis laga for et par dager siden...

bruksmåten er veldig enkel. bare skriv [tinyurl]http://en-lang-link-her.no[/tinyurl] så får du tilbake en tinyurl versjon av linken :)

kanskje ikke så suuuper nyttig, men litt fancy er den jo :p

 

function bbcode($data)
{
if (strstr($data,"[tinyurl]")) {
	preg_match("/\[tinyurl\](.*)\[\/tinyurl\]/isU",$data,$url);
	if (!eregi("http://",$url['1'])) {
	   $href = "http://" .$url['1'];
	} else {
	  $href = $url['1'];
	}
	$service_port = getservbyname('www', 'tcp');
	$address = gethostbyname('turl.no');
	$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

	$field = "url";
	$value = $href;
	$final = urlencode($field)."=".urlencode($value);
	socket_connect($socket, $address, $service_port);
	$in = "GET /index.php?save=y&url=".urlencode($value)."&robourlaction=Forkort HTTP/1.1\r\n";
	$in .= "Host: turl.no\r\n";
	$in .= "Content-type: application/x-www-form-urlencoded\r\n";
	$in .= "Content-length: ".strlen($final)."\r\n\r\n";
	$in .= "Connection: close\r\n\r\n";
	$in .= $final."\r\n\r\n";
	$out = '';
	socket_write($socket, $in, strlen($in));
	while ($out = socket_read($socket, 2048)) {
		$pattern = "/http:\/\/turl.no\/index.php\/(?:[a-zA-Z0-9])+/i";
		if (preg_match($pattern,$out,$turl)) {
			$turl[0] = str_replace("index.php/","",$turl[0]);
			$data = preg_replace("/\[tinyurl\](.*)\[\/tinyurl\]/isU","<a href=\"".$turl[0]."\" target=\"_blank\">".$turl[0]."</a>",$data);
		}
	}
}
}

 

en annen som er litt mer nyttig er denne.. nå er jeg ganske ny i det her sql injection greiene.. bare brukt mysql_real_escape_string() og htmlspecialchars() hittil.. så forbedringer på den blir veldig godt mottatt :)

bruksmåte: legg $safeget = safe_get(); øverst i dokumentet og bruk så $safeget hva du vil.

min bruk er slik: (brukeren får opp en helt blank side uten noe html)

<?php (safe_get()) ? exit() : false; ?>

---

function safe_get()
{
if ($_GET && !empty($_GET)) {
	foreach($_GET as $check) {
		$pattern = '/(DELETE|ALTER|SELECT|INSERT|UNION|CHAR|CONSTCHAR|INTO OUTFILE|DROP|TRUNCATE(.*))+/';
		if (!preg_match($pattern,$check)) { 
			$result = false;
		} else {
			$result = true;
			break;
		}
	}
	return $result;
}
}

Endret av helbom
Lenke til kommentar
  • 1 år senere...

[ ser at tråden er gammel, men prøver alikevel ]

 

så, hvordan henter jeg informasjon fra databasen med prepared statements?

Her er et kjappt og strippa eksempel med mysql_real_escape_string();:

<?php
 $var_fld = mysql_real_escape_string($_POST['helloWorld']);
 $qry = sprintf('SELECT * FROM tbl WHERE fld = \'%s\'',$var_fld);
 $res = mysql_query($qry);
 if (mysql_num_rows($res) < 1) { return false; }
 else
 {
   $get = mysql_fetch_assoc($res);
 }
?>

 

Dette eksempelet er hentet fra php.net, men klarte ikke helt å skjønne oppsettet...

<?php
$stmt = $dbh->prepare("SELECT * FROM REGISTRY where name = ?");
if ($stmt->execute(array($_GET['name']))) {
 while ($row = $stmt->fetch()) {
   print_r($row);
 }
}
?>

Endret av Yawa
Lenke til kommentar

Yawa: her ser du ett eksempel på de vanligste funksjonene:

 

$id = "hehe, dette er SQL-injection";
$navn = "Fant ikke navn";

$conn = new mysqli("localhost", "brukernavn", "passord", "databasenavn");

$stmt = $conn->prepare("SELECT navn FROM navnetabell WHERE id = ? LIMIT 1");
$stmt->bind_param("i", $id); //Setter ID inn i spørringen, i = integer (finnes også s(tring) d(ouble) + noen jeg ikke husker i farten)

$stmt->execute(); //utfører spørringen

$stmt->store_result(); //Lagrer resultatet
if ($stmt->num_rows() == 1) { //Jeg vil bare ha ett navn
  $stmt->bind_result($navn); //Binder resultatet til en variabel;
  $stmt->fetch(); //Henter utfører "bindingen", kan brukes i en while hvis du forventer flere resultater
}
$stmt->free_result();

return $navn;

 

Eller prepare statements uten å binde opp noen variabler til spørringen:

 

$navnArray = array();

$conn = new mysqli("localhost", "brukernavn", "passord", "databasenavn");

$stmt = $conn->query("SELECT * FROM navnetabell ORDER BY navn");

while ($row = $stmt->fetch_array()) {
 $navnArray[] = $row;
}

$stmt->free_result();

return $navnArray;

 

Så finnes det masse fine funksjoner som å deaktivere autocommit, prepare flere spørringer også comitte eller rulle tilbake :D

 

Tar forbehold om syntaxfeil :p

Lenke til kommentar

Bruk heller PDO.

 

Et par eksempler på bruk av PDO:

 

Koble til:

 

<?php

$connection = new PDO('mysql:host=localhost;dbname=db_name', 'root', 'root');

 

 

Hente flere rader:

 

<?php
$statement = $connection->prepare("SELECT title, description FROM products WHERE type = ?");
$statement->execute(array($_GET['type']));

$products = $statement->fetchAll(PDO::FETCH_OBJ);
foreach ($products as $product) {
echo $product->title;
}

var_dump($products);

 

 

Hente én rad:

 

<?php
$statement->prepare("SELECT * FROM products WHERE id = ?");
$statement->execute(array($_GET['id']));

$product = $statement->fetchObject();
var_dump($product);

 

 

Legge til en rad:

 

<?php
$statement->prepare("INSERT INTO products (title, description) VALUES(?, ?)");
$statement->execute(array($_POST['title'], $_POST['description']));
echo $connection->lastInsertId();

 

 

Du har også en rekke andre metoder, men de finnes i manualen. Legg merke til at du også kan navngi parameterene når de bindes, men selv foretrekker jeg bruk av ?. Om du vil gå enda et skritt videre, kan du lese litt om ORMer som Doctrine. Doctrine har også et database abstraction layer bygget på toppen av PDO.

Endret av Josh Homme
Lenke til kommentar

vil dere si at dette er MYE bedre?

 

og i hvilke tilfeller kan PDO, prepared statements og "ordinær" mysql_real_escape_string være fordelaktig?

 

Det hele ligger vel i sikkerhet. Som eks. å hente ut en artikkel har ikke samme krav som å la en bruker publisere noe i en gjestebok.

Lenke til kommentar

Å hente ut en artikkel kan også være risikabelt. Kanskje ikke alle har tilgang til alle artikler og vips - så har noen lurt inn en «' OR true #» og likevel fått hentet alle. Det er uansett en god ting å tilegne seg ordentlige vaner, enten sikkerhet er viktig eller ei.

Lenke til kommentar
  • 5 måneder senere...

Kode for å validere hele tall.

 

Blokkerer ugyldige tall som +999+, -999 osv. :)

 

		public static function ValiderTall($val) {
		if(preg_match('/^\d+$/', $val)) {
			if(substr_count('+', $val) === 0) {
				return true;
			}
			else {
				return false;
			}
		}
		else {
			return false;
		}
	}

 

Forslag til forberinger? Er det andre ugyldige type tall som kan komme igjennom funksjonen min?

Lenke til kommentar

PHP har innebygde funksjoner for å validere forskjellige typer input.

 

filter_var($number, FILTER_VALIDATE_INT);
filter_var($email, FILTER_VALIDATE_EMAIL);
filter_var($url, FILTER_VALIDATE_URL);

.. dessuten kunne du vel bare skrevet det på følgende måte.

 

function validateInteger ($value) {
   return preg_match('/^[0-9]+$/', $value);
}

Endret av Jonas
Lenke til kommentar
  • 1 år senere...

- så har noen lurt inn en «' OR true #» og likevel fått hentet alle.

 

Eventuelt fått sletta alle artiklene, endret alle passordene etc. Selv om spørringen i utgangspunktet er en select kan inject-koden være hva som helst ...

 

http://www.unixwiz.n...-injection.html

 

Et av de morsomste eksemplene jeg vet om stammer fra det svenske riksdagsvalget hvor det er mulig å skrive fritekst på stemmesedlene. (Disse må da digitaliseres eller punches i ettertid.) Det er sef. mange som stemmer på Kalle Anka-Partiet og slikt, men jaggu var det ikke noen som stemte på partiet DROP TABLE VALJ også ... Om det kunne ha virket er de visst ikke blitt enige om enda ... :o)

 

http://www.val.se/val/val2010/handskrivna/handskrivna.xls

Endret av quantum
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...