Verktyg Visningsval
2012-04-27, 20:41   #1

Subdubwise

Medlem

Subdubwises avatar

Registrerad: apr 2011

PHP, uppladdningsskript


Jag var en gång i tiden riktigt vass på PHP, dock märkte jag i dag, när jag skulle göra ett uppladdningsskript, hur förbannat snabbt kunskaperna försvinner om man inte sysslar med det regelbundet.

Skulle någon kunna snygga upp den här otroligt fula PHP-koden som jag har knåpat ihop nu under kvällen? Det vore guld värt.

Spoiler:
<?php
$upload_dir 
'uploaded_files/';

$chosen_file $_FILES['chosen_file']['name'];

$file_type explode('.'$chosen_file);
$file_type $file_type[count($file_type)-1];
$allowed_file_types = array('png''jpg''jpeg');

$file_size $_FILES['chosen_file']['size'];
$max_size = (1024*25000);

$submit $_POST['upload_submit'];

$new_filename rand(09) . rand(09) . rand(09) . rand(09) . '.' $file_type;




if (isset(
$submit))
{

    if (empty(
$chosen_file))
    {

        
$message 'Du valde <strong>INTE</strong> en fil.';

    }

    else
    {

        if (empty(
$chosen_file))
        {

            
$message 'Filens filtyp kunde <strong>INTE</strong> utläsas.';

        }

        else
        {

            if (!
in_array($file_type$allowed_file_types))
            {

                
$message 'Filtypen ' $file_type ' är <strong>INTE</strong> tillåten.';

            }

            else
            {


                if (
$file_size $max_size)
                {

                    
$message 'Filen är <strong>FÖR STOR</strong>.';

                }

                else
                {

                    
move_uploaded_file($_FILES['chosen_file']['tmp_name'], $upload_dir.$new_filename);

                    
$message 'Filen är uppladdad och finns <a href="uploaded_files/' $new_filename '">här</a>!';

                }

            }

        }

    }
}

if (!empty(
$message))
{

    
$message '<div id="message_area">' $message '</div>' "\n";

}
?>



Funderingar:
  • Vad jag minns, från dagarna då jag faktiskt var någorlunda duktig på att koda, är att jag inte alls skrev en massa else-satser efter varandra på det här viset – utan då hade jag någon array, har jag för mig, som fylldes med värden utifall att filtypen inte accepterades, eller dylikt, och i slutändan visades alla meddelanden, ifall arrayen inte var tom givetvis. Någon som förstår vad jag syftar på, och kan demonstrera ett exempel?
  • Vad skriver man för att slumpa fram en bokstav mellan a-zA-Z?


EDIT:
För att slumpa fram en bokstav mellan A-Z: chr(rand(65,90))
För att slumpa fram en bokstav mellan a-z: chr(rand(97,122))

Senast redigerad av Subdubwise 2012-04-27 klockan 21:03.
Subdubwise är inte uppkopplad Folding
2012-04-27, 21:09   #2

havsmonstret

Medlem

havsmonstrets avatar

Plats: Linköping

Registrerad: apr 2010

Att slumpa fram ett filnamn sådär är väl ingen vidare bra ide. Ta istället fram en hash (Med MD5 eller SHA till exempel) och använd det som filnamnet. Då blir risken för kollisioner riktigt liten.
havsmonstret är inte uppkopplad Folding
2012-04-27, 21:12   #3

Subdubwise

Medlem

Subdubwises avatar

Registrerad: apr 2011

Citat:
Ursprungligen inskrivet av havsmonstret Visa inlägg
Att slumpa fram ett filnamn sådär är väl ingen vidare bra ide. Ta istället fram en hash (Med MD5 eller SHA till exempel) och använd det som filnamnet. Då blir risken för kollisioner riktigt liten.
Jag vet, därav sitter jag just nu och klurar på hur en while()-sats bör se ut. Den ska alltså kolla det framslumpade filnamnet och se om det redan existerar i mappen "uploaded_files", om ingen träff upptäcks kör den vidare, om den osannolikt nog hittar en träff gör den ett nytt filnamn.

