Gå til innhold

PHP kode som andre kanskje kan bruke


Anbefalte innlegg

Foreslår at alle som skal legge ut kode her må legge ut en side der koden kjører så vi kan misbruke scriptene deres brutalt nok til at de kanskje skjønner at ikke hva som helst av _DRITT_ burde legges ut. Jeg blir oppriktig provosert av å se den koden her etter det som har blitt skrevet rett over.

Selvinnsikt folkens, SELVINNSIKT.

Lenke til kommentar
Videoannonse
Annonse

Spørs hvor nyttig det her er, men det er nå iallfall rekursiv funksjon for lesing av mappestruktur. Det finnes forsåvidt kode på nettet som gjør nettopp det, men til forskjell fra det jeg hittil har sett er ikke dette en rekursiv funksjon. Den benytter en stack for å lagre unna mapper som må besøkes. Teoretisk sett skal det både være raskere og mindre ressurskrevende (primært RAM). Hvorvidt det faktisk er det kan jeg ikke si for sikkert. Selve koden er forøvrig heller dårlig kommentert med unntak av de første linjene, men har man litt peiling bør det være ganske trivielt det som foregår. Skulle noen alikevel lure på hva som foregår så spør for all del. Forøvrig bare å gjøre hva dere vil med koden, og den vil selvfølgelig ikke skrive ut strukturen skjerm, nettleser eller annet. Dette er ren businesslogikk. Presentasjonsdelen må man skrive selv, eller spørre meg peeeeent :love: Konstruktiv tilbakemelding mottas med stor takk :)

 

PS: Koden er utestet i Windows. For alt jeg veit kan koden krasje på windows-servere. Dog testet i Linux (dvs. Fedora 8 og 9).

 

