Gå til innhold

Garanti's hjelpetråd til PHP


Anbefalte innlegg

Har en kodesnutt jeg har laget som jeg er sikker på kunne gått an å effektivisere ved å bruke en for eller foreach-loop, men jeg er ikke sikker på hvordan jeg skal gjøre dette:

 

<?PHP
if(isset($_FILES)){
error_reporting(E_ALL);
########
function countfilesinfolder($path){	// From http://www.jonasjohn.de/snippets/php/count-files-recursive.htm  <3
	$files = 0;
	$dir = opendir($path);
	if (!$dir){return 0;}
	while (($file = readdir($dir)) !== false) {
		if ($file[0] == '.'){ continue; }
		if (is_dir($path.$file)){
			$files += count_files_recursive($path.$file.DIRECTORY_SEPARATOR);
		}
		else {
			$files++;
		}
	}
	closedir($dir);
	return $files;
}
########

$dir = "files/";
$File = $_FILES['File'];

foreach($File['name'] as $key => $value) {			// Unsetter tomme arrayelementer mellom elementer med data
	if (is_null($value) || $value=="") {
	   	unset($File['name'][$key]);
		  }
}
sort($File['name']);								// Flytter f.eks  [0]=1,[1]=NULL,[2]=2 til [0]=1,[1]=2
$numFiles = 0;
array_walk_recursive($File['name'], create_function('&$v', 'global $numFiles;if(!empty($v)) $numFiles++;')); // Teller filer i arrayet
echo '>>'.$numFiles.'<<';							// Viser antall opplastede filer
for($c=0; $c <= $numFiles-1; $c++){					
	$ext = explode('.', $File['name'][$c]);			// Finner filendelse
	$ext = array_pop($ext);							// Finner filendelse
	$name = countfilesinfolder($dir);
	$name = $name++;
	$name = $dir . $name . '.' . strtolower($ext);
	echo "$name\n";
	if(move_uploaded_file($_FILES['File']['tmp_name'][$c], $name)){}
	else{$error[] = "Problem uploading file $c";}

}
}
if(isset($error)){print_r($error);}
?>
<form action="<?PHP echo $_SERVER['PHP_SELF']; ?>" enctype="multipart/form-data" method="post">
<input type="file" name="File[]"  /><br />
<input type="file" name="File[]"  /><br />
<input type="file" name="File[]"  /><br />
<input type="file" name="File[]"  /><br />
<input type="submit" />
</form>

Si ifra dersom du ønsker ytterligere kommentering!

Lenke til kommentar
Videoannonse
Annonse

Jeg har følgende case:

 

Alle vokaler i stringen $text skal gjøres til store bokstaver:

<?PHP
header('Content-type: text/html; charset=utf-8');
$text = 'I løpet av ungdomsskolen gjennomføres 8 forskjellige etapper fra Treriksrøysa i sør til Grense Jakobselv i nord.';

preg_replace_callback('/[aeiou]/i', 
				create_function('$matches',
					'return strtoupper($matches[0]);'
				),
				$text);

echo $text;

?>

Men resultatet blir bare: I løpet av ungdomsskolen gjennomføres 8 forskjellige etapper fra Treriksrøysa i sør til Grense Jakobselv i nord.

 

Kan noen hjelpe meg?

Endret av Garanti
Lenke til kommentar
Jeg har følgende case:

 

Alle vokaler i stringen $text skal gjøres til store bokstaver:

 

....

 

Dette skjer fordi preg_replace_callback returnerer den nye strengen, den modifiserer ikkje den variabelen du gir. Dermed vil $text = preg_replace_callback(...) vil fungere

Endret av Runar0
Lenke til kommentar
  • 2 uker senere...

Heisann igjen! Begynner å gå lenger og lenger tid mellom hver gang jeg spør om noe, det er jo forsåvidt et godt tegn så lenge jeg faktisk gjør noe :p

 

Uansett, jeg lurte på hvordan man kan lage et tag-basert system vha. PHP/mySQL. Med 'tag' mener jeg da tag-er slik de blir benyttet i nyhetssider osv. Hvordan setter man f.eks opp en database med tag-er basert på artikler? Det finnes vel bedre måter enn dette:

___________________
|		|Bil|Båt|Tog|Fly|
|Art1  |  0|   0|   1|   0|
|Art2  |  1|   0|   0|   1|
|Art3  |  1|   1|   0|   0|
|Art4  |  0|   0|   1|   0|
|Art5  |  1|   1|   0|   1|

 

?

Lenke til kommentar

Hehe, absolutt. Jeg ville gjort det på denne måten:

 