Anledningen till while() istället för if() är ifall det, sjukt osannolikt nog, skulle bli krock två gånger om med filnamnen.

Några tips?
Subdubwise är inte uppkopplad Folding
2012-04-27, 21:41   #4

havsmonstret

Medlem

havsmonstrets avatar

Plats: Linköping

Registrerad: apr 2010

$s hash('sha256'$filename);
while(
file_exists($s)) {
    
$s hash('sha256'$filename);

Nått sånt där? Inte testat men borde fungera.
havsmonstret är inte uppkopplad Folding
2012-04-27, 21:45   #5

Subdubwise

Medlem

Subdubwises avatar

Registrerad: apr 2011

Citat:
Ursprungligen inskrivet av havsmonstret Visa inlägg
$s hash('sha256'$filename);
while(
file_exists($s)) {
    
$s hash('sha256'$filename);

Nått sånt där? Inte testat men borde fungera.
Då folk har en tendens att döpa filer till exempelvis "asdf.png", kommer det väl inte att göra saken bättre för att man hashar det? Då är säkrare att döpa filen till den nuvarande tiden + millisekunder, om man ska vara på det viset. Men jag vill bestämt få utforma mina filnamn på detta viset och "rädda det" genom den här while()-satsen som jag nämnde tidigare – så att krockar och överskrivningar inte sker.

Minns dock inte hur den bör se ut.
Subdubwise är inte uppkopplad Folding
2012-04-27, 21:51   #6

havsmonstret

Medlem

havsmonstrets avatar

Plats: Linköping

Registrerad: apr 2010

Oj, självklart ska filen hashas och inte namnet. Jag som tänkte dumt. Den här funktionen kanske fungerar bättre: http://php.net/manual/en/function.hash-file.php
havsmonstret är inte uppkopplad Folding
2012-04-28, 18:29   #7

hamre

Medlem

Plats: Uppsala

Registrerad: apr 2003

$errors = array();
if(empty(
$variabel)){
$errors[] = 'Denna variabel är tom';

sen

if(!empty($errors)){
foreach(
$errors as $error){
print(
$error.'<br />');
}
}
else
{
//Lägg in i databasen

Vet inte om det är snabbare men jag använder denna för att ta reda på filtyp

$image_ext strtolower(pathinfo($image_namePATHINFO_EXTENSION)); 
hamre är inte uppkopplad
2012-04-28, 20:39   #8

Subdubwise

Medlem

Subdubwises avatar

Registrerad: apr 2011

Citat:
Ursprungligen inskrivet av hamre Visa inlägg
$errors = array();
if(empty(
$variabel)){
$errors[] = 'Denna variabel är tom';
}

if(!empty(
$errors)){
foreach(
$errors as $error){
print(
$error.'<br />');

Tack, det där var till stor hjälp!

Det verkar dock som att $errors = array(); inte behöver anges, utan det fungerar väl även utan den raden.

Skulle du kunna förklara, kortfattat, vad skillnaden är mellan print() och echo() – samt varför det behövs en foreach() för att kunna skriva ut innehållet i arrayen på det här viset. Jag förstår mig inte alls på den logiken.

Jag märkte att med print() skriver den ut varje "array-post" efter varandra, medan med echo() skriver den ut hela arrayens innehåll på en och samma gång – vilket då inte gav möjlighet till att skriva ut exempelvis <br /> efter varje array-post. Vad skillnaden i helhet är förstår jag dock inte.
Subdubwise är inte uppkopplad Folding
2012-04-28, 21:28   #9

hamre

Medlem

Plats: Uppsala

Registrerad: apr 2003

Skillnaden mellan print och echo är nästan ingenting. Det är vissa som säger att echo är nån millisekund snabbare än print. Det är alltså upp till en själv vad man tycker är snyggast. Jag började min programmering med print och har hållit mig till det ändå sen dess.

Som du kanske märkt om du inte har foreach satsen och bara skriver ut $errors så är det enda du får utskrivet "Array".
Det foreach gör är att för varje element i arrayen $errors så sätts dess value till variabeln $error i ren text så du kan skriva ut detta på sidan och inte bara skriva ut "Array".
hamre är inte uppkopplad
2012-04-28, 21:34   #10

Subdubwise

Medlem

Subdubwises avatar

Registrerad: apr 2011

Citat:
Ursprungligen inskrivet av hamre Visa inlägg
Skillnaden mellan print och echo är nästan ingenting. Det är vissa som säger att echo är nån millisekund snabbare än print. Det är alltså upp till en själv vad man tycker är snyggast. Jag började min programmering med print och har hållit mig till det ändå sen dess.

Som du kanske märkt om du inte har foreach satsen och bara skriver ut $errors så är det enda du får utskrivet "Array".
Det foreach gör är att för varje element i arrayen $errors så sätts dess value till variabeln $error i ren text så du kan skriva ut detta på sidan och inte bara skriva ut "Array".
Tack så mycket för förklaringarna!

Är detta användningsområdet foreach()'s egentliga syfte? Det verkar nämligen vara så, efter att ha tagit en snabb titt på php-dokumentationen om det. Jag förstår mig nämligen inte inte riktigt på logiken med namnet "for each".
Subdubwise är inte uppkopplad Folding
2012-04-28, 21:49   #11

Subdubwise

Medlem

Subdubwises avatar

Registrerad: apr 2011

Citat:
Ursprungligen inskrivet av hamre Visa inlägg
Skillnaden mellan print och echo är nästan ingenting.
Fördelen med print, i detta fallet, är att jag, efter varje array-post, kan lägga till <br /> och "\n" om jag behagar. MEN resultatet från print() kan inte sparas i en variabel, utan det skrivs ut på direkten.

Hur ska jag då göra för att lägga till radbrytningar och dylikt efter varje array-port, när jag sätter ihop alla array-poster i en och samma variabel?
Subdubwise är inte uppkopplad Folding
2012-04-28, 21:53   #12

Neonxz

Medlem

Neonxzs avatar

Plats: Stockholm

Registrerad: aug 2008

Citat:
Ursprungligen inskrivet av Subdubwise Visa inlägg
Tack så mycket för förklaringarna!

Är detta användningsområdet foreach()'s egentliga syfte? Det verkar nämligen vara så, efter att ha tagit en snabb titt på php-dokumentationen om det. Jag förstår mig nämligen inte inte riktigt på logiken med namnet "for each".
For each, för varje. För varje index i arrayen tilldela nyckel (key) tilldela värde (value) till $variabel (i det här fallet $error) och gör sedan följande{ instruktioner här}

Den kan lika gärna skrivas som en for-sats som skulle se ut:

for ($i=0$i<sizeof($array); $i++) {
    
$error=$array[i];
   print(
$error.'<br />');

men mindre kod att skriva så här:

for ($i=0$i<sizeof($array); $i++) {
   print(
$array[i].'<br />');

Och självklart ännu mindre med for-each.


Citat:
Ursprungligen inskrivet av Subdubwise Visa inlägg
Fördelen med print, i detta fallet, är att jag, efter varje array-post, kan lägga till <br /> och "\n" om jag behagar. MEN resultatet från print() kan inte sparas i en variabel, utan det skrivs ut på direkten.

Hur ska jag då göra för att lägga till radbrytningar och dylikt efter varje array-port, när jag sätter ihop alla array-poster i en och samma variabel?
Jag skulle gjort så här:

if(!empty($errors)){ 
foreach(
$errors as $error){ 
$errorOutput+=$error.'<br />'


echo 
$errorOutput;

Koden inte testat, säkert missat nått självklart

Senast redigerad av Neonxz 2012-04-28 klockan 21:59.
__________________
Neon
Citera mig om du vill ha svar!
Neonxz är inte uppkopplad
2012-04-28, 21:57   #13

hamre

Medlem

Plats: Uppsala

Registrerad: apr 2003

Citat:
Ursprungligen inskrivet av Subdubwise Visa inlägg
Fördelen med print, i detta fallet, är att jag, efter varje array-post, kan lägga till <br /> och "\n" om jag behagar. MEN resultatet från print() kan inte sparas i en variabel, utan det skrivs ut på direkten.

Hur ska jag då göra för att lägga till radbrytningar och dylikt efter varje array-port, när jag sätter ihop alla array-poster i en och samma variabel?
Hur menar du? Du kan ju lägga till <br /> efter en echo också. Bara att konkatenera så fungerar det.

Hur menar du att spara resultatet från print i en variabel?

foreach är ju som namnet säger. För varje (någonting SOM någonting){ GÖR DETTA }
hamre är inte uppkopplad
2012-04-28, 22:45   #14

Subdubwise

Medlem

Subdubwises avatar

Registrerad: apr 2011

Citat:
Ursprungligen inskrivet av hamre Visa inlägg
Hur menar du? Du kan ju lägga till <br /> efter en echo också. Bara att konkatenera så fungerar det.
Med print() lades <br /> till efter varje array-post. Med echo() slängdes alla array-poster ihop och skrevs ut på en och samma gång, så det gick inte att trycka in <br /> mellan posterna. print() hade därav en fördel, nackdelen var dock att det inte gick att göra typ $hey = print($array . '<br />');, för print skrevs ut på direkten och gick inte att spara i en variabel.

Citat:
Ursprungligen inskrivet av hamre Visa inlägg
Hur menar du att spara resultatet från print i en variabel?
$yo = print($helloworld);

Fördelen med print() var, som sagt, att man kunde trycka in <br /> efter varje array-post, nackdelen var dock att det inte gick att spara resultatet i en variabel då resultatet skrevs ut på direkten. Så hur jag ska göra vet jag inte.
Subdubwise är inte uppkopplad Folding
2012-04-29, 00:12   #15

hamre

Medlem

Plats: Uppsala

Registrerad: apr 2003

Citat:
Ursprungligen inskrivet av Subdubwise Visa inlägg
Med print() lades <br /> till efter varje array-post. Med echo() slängdes alla array-poster ihop och skrevs ut på en och samma gång, så det gick inte att trycka in <br /> mellan posterna. print() hade därav en fördel, nackdelen var dock att det inte gick att göra typ $hey = print($array . '<br />');, för print skrevs ut på direkten och gick inte att spara i en variabel.



$yo = print($helloworld);

Fördelen med print() var, som sagt, att man kunde trycka in <br /> efter varje array-post, nackdelen var dock att det inte gick att spara resultatet i en variabel då resultatet skrevs ut på direkten. Så hur jag ska göra vet jag inte.
Nu är jag nog lite lost här. men varför skulle du vilja göra så?

print och echo används ju bara för utskrift på sidan, inte spara saker i en variabel.

Vad är det du vill spara?
hamre är inte uppkopplad
2012-04-29, 00:45   #16

infinity08

Medlem

Plats: stockholm

Registrerad: aug 2008

Citat:
Ursprungligen inskrivet av Neonxz Visa inlägg
Jag skulle gjort så här:

if(!empty($errors)){ 
foreach(
$errors as $error){ 
$errorOutput+=$error.'<br />'


echo 
$errorOutput;

Koden inte testat, säkert missat nått självklart
Varför inte skippa foreach helt och bara köra print_r()?
Själv har jag gjort en egen funktion för detta dock:
// Print array nicely
function preint_r($array) {
    echo 
'<pre>';
    
print_r($array);
    echo 
'</pre>';

Använder det mest för debug, men är jäkligt smidigt när man bara vill se strukturen i en array.

Citat:
Ursprungligen inskrivet av Subdubwise Visa inlägg
$yo = print($helloworld);

Fördelen med print() var, som sagt, att man kunde trycka in <br /> efter varje array-post, nackdelen var dock att det inte gick att spara resultatet i en variabel då resultatet skrevs ut på direkten. Så hur jag ska göra vet jag inte.
Nejnej, man använder inte print eller echo när man tilldelar värde till en variabel. Vad är det du försöker göra? Vill du ha ett <br> efter varje värde i arrayen och skriva ut det?
Isåfall:
echo implode("<br />",$helloworld); 
infinity08 är inte uppkopplad
Senaste nyheterna

Redaktionens senaste nyhetsrubriker

Sök jobb