/*
* This code is public domain, and you can do whatever you want with it.
* Please note that by using this code you accept that I have no responsible for
* any damange caused by it. Given the right structure, that is a link refering
* to a parent folder and $followLink=true, this code WILL create an endless
* loop, and you can not blame me if you get kicked by your webhost.
*
* You do not need to give me credit for this work, but if you want to, please
* contact me at ernie(at)ascdevel(dot)com. You are very welcome to report bugs
* found in the code to the same email-address.
* 
* That been said: This function will read any given path (1. paramter) recursive,
* and return an array with the given structure. Hidden files in *nix (that is
* files and folders starting with a dot) is excluded by default and can be
* included by giving true as 2. paramter. Setting 3. paramter to true will 
* include links. Note that Windows-type shortcuts are NOT regared as links in
* this context, and Windows-type shortcuts refering to folders will not be visited.
* 
* Example of return value from folder with the following structure:
*  file1
*  file2 
*  subfolder
*    another-subfolder
*    file-in-subfolder
*
* var_dump of returned array:
array(3) {
 [0]=>   
 array(3) {
   ["name"]=>
   string(5) "file1"
   ["path"]=>       
   string(40) "/home/Ernie/temp/recursive-testing/file1"
   ["directory"]=>                                      
   bool(false)                                          
 }                                                      
 [1]=>                                                  
 array(3) {                                             
   ["name"]=>                                           
   string(5) "file2"                                    
   ["path"]=>                                           
   string(40) "/home/Ernie/temp/recursive-testing/file2"
   ["directory"]=>
   bool(false)
 }
 [2]=>
 array(4) {
   ["name"]=>
   string(9) "subfolder"
   ["path"]=>
   string(44) "/home/Ernie/temp/recursive-testing/subfolder"
   ["directory"]=>
   bool(true)
   ["subcontent"]=>
   array(2) {
     [0]=>
     array(4) {
       ["name"]=>
       string(17) "another-subfolder"
       ["path"]=>
       string(62) "/home/Ernie/temp/recursive-testing/subfolder/another-subfolder"
       ["directory"]=>
       bool(true)
       ["subcontent"]=>
       array(0) {
       }
     }
     [1]=>
     array(3) {
       ["name"]=>
       string(17) "file-in-subfolder"
       ["path"]=>
       string(62) "/home/Ernie/temp/recursive-testing/subfolder/file-in-subfolder"
       ["directory"]=>
       bool(false)
     }
   }
 }
}
*/
function scanDirRecursive($path, $includeDot=false, $followLink=false)
{
   //Assuming \ should be used if / is not present in path. This might be
   // wrong, but should work in most cases (Win, *nix etc.)
   $slash = (strpos($path, '/') === false) ? '\\' : '/';

   //Adding slash to end of path if not already present
   if ($path{strlen($path)-1} !== $slash) $path .= $slash;

   //$stack should be used as a lifo list also known as a stack. Access with 
   // array_push and array_pop
   // Each element in stack should contain absolute path with
   // delimiting / and pointer/reference to location in $dirContent
   $stack = array();

   //Multidimensional array. Each element should containt an array with
   // name of file/folder, absolute path, directory=true/false and 
   // subcontent with array of new elements if direcory is true 
   $dirContent = array();

   //Creating exclude array for convenience if .stuff should be included
   // . and .. must however never be included. If .stuff should not be
   // included we'll just check the first character in the name 
   if ($includeDot === true)
       $exclude = array('.', '..'); 
   else
       $exclude = array();

   //Scanning root folder to populate $stack
   if (($tempDir = scandir($path)) === false) return false;

   for ($i = 0, $tempLen = count($tempDir); $i < $tempLen; $i++)
   {
       $e = $tempDir[$i];
       $ePath = $path.$e;

       //Excluding . .. and links. .stuff will also be excluded if requested 
       if (($includeDot === true && in_array($e, $exclude)) ||
               ($includeDot === false && $e{0} === '.') ||
               ($followLink === false && is_link($ePath)))
           continue;
       elseif (is_dir($ePath))
       {
           $dirContent[] = array('name'=>$e, 'path' => $ePath,
                                 'directory'=>true,
                                 'subcontent' => array());
           array_push($stack, array('path' => $ePath.$slash,
                      'reference'=>
                           &$dirContent[count($dirContent)-1]['subcontent']));
       }
       else
           $dirContent[] = array('name'=>$e, 'path' => $ePath,
                                 'directory'=>false);
   }

   while (count($stack) !== 0)
   {
       $element = array_pop($stack);
       $tempPath = $element['path'];
       $tempDC = &$element['reference'];

       if (is_readable($tempPath) === false)
           continue;
       elseif (($tempDir = scandir($tempPath)) === false)
           continue;

       for ($i = 0, $tempLen = count($tempDir); $i < $tempLen; $i++)
       {
           $e = $tempDir[$i];
           $ePath = $tempPath.$e;

           //Excluding . and .. 
           // .stuff and links can also be excluded if requested
           if (($includeDot === true && in_array($e, $exclude)) ||
                   ($includeDot === false && $e{0} === '.') ||
                   ($followLink === false && is_link($ePath)))
               continue;
           elseif (is_dir($ePath))
           {
               $tempDC[] = array('name' => $e, 'path' => $ePath,
                                 'directory' => true,
                                 'subcontent' => array());
               array_push($stack, array('path' => $ePath.$slash,
                          'reference'=>
                               &$tempDC[count($tempDC)-1]['subcontent']));
           }
           else
               $tempDC[] = array('name' => $e, 'path' => $ePath,
                                 'directory' => false);
       }
   }
   return $dirContent;
}

Lenke til kommentar
  • 2 uker senere...

En kode jeg har skrevet, som tvinger fram innlogging.

Du setter brukernavn å passord, der det står //Bruker og //Pass.

 

Vis du vil ha flere brukere som skal ha tilgang, gjør du slik:

 

$brukere = array(
					// Bruker 1
					'admin' // Bruker
						=>
					'demo', // Pass

					// Bruker 2
					'admin2' // Bruker2
						  =>
					'demo2'); // Pass2

 

 

 

Hele koden til scriptet finner du her:

 

<?php