Tabell: articles

art_id (primary key, autoinc)

title

text

timestamp

 

Tabell: tags

tag_id (primary key, autoinc)

tag_text

 

Tabell: articles_tags

id (primary key, autoinc)

tag_id

art_id

 

Ved å strukturere dataene slik kan du legge inn et ubegrenset antall tags i tags-tabellen, og du kan tagge en hvilken som helst artikkel med så mange tags du orker. Du kan også kjøre forskjellige former for spørringer for å hente ut relevante artikler i forholdt til gitte tags, etc.

Lenke til kommentar

Ikke dumt.

En ting til jeg lurer på. På f.eks youtube finnes det en script kalt 'watch', som kan se f.eks slik ut:

youtube.com/watch?v=ey78dkjv9v

 

Dette er nok ikke PHP-spesifikt, men hvordan får de scriptet til å kjøre uten utvidelsen .php ell. lign? Når jeg prøver å kjøre filer blir de ikke kompilert. Det finnnes kanskje innstillinger for dette i Apache?

Lenke til kommentar

Ok.

Jeg har følgende kode:

Klikk for å se/fjerne innholdet nedenfor

<pre>
<?PHP
if(isset($_FILES['File'])){
$imgsize = getimagesize($_FILES['File']['tmp_name']);
print_r($_FILES['File']);
echo '<br>	 X: '.$imgsize[0].' Y: '.$imgsize[1];
$newis[0] = $imgsize[0]*0.2;
$newis[1] = $imgsize[1]*0.2;

echo '<br>NEW! X: '.$newis[0].' Y: '.$newis[1];

$image = imagecreatetruecolor(round($newis[0]), round($newis[1]));

imagecopyresampled($image,
				   $_FILES['File']['name'],
				   0, 0, 0, 0,
				   $newis[0],
				   $newis[1],
				   $iSizeRaw['0'],
				   $iSizeRaw['1']);


imagepng($image, 'HAHAHAHAH.png', 0, IMG_FILTER_NEGATE);

echo '<img src="'.$image.'" alt="HOHOOI!">';
}

?></pre>
<form action="<?PHP echo $_SERVER['PHP_SELF']; ?>" enctype="multipart/form-data" method="post">
<input type="file" name="File"  /><br />
<input type="submit" />
</form>

Får følgende feil: Warning: imagecopyresampled(): supplied argument is not a valid Image resource in *****.php on line 20

 

Dette regner jeg med er på grunn av linken til kildebildet i imagecopyresampled(). Hvilken "ressurs" skal jeg bruke? Det virker verken med $_FILES['File']['name'] eller $_FILES['File']['tmp_name'].

Lenke til kommentar

Hei igjen! Har fått til et dugelig resize-script, men har støtt på et problem. Enkelte bildefiler er så store at de overgår hva PHP-installasjonen tillater. Hva skal jeg gjøre med dette? Da dette scriptet vil være en del av et større script for en klient, som skal hostes på en webserver, vil denne maks-grensen normalt være pa sammen nivå hos vanlige hoster?

Lenke til kommentar

Problemet med behandling av store bilder er at det ofte krever store mengder minne. En minnegrense på 8MB eller 16MB blir ofte knapt for å resize veldig store bilder. Det du bør gjøre hvis du bruker en shared host er å begrense dimensjonene på bilder man laster opp. Hvis du hoster selv og har kapasiteten til det, kan du øke minnegrensen i scriptet ditt med ini_set() eller via .htaccess.

Lenke til kommentar

Jeg vet ikke om jeg skjønner helt hva du mener. Hvis du vil forhindre at folk skal kunne laste filen fra nettleseren sin (i.e. det vil kun være serveren som kan kjøre den internt) kan du enten legge den utenfor webroot, ellers kan du gjøre noe a la dette i .htaccess:

<Files *>
 Order deny,allow
 Deny from all
Allow from localhost
 </Files>

 

En annen løsning jeg kom på i farta (som er litt mer usexy):

index.php:

<?php $allow_include = true; include('include.php'); ?>

 

include.php:

<?php if(!$allow_include) die(); /* ... */ ?>

Endret av Lokaltog
Lenke til kommentar
Hva skal jeg gjøre for å forhindre at et script med et sett funksjoner blir kjørt uten at det ble inkludert av en annen, spesifikk fil?

 

functions.php

<?php

if (!defined('INDEX')) { die('No access'); }

function hasSiblings()
{
return true;
}

 

index.php:

 

<?php

define ('INDEX', true);

include('functions.php');

var_dump(hasSiblings());

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å
×
×
  • Opprett ny...