[PHP] Variabele buiten functie

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Sp33dFr34k
  • Registratie: Juni 2006
  • Niet online
OK, wellicht een stomme vraag, maar ik ben nog een noob wat betreft php dus hier gaat ie:

Ik heb een functie uploadPlaatje. Als bestand1 bestaat voert ie de functie uit met als parameter bestand1, voor 2 hetzelfde etc. Dat werkt allemaal, ze worden in de map gezet met een nieuwe bestandsnaam, dat is in dit geval auto met daarachter het eerste getal wat nog niet bestaat in die map. Deze bestandsnaam heet $file_name.

Nu wil ik dat de $file_name voor elk plaatje opgeslagen wordt, maar logischerwijs krijg ik alleen het laatste bestand geprint. Nu is mijn vraag; hoe kan ik ervoor zorgen dat ik alle bestandsnamen netjes op een rijtje krijg om ze vervolgens in de database te zetten?

i7 9700k + Be-Quiet Dark Rock 4 Pro | Gigabyte Z390 Aorus Ultra | Gigabyte RTX5070Ti | Samsung 970 Pro 512GB + 860 EVO 1TB + 860 QVO 4TB | 2x8GB DDR4 3000Mhz | Seasonic Platinum 660W | Fractal Design R6 | Samsung Oddyssey G7 Neo | Edifier M60


Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Heb je problemen met de scope van functies? Ken je het begrip array nog niet? Zonder code valt er weinig te helpen :)

Acties:
  • 0 Henk 'm!

  • Tommasso
  • Registratie: Oktober 2007
  • Laatst online: 05-07 23:15
De bestandnamen in een array plaatsen lijkt mij het makkelijkste. daarna moet je ze invoeren in de tabel (je database)

Acties:
  • 0 Henk 'm!

  • Alexji
  • Registratie: Juli 2003
  • Laatst online: 16-09 17:11
zoiets dus:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
$fileNames = array();

// na elke upload

$fileNames[] = $fileName;

//daarna uitlezen


foreach ($fileNames as $fileName){
//insert into DB
    echo $fileName;
}

Acties:
  • 0 Henk 'm!

  • Sp33dFr34k
  • Registratie: Juni 2006
  • Niet online
Danku very much, ik ga het nu proberen.

[ Voor 44% gewijzigd door Sp33dFr34k op 08-11-2009 23:21 ]

i7 9700k + Be-Quiet Dark Rock 4 Pro | Gigabyte Z390 Aorus Ultra | Gigabyte RTX5070Ti | Samsung 970 Pro 512GB + 860 EVO 1TB + 860 QVO 4TB | 2x8GB DDR4 3000Mhz | Seasonic Platinum 660W | Fractal Design R6 | Samsung Oddyssey G7 Neo | Edifier M60


Acties:
  • 0 Henk 'm!

  • Sp33dFr34k
  • Registratie: Juni 2006
  • Niet online
Dacht ik al, net als met een variabele gooit ie de array leeg aan het begin van de functie. Ik zal wel erg dom aan het denken zijn, maargoed ik kom er gewoon ff niet uit...

Hieronder de code zoals ik 'm nu heb.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<?
function uploadBestand($bestand) {
$fileNames = array();
//De groote van het bestand vergelijken met het maximum
if ($_FILES[$bestand]['type'] > 302400){
    exit("Je bestand " . $_FILES[$bestand]['size'] . " bytes, het maximum toegelaten is 302400 bytes");
} 

if($_FILES[$bestand]['type'] == "image/jpeg" || $_FILES[$bestand]['type'] == "image/pjpeg") {

    $x = strtolower(substr($_FILES[$bestand]['name'], -3));
    // De naam van de file veranderen in bv. image0
    $file_name = "auto";    
    $n = 0;
    // Check of file al bestaat, zo ja, filename verhogen 
    while (file_exists('autos/' . $file_name . $n . '.' . $x)) 
    { 
        $n = $n + 1; 
    } 
    $file_name = $file_name . $n; 

    move_uploaded_file($_FILES[$bestand]['tmp_name'],'autos/' . $file_name . '.' . $x);
    chmod ('autos/' . $file_name . '.' . $x, 0777);
    //kiezen
    $b = imagecreatefromjpeg('autos/' . $file_name . '.' . $x) or die ("Jpg probleempje");
    $bx = imagesx($b); // Bron breedte 
    $by = imagesy($b); // bron hoogte
    $lm = $b;
    $width=600;
    $temp=$bx/600;
    $height=$by/$temp;
    if ($bx > $width) {
        $lm1 = imagecreatetruecolor($width ,$height) or die ("Probleem met maken van plaatje jpg");
        imagecopyresampled($lm1, $lm, 0, 0, 0, 0, $width, $height, $bx, $by);
        Imagejpeg($lm1,'autos/' . $file_name . '.' . $x,80); //80 is jpg kwaliteit
        imageDestroy($lm1);
        imageDestroy($lm);
    }
    echo "Succesvol opgeslagen<br />";
    $file_name = $file_name . ".jpg";
    $fileNames[] = $file_name;
    } else {
    echo "";
}
print_r($fileNames);
}