function bruker_logginn($bruker, $pass)
	{
		$brukere = array(
					'admin' // Bruker
						=>
					'demo'); // Pass

		if(isset($brukere[$bruker]) && ($brukere[$bruker] == $pass)) {
			return true;
		} else {
			return false;
		}
	}

if (!bruker_logginn($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW'])) {

	header('WWW-Authenticate: Basic realm="Logg Inn!"');
	header('HTTP/1.0 401 Unauthorized');
	echo "Innlogingen ble mislykket! Prøv igjen.";
	exit;

}

//////////////////////////////////////////////////////////////
// Dette vises helt til nettleseren lukkes! (innlogget)
//////////////////////////////////////////////////////////////
else {

	?>
	<p><h1>Du er nå logget inn!</h1></p>
	<?php

}

?>

Endret av creAtiive
Lenke til kommentar

Vel, for det første hardkoder du brukernavn og passord i scriptet ditt, noe som ikke er spesielt fleksibelt eller skalerbart. For det andre trenger man ikke engang et eget PHP-script for å gjøre dette, det er en integrert funksjon i Apache. Det er både enklere, sikrere og mer fleksibelt å gjøre en så basic brukerautentisering direkte i .htaccess eller httpd.conf at jeg ikke skjønner hvorfor du heller ønsker en løsning der både brukernavn og passord er hardkodet i klartekst i et PHP-array.

 

Hvis PHP skulle kræsje på serveren din, så vil hvem som helst kunne se både brukernavn og passord for alle brukere i adminscriptet ditt. Derfor skal man aldri lagre denne typen informasjon så den er potensielt tilgjengelig for folk som besøker siden din. Den bør enten lagres i en database, eller i en fil utenfor webroot.

 

En annen ting er at dette scriptet krever at du har kodesnutten i hver bidige lille fil du ønsker å beskytte. Hvis du derimot kjører HTTP-autentisering direkte i .htaccess/httpd.conf, så kan du velge å beskytte samtlige filer i alle undermapper, uten å måtte endre en linje med kode.

 

Dette er svært grunnleggende, og noe hvemsomhelst kan kopiere fra en tutorial eller skrive selv på to minutter. Koden din er ubrukelig, og absolutt ikke noe jeg vil anbefale for andre å bruke. Derfor hører den ikke hjemme i denne tråden.

 

Edit: I tillegg kan man forbedre koden din på mange områder hvis man absolutt ønsker denne formen for brukerautentisering:

<?php

$users = array('admin' => 'demo');

$auth_user = & $_SERVER['PHP_AUTH_USER'];
$auth_pass = & $_SERVER['PHP_AUTH_PW'];

if (!isset($auth_user) || !isset($auth_pass) || !isset($users[$auth_user]) || $auth_pass !== $users[$auth_user])
{
header('WWW-Authenticate: Basic realm="Logg inn:"');
header('HTTP/1.1 401 Unauthorized');

die('Feilmelding her.');
}

?>
Du er nå logget inn. Her kommer hva enn du ønsker av kode. Man trenger ikke en else-blokk.

Endret av Lokaltog
Lenke til kommentar

Auto-slett ting fra tabellen etter en viss tid.

Scriptet må kjøres en gang om dagen, dette er kun et eksempel - hentet fra en php bok:

 

 

 

Example 8-6. delete-user.php

 

$window = 7; // in days
if ($r = mysql_query("DELETE FROM users WHERE verified = 0 AND
created_on < DATE_SUB(NOW(),INTERVAL $window DAY)")) {
if ($deleted_users = mysql_affected_rows()) {
print "Deactivated $deleted_users users.\n";
}
} else {
print "Can't delete users: ".mysql_error();
}

 

Run this program once a day to scrub the users table of users that haven't been verified.

If you want to change how long users have to verify themselves, adjust the value of $window, and update the text of the email message sent to users to reflect the new value.

Endret av creAtiive
Lenke til kommentar

Et script som kjører en MySQL-spørring..? Tuller du?

 

Dette kan ikke brukes av noen som helst, og har absolutt ingen nytteverdi. Vær så snill og les innleggene mine én gang til, titt på din egen kode og vurder saken nøye før du poster noe som helst her igjen.

 

Selvinnsikt folkens, SELVINNSIKT.
Lenke til kommentar

Jesu fader! At det går ann!

 

Ta til deg kritikken du får creAtiive. Ingen gjør det for å være stor, stygg og slem.

De "kodene" du poster er direkte lavmål, og kan egentlig ikke bruker til andre ting enn akkurat det du bruker til, da såpass mye er hardkodet, og det meste er noe en med middels erfaring i PHP kan lage uten å tenke så alt for mye.

 

Som sagt tidligere, du virker som en nybegynner som tror du er best i verden, og vifte rundt med hver eneste kodesnutt du har klart å lage.

Lenke til kommentar
og vifte rundt med hver eneste kodesnutt du har klart å lage.

 

 

Det er ikke sant ;)

Laget et halvferdig mafiaspill. Mangler bare å lage noen funksjoner til, skal jeg poste dem også kansje?

 

Du er klar over at du nettopp beviste at han har rett?

Endret av AlecTBM
Lenke til kommentar
Spørs hvor nyttig det her er, men det er nå iallfall rekursiv funksjon for lesing av mappestruktur. ...

 

Fin liten funksjon det der, eneste eg reagerer på er første linja der du bestemmer deg for å bruke \ eller /, det 'mest korrekte' blir vel å bruke konstanten DIRECTORY_SEPERATOR som der definert i php til \ på windows og / på *nix

Lenke til kommentar
Spørs hvor nyttig det her er, men det er nå iallfall rekursiv funksjon for lesing av mappestruktur. ...

 

Fin liten funksjon det der, eneste eg reagerer på er første linja der du bestemmer deg for å bruke \ eller /, det 'mest korrekte' blir vel å bruke konstanten DIRECTORY_SEPERATOR som der definert i php til \ på windows og / på *nix

Vel, greia er at Windows fint takler / i banene så å bruke DIRECTORY_SEPARATOR er ikke nødvendig. Eneste grunnen til at de linjene er der er egentlig for å ikke ende opp med "C:\bla\bla/bla/bla" hvilket fint fungere, men er ikke akkurat pent. Litt «dirty» metode å gjøre det på, men jeg så ingen andre alternativer der og da.

Lenke til kommentar
Spørs hvor nyttig det her er, men det er nå iallfall rekursiv funksjon for lesing av mappestruktur. Det finnes forsåvidt kode på nettet som gjør nettopp det, men til forskjell fra det jeg hittil har sett er ikke dette en rekursiv funksjon. Den benytter en stack for å lagre unna mapper som må besøkes. Teoretisk sett skal det både være raskere og mindre ressurskrevende (primært RAM). Hvorvidt det faktisk er det kan jeg ikke si for sikkert. Selve koden er forøvrig heller dårlig kommentert med unntak av de første linjene, men har man litt peiling bør det være ganske trivielt det som foregår. Skulle noen alikevel lure på hva som foregår så spør for all del. Forøvrig bare å gjøre hva dere vil med koden, og den vil selvfølgelig ikke skrive ut strukturen skjerm, nettleser eller annet. Dette er ren businesslogikk. Presentasjonsdelen må man skrive selv, eller spørre meg peeeeent :love: Konstruktiv tilbakemelding mottas med stor takk :)

 