if (isset($_FILES['bestand1'])) {
    uploadBestand(bestand1);
}
if (isset($_FILES['bestand2'])) {
    uploadBestand(bestand2);
}
if (isset($_FILES['bestand3'])) {
    uploadBestand(bestand3);
}
if (isset($_FILES['bestand4'])) {
    uploadBestand(bestand4);
}
?>
<form action="" enctype="multipart/form-data" method="post">
<input type="file" name="bestand1"><br>
<input type="file" name="bestand2"><br>
<input type="file" name="bestand3"><br>
<input type="file" name="bestand4">
<input type="submit" name="submit" value="Upload">
</form>

i7 9700k + Be-Quiet Dark Rock 4 Pro | Gigabyte Z390 Aorus Ultra | Gigabyte RTX5070Ti | Samsung 970 Pro 512GB + 860 EVO 1TB + 860 QVO 4TB | 2x8GB DDR4 3000Mhz | Seasonic Platinum 660W | Fractal Design R6 | Samsung Oddyssey G7 Neo | Edifier M60


Acties:
  • 0 Henk 'm!

  • Alexji
  • Registratie: Juli 2003
  • Laatst online: 16-09 17:11
Dit komt omdat je de array binnen de functie definieert. Dus dan wordt elke keer als je de functie aanroept de array opnieuw aangemaakt. Zoek maar eens op variable scopes.

ook lijkt me niet dat je met
PHP:
1
if ($_FILES[$bestand]['type'] > 302400){
de grootte van de file krijgt.

Acties:
  • 0 Henk 'm!

  • Sp33dFr34k
  • Registratie: Juni 2006
  • Niet online
Kwam ik net ook achter, maar als ik de array buiten de functie declareer is de output hetzelfde.. :(

De rest van het script is overigens gejat, probeer hem alleen zo te maken dat ik meerdere files kan uploaden ipv 1 tegelijk en dat ik de namen meteen in een regel van mijn database kan zetten...

i7 9700k + Be-Quiet Dark Rock 4 Pro | Gigabyte Z390 Aorus Ultra | Gigabyte RTX5070Ti | Samsung 970 Pro 512GB + 860 EVO 1TB + 860 QVO 4TB | 2x8GB DDR4 3000Mhz | Seasonic Platinum 660W | Fractal Design R6 | Samsung Oddyssey G7 Neo | Edifier M60


Acties:
  • 0 Henk 'm!

  • Alexji
  • Registratie: Juli 2003
  • Laatst online: 16-09 17:11
Wat is de output nu dan als je 3 bestanden upload?

Acties:
  • 0 Henk 'm!

  • Sp33dFr34k
  • Registratie: Juni 2006
  • Niet online
Succesvol opgeslagen
Array ( [0] => auto0.jpg )
Succesvol opgeslagen
Array ( [0] => auto1.jpg )
Succesvol opgeslagen
Array ( [0] => auto2.jpg )

i7 9700k + Be-Quiet Dark Rock 4 Pro | Gigabyte Z390 Aorus Ultra | Gigabyte RTX5070Ti | Samsung 970 Pro 512GB + 860 EVO 1TB + 860 QVO 4TB | 2x8GB DDR4 3000Mhz | Seasonic Platinum 660W | Fractal Design R6 | Samsung Oddyssey G7 Neo | Edifier M60


Acties:
  • 0 Henk 'm!

  • sky-
  • Registratie: November 2005
  • Niet online

sky-

qn ella 👌

Buiten de functie kan je met :

PHP:
1
2
3
4
5
6
7
8
<?php
global $fileNames = array();
function uploadBestand($bestand) {
#$fileNames = array();
//De groote van het bestand vergelijken met het maximum
if ($_FILES[$bestand]['type'] > 302400){
    exit("Je bestand " . $_FILES[$bestand]['size'] . " bytes, het maximum toegelaten is 302400 bytes");
}?>


De array defineren.

[ Voor 3% gewijzigd door sky- op 08-11-2009 23:47 . Reden: Zin vergeten. ]

don't be afraid of machines, be afraid of the people who build and train them.


Acties:
  • 0 Henk 'm!

  • Sp33dFr34k
  • Registratie: Juni 2006
  • Niet online
Dat had ik idd al geprobeerd, maar global arrays vindt ie blijkbaar niet zo leuk...

Parse error: parse error, unexpected '=', expecting ',' or ';' on line 2

i7 9700k + Be-Quiet Dark Rock 4 Pro | Gigabyte Z390 Aorus Ultra | Gigabyte RTX5070Ti | Samsung 970 Pro 512GB + 860 EVO 1TB + 860 QVO 4TB | 2x8GB DDR4 3000Mhz | Seasonic Platinum 660W | Fractal Design R6 | Samsung Oddyssey G7 Neo | Edifier M60


Acties:
  • 0 Henk 'm!

  • Alexji
  • Registratie: Juli 2003
  • Laatst online: 16-09 17:11
Volgens de PHP manual moet het ook zijn

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php

$fileNames = array();

function uploadBestand($bestand) {

global $fileNames;

//De groote van het bestand vergelijken met het maximum
if ($_FILES[$bestand]['type'] > 302400){
    exit("Je bestand " . $_FILES[$bestand]['size'] . " bytes, het maximum toegelaten is 302400 bytes");
}


//etc
$file_name = $file_name . ".jpg"; 
$fileNames[] = $file_name; 
?>

[ Voor 11% gewijzigd door Alexji op 08-11-2009 23:55 ]


Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 16-09 13:49

Patriot

Fulltime #whatpulsert

Dat komt omdat je de variabele buiten de functie moet declareren, en binnen de functie met het global-keyword aan moet geven dat hij die variabele uit de globale scope moet halen. Regel twee mag dus naar een positie binnen de functie (net na regel 3 bijvoorbeeld).

edit:
grom @ hierboven :P

[ Voor 5% gewijzigd door Patriot op 08-11-2009 23:55 ]


Acties:
  • 0 Henk 'm!

  • Sp33dFr34k
  • Registratie: Juni 2006
  • Niet online
Fixed!

Buiten functie:

PHP:
1
$fileNames = array();


Dan in de functie:

PHP:
1
2
global $fileNames;
$fileNames[] = $file_name;


Krijg nu als output bij 2 plaatjes:

Array ( [0] => auto0.jpg [1] => auto1.jpg )

Woehoe, kijken of de rest ook gaat lukken :)

Dank voor jullie hulp allen! _/-\o_

EDIT: Haha, allemaal tegelijk ineens met de oplossing, nogmaals dank! :)

[ Voor 10% gewijzigd door Sp33dFr34k op 08-11-2009 23:57 ]

i7 9700k + Be-Quiet Dark Rock 4 Pro | Gigabyte Z390 Aorus Ultra | Gigabyte RTX5070Ti | Samsung 970 Pro 512GB + 860 EVO 1TB + 860 QVO 4TB | 2x8GB DDR4 3000Mhz | Seasonic Platinum 660W | Fractal Design R6 | Samsung Oddyssey G7 Neo | Edifier M60


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Misschien wat mosterd na de maaltijd, maar het woord "scope" werd al in de eerste reactie genoemd. Je hebt dat vervolgens nog 2-3 reacties lang genegeerd. Kun je de volgende keer asjeblieft wat inzet tonen door zelf ook te gaan zoeken op de termen die je op een presenteerblaadje krijgt?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Sp33dFr34k
  • Registratie: Juni 2006
  • Niet online
Klopt NMe, je hebt helemaal gelijk, mijn excuses. Heb scope gegoogled en zag toen even niet waarom dat relevant was, maar uiteindelijk was de 1e post al meteen de oplossing achteraf gezien. Ik zal er de volgende keer beter op letten.

i7 9700k + Be-Quiet Dark Rock 4 Pro | Gigabyte Z390 Aorus Ultra | Gigabyte RTX5070Ti | Samsung 970 Pro 512GB + 860 EVO 1TB + 860 QVO 4TB | 2x8GB DDR4 3000Mhz | Seasonic Platinum 660W | Fractal Design R6 | Samsung Oddyssey G7 Neo | Edifier M60


Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
En daarnaast, al geef ik de hint scope, het gebruik van global zou ik toch vermijden. Je kan het ook (en imho beter) oplossen met dergelijke constructies:
PHP:
1
2
3
4
$list = array();
foreach ($files as $file) {
  $list[] = uploadBestand($file);
}

Of, als je de functie de stack wil laten controleren:
PHP:
1
2
3
4
$list = array();
foreach ($files as $file) {
  uploadBestandEnVoegToe($file, $list);
}

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Idd, het gebruik van global zou ik ook zo veel mogelijk vermijden. Misschien wil je de functie later ook nog eens in een andere context gebruiken, en dan heeft de functie nog andere effecten dan dat je wil. Door gewoon expliciet de return value in een array te stoppen, ben je later veel flexibeler. Misschien wil je immers op een andere pagina wel 2 array's bij gaan houden voor verschillende bestands type's.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 15:29

MBV

Verder wil ik nog de suggestie geven om je indenting op orde te brengen. Als je een nieuwe scope begint, moet je ook de indenting vergroten:
PHP:
1
2
3
4
5
6
7
8
9
10
function x() {
  $var = 5;
  if (iets()) {
    $var = 8;
  }
  return $var;
}

$var2 = x();
echo $var2;


Dat maakt het voor jouw, en voor ons, een stuk makkelijker om je code te lezen. Ik had in eerste instantie niet eens gezien dat je een functie declareerde bovenaan, omdat je daarna verder ging zonder indenting.
Pagina: 1