PS: Koden er utestet i Windows. For alt jeg veit kan koden krasje på windows-servere. Dog testet i Linux (dvs. Fedora 8 og 9).

 

/*
* This code is public domain, and you can do whatever you want with it.
* Please note that by using this code you accept that I have no responsible for
* any damange caused by it. Given the right structure, that is a link refering
* to a parent folder and $followLink=true, this code WILL create an endless
* loop, and you can not blame me if you get kicked by your webhost.
*
* You do not need to give me credit for this work, but if you want to, please
* contact me at ernie(at)ascdevel(dot)com. You are very welcome to report bugs
* found in the code to the same email-address.
* 
* That been said: This function will read any given path (1. paramter) recursive,
* and return an array with the given structure. Hidden files in *nix (that is
* files and folders starting with a dot) is excluded by default and can be
* included by giving true as 2. paramter. Setting 3. paramter to true will 
* include links. Note that Windows-type shortcuts are NOT regared as links in
* this context, and Windows-type shortcuts refering to folders will not be visited.
* 
* Example of return value from folder with the following structure:
*  file1
*  file2 
*  subfolder
*    another-subfolder
*    file-in-subfolder
*
* var_dump of returned array:
array(3) {
 [0]=>   
 array(3) {
   ["name"]=>
   string(5) "file1"
   ["path"]=>       
   string(40) "/home/Ernie/temp/recursive-testing/file1"
   ["directory"]=>                                      
   bool(false)                                          
 }                                                      
 [1]=>                                                  
 array(3) {                                             
   ["name"]=>                                           
   string(5) "file2"                                    
   ["path"]=>                                           
   string(40) "/home/Ernie/temp/recursive-testing/file2"
   ["directory"]=>
   bool(false)
 }
 [2]=>
 array(4) {
   ["name"]=>
   string(9) "subfolder"
   ["path"]=>
   string(44) "/home/Ernie/temp/recursive-testing/subfolder"
   ["directory"]=>
   bool(true)
   ["subcontent"]=>
   array(2) {
     [0]=>
     array(4) {
       ["name"]=>
       string(17) "another-subfolder"
       ["path"]=>
       string(62) "/home/Ernie/temp/recursive-testing/subfolder/another-subfolder"
       ["directory"]=>
       bool(true)
       ["subcontent"]=>
       array(0) {
       }
     }
     [1]=>
     array(3) {
       ["name"]=>
       string(17) "file-in-subfolder"
       ["path"]=>
       string(62) "/home/Ernie/temp/recursive-testing/subfolder/file-in-subfolder"
       ["directory"]=>
       bool(false)
     }
   }
 }
}
*/
function scanDirRecursive($path, $includeDot=false, $followLink=false)
{
   //Assuming \ should be used if / is not present in path. This might be
   // wrong, but should work in most cases (Win, *nix etc.)
   $slash = (strpos($path, '/') === false) ? '\\' : '/';

   //Adding slash to end of path if not already present
   if ($path{strlen($path)-1} !== $slash) $path .= $slash;

   //$stack should be used as a lifo list also known as a stack. Access with 
   // array_push and array_pop
   // Each element in stack should contain absolute path with
   // delimiting / and pointer/reference to location in $dirContent
   $stack = array();

   //Multidimensional array. Each element should containt an array with
   // name of file/folder, absolute path, directory=true/false and 
   // subcontent with array of new elements if direcory is true 
   $dirContent = array();

   //Creating exclude array for convenience if .stuff should be included
   // . and .. must however never be included. If .stuff should not be
   // included we'll just check the first character in the name 
   if ($includeDot === true)
       $exclude = array('.', '..'); 
   else
       $exclude = array();

   //Scanning root folder to populate $stack
   if (($tempDir = scandir($path)) === false) return false;

   for ($i = 0, $tempLen = count($tempDir); $i < $tempLen; $i++)
   {
       $e = $tempDir[$i];
       $ePath = $path.$e;

       //Excluding . .. and links. .stuff will also be excluded if requested 
       if (($includeDot === true && in_array($e, $exclude)) ||
               ($includeDot === false && $e{0} === '.') ||
               ($followLink === false && is_link($ePath)))
           continue;
       elseif (is_dir($ePath))
       {
           $dirContent[] = array('name'=>$e, 'path' => $ePath,
                                 'directory'=>true,
                                 'subcontent' => array());
           array_push($stack, array('path' => $ePath.$slash,
                      'reference'=>
                           &$dirContent[count($dirContent)-1]['subcontent']));
       }
       else
           $dirContent[] = array('name'=>$e, 'path' => $ePath,
                                 'directory'=>false);
   }

   while (count($stack) !== 0)
   {
       $element = array_pop($stack);
       $tempPath = $element['path'];
       $tempDC = &$element['reference'];

       if (is_readable($tempPath) === false)
           continue;
       elseif (($tempDir = scandir($tempPath)) === false)
           continue;

       for ($i = 0, $tempLen = count($tempDir); $i < $tempLen; $i++)
       {
           $e = $tempDir[$i];
           $ePath = $tempPath.$e;

           //Excluding . and .. 
           // .stuff and links can also be excluded if requested
           if (($includeDot === true && in_array($e, $exclude)) ||
                   ($includeDot === false && $e{0} === '.') ||
                   ($followLink === false && is_link($ePath)))
               continue;
           elseif (is_dir($ePath))
           {
               $tempDC[] = array('name' => $e, 'path' => $ePath,
                                 'directory' => true,
                                 'subcontent' => array());
               array_push($stack, array('path' => $ePath.$slash,
                          'reference'=>
                               &$tempDC[count($tempDC)-1]['subcontent']));
           }
           else
               $tempDC[] = array('name' => $e, 'path' => $ePath,
                                 'directory' => false);
       }
   }
   return $dirContent;
}

 

 

1) Du bruker forferdelig dårlige variabel-navn.

2) Ingen "nybegynner" skjønner en drit av den koden der! (de som kopierer herfra, å bare limer inn)

Endret av medusa1414
Lenke til kommentar
1) Du bruker forferdelig dårlige variabel-navn.

2) Ingen "nybegynner" skjønner en drit av den koden der! (de som kopierer herfra, å bare limer inn)

 

Nå, medusa1414 må du opplyse meg litt her. Tror alle her inne kanskje har godt av at du utdyper kommentarene dine litt.

 

For å sikte på kommentar 1.. Ernie bruker her generelt standardvariabelnavnsetting med korrekt bruk av store og små bokstaver som ligger tettopptil mine primærspråks standard; PHP og Java. Hvordan ville du navngitt dine variabler da?

 

Og noen ord om kommentar nummer 2.. Ville du heller Ernie skulle skrevet dårlig kode, enn å vise dere hvordan ting faktisk skal gjøres? Joda, så har han iofs skrevet noe komplisert kode, men hvis jeg husker tilbake da jeg skulle lære meg PHP, så tok jeg alle kompliserte kodesnutter til stor takk for å hjelpe meg å forstå programmeringslogikken bedre. Å tenke rekrusivt er absolutt ikke så enkelt hele tiden, så det trenger en forståelse av hele løpet.

Lenke til kommentar

Ehh ... og det var da rett mann til å påpeke slikt også

1) Du bruker forferdelig dårlige variabel-navn.
Kan på ingen måter si jeg kjenner meg igjen der. Hvis jeg bruker så utrolig dårlige navn på variablene så kunne du jo henvise til noen av de med tips om hva jeg burde ha kalt de i stedet ;)

 

2) Ingen "nybegynner" skjønner en drit av den koden der! (de som kopierer herfra, å bare limer inn)
Så er det da heller ikke meningen at enhver person skal skjønne det der. Som sagt, har man litt peiling er det relativt trivielt å følge med. At du kommer med en slik kommentar antar jeg har sammenheng med egen kunnskap om PHP og programmeringsprinsippet. Rått og brutalt akter jeg ikke å sitte og kommentere hver bidige linje av scriptene mine bare fordi det kanskje er en totalt nybegynner som skal lese det. Jeg forventer litt nivå på folk som leser koden min, og alle andre har da å lære seg programmering bedre. Endret av Ernie
Lenke til kommentar
1) Du bruker forferdelig dårlige variabel-navn.

2) Ingen "nybegynner" skjønner en drit av den koden der! (de som kopierer herfra, å bare limer inn)

Heisann php_user, bytta brukerkonto nå? Tror ikke akkurat du er rette person til å vurdere og kommentere andres koder, da dine egne suger grenseløst, og du har tidligere vist ingen evne til å ta til deg negativt, men konstruktiv kritikk. Hvorfor skal da Ernie rette seg etter dine kommentarer?

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