Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Muuttujan sijoittaminen

Sivun loppuun

katket [16.10.2008 21:39:07]

#

Mikähän mulla menee vikaan tässä php-pätkässä?
Eli uploadaan kuvia palvelimelle.

$folder = $_POST["folder"];

define("UPLOAD_DIRECTORY", "../gallery/$folder/");

Jos kirjoitan polkuun kansion nimen, tämä toimii, mutta kun yritän saada kansion nimen muuttujasta, ei toimi. Jotainhan minä varmaan kirjoitan väärin.

TsaTsaTsaa [16.10.2008 21:46:13]

#

Niin siis mikä oli ongelma?

Merri [16.10.2008 21:55:36]

#

Oletko tarkistanut muuttujan sisällön?

Sikstoisekseen, varmista ihmeessä ettei muuttujassa ole mitään sinne kuulumatonta, tai aika pian saat huomata että sivustosi on krakkeroitu. Vähintäänkin poista merkit /.\ $_POSTin tarjoamasta tiedosta.

katket [16.10.2008 22:08:41]

#

Joo kyllä se ihan oikein tuo tuon arvon eli echo $folder; tuo nätisti kansion nimen johon halutaan uploadata.

Merri [16.10.2008 22:19:44]

#

echo UPLOAD_DIRECTORY;

En ole defineen heitellyt muuttujia kait kertaakaan, joten en muista/tiedä voiko noin tehdä (ohjelmistoissa on kait yleensä kirjoitettu tunnustietoja suoraan defineen). Tosin minusta parempi tapa olisi yleensä käyttää vaan hipsuja merkkijonojen luomiseen, define('UPLOAD_DIRECTORY', '../gallery/' . $folder . '/'); — joo, siitä tulee vähän pidempi, mutta toisaalta näkee selvemmin että muuttuja liitetään erikseen.

katket [16.10.2008 22:43:15]

#

Kokeilin tuota, mutta ei silti tee oikein. echo UPLOAD_DIRECTORY; kirjoittaa polun oikein, kansion nimikin muuttujasta tulee oikein. Unohdin kertoa että tiedosto menee aina tuohon gallery kansioon eli upload toimii muttei oikeaan kansioon. Mikä ihme mulla menee väärin.

Merri [16.10.2008 22:45:12]

#

No siinä tapauksessa olet esitellyt väärää koodinpätkää :)

katket [16.10.2008 22:54:06]

#

No sitten on vielä sen jälkeen tämä

move_uploaded_file($_FILES['file'.$i]['tmp_name'], UPLOAD_DIRECTORY.$_FILES['file'.$i]['name']);

ville-v [17.10.2008 14:21:33]

#

Mitäs kertoo

echo $_FILES['file'.$i]['tmp_name'];
echo UPLOAD_DIRECTORY.$_FILES['file'.$i]['name'];

tai vastaava koodipätkä? Tiedostonimethän nuo ovat?

katket [17.10.2008 22:11:11]

#

echo $_FILES['file'.$i]['tmp_name'];

Tämä pätkä ei kerro yhtään mitään.

echo UPLOAD_DIRECTORY.$_FILES['file'.$i]['name'];

Tämä pätkä antaa vain polun eli palautus on ../gallery/test/. Jättää siis tiedostonimen kirjoittamatta. Tästä ilmeisesti voi päätellä jotain. Formin input on muotoa

for($i=1;$i<=5;$i++) {
        echo "  <input type=\"file\" name=\"file".$i."\" size=\"75\" ><br>";
}

katket [17.10.2008 23:17:41]

#

Nyt testasin vielä sen että jos kirjoitan

$folder = "test";
define('UPLOAD_DIRECTORY', '../gallery/'.$folder.'/');

homma toimii mutta ei silloin jos laitan

$folder = $_POST["folder"];

Testasin tietenkin että echo $folder; antaa oikean nimen eli test. Eli kyse ei olekaan muuttujan sijoittamisesta vaan se ei hyväksy sitä $_postista

LaNu [18.10.2008 00:43:45]

#

katket kirjoitti:

Eli kyse ei olekaan muuttujan sijoittamisesta vaan se ei hyväksy sitä $_postista

$folder = $_POST["folder"];

Jos tuo ei toimi, niin ensimmäisenä epäilisin, ettei $_POST-arrayssa ole folder-avainta.

<?php
if ( !array_key_exists( 'folder', $_POST ) )
  echo 'folder-avainta ei löydy!';

// toinen nopea tapa katsoa mitä sieltä parametreista ylimäätään löytyy:
echo "<pre>GET:\n";
print_r( $_GET );
echo "\nPOST:\n";
print_r( $_POST );
echo '</pre>';
?>

tsuriga [18.10.2008 01:51:28]

#

Piti ihan tarkistaa, että mikä ero on array_key_exists vs. isset. Ja vastaus: isset palauttaa falsen jos taulukon indeksin arvo on null. Eipä sillä, kyllähän se (isset) tässä kävisi ja onkin yleisemmin käytetty.

ville-v [18.10.2008 11:42:31]

#

Entäs jos käyttäisit definen sijaan normaalia muuttujaa?

Metabolix [18.10.2008 13:51:39]

#

Ensinnä tulisi kyllä mieleen, että olet tuon _FILES-taulukon kanssa jotain mokaillut, jos ei kerran tiedostonimeäkään saa tulostettua. Laita nyt vaikka ihan sivun alkuun var_dump($_FILES) ja var_dump($_POST), niin selviää, mitä palvelimelle edes oikeasti tulee.

LaNu [18.10.2008 15:46:22]

#

tsuriga kirjoitti:

Piti ihan tarkistaa, että mikä ero on array_key_exists vs. isset. Ja vastaus: isset palauttaa falsen jos taulukon indeksin arvo on null. Eipä sillä, kyllähän se (isset) tässä kävisi ja onkin yleisemmin käytetty.

Semantiikka noissa kallistaa minun kohdalla vaakakuppia array-funktioiden suuntaan. Jos tarkoitus on selvittää, onko taulukossa joku avain, niin ihan automaattisesti tulee tuo jälkimmäinen kun se ihan sanasta sanaan tarkoittaa sitä. Jollekin toiselle voi isset-tuntua luontevammalta. Toki isset on nopeampi kirjoittaa ja, kun kyseessä on language construct, se toimiikin nopeammin. Perusteita on molempiin suuntiin, mutta minä en tekisi valintaa sentään siksi, että toinen on yleisempi :D

Btw, ainoat array:t, joissa käytän isset-funkkaria, on juurikin get ja post. Että sikäli.. :-)

tsuriga [18.10.2008 16:16:22]

#

Kieltämättä itselläkin jos yleisesti taulukoita ajattelee. Superglobaaleihin taulukoihin sitten issettiä kun on tottunut ajattelemaan niitä taulukoiden sijaan "onko asetettu tieto x" -mentaliteetilla.

Metabolix kirjoitti:

mitä palvelimelle edes oikeasti tulee.

PHP:lle ;p.

katket [19.10.2008 11:27:30]

#

No niin.

<?php
if ( !array_key_exists( 'folder', $_POST ) )
  echo 'folder-avainta ei löydy!';
?>

Ei palauta mitään eli avain ilmeisesti löytyy

<?php
// toinen nopea tapa katsoa mitä sieltä parametreista ylimäätään löytyy:
echo "<pre>GET:\n";
print_r( $_GET );
echo "\nPOST:\n";
print_r( $_POST );
echo '</pre>';
?>

Palauttaa test eli kansion nimen jonka valitsin

var_dump($_FILES) ja var_dump($_POST) palauttaa array(0) { } array(0) { } . Mitähän tästä voi päätellä?
Kansion nimi tulee normaalista select name="folder" valikosta. Kokeilin myös type="text" vaihtoehtoa mutta tulos on sama.

Sitten vielä kokeilin ilman defineä seuraavasti

<?php
$folder = $_GET['folder'];
echo $folder;

$uploaddir = '/home/uno4023/public_html/login/gallery/gal/'.$folder.'/';
echo $uploaddir;

if (IsSet($_FILES['file1'])) {
        for($i=1; $i<=4; $i++) {


move_uploaded_file($_FILES['file'.$i]['tmp_name'], $uploaddir.$_FILES['file'.$i]['name']);


        }
}
?>
//JA FORMI ON SEURAAVANLAINEN
<form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post" ENCTYPE="multipart/form-data">


<?php
for($i=1;$i<=4;$i++) {
        echo "  <b>$i</b> <input type=\"file\" name=\"file".$i."\" size=\"75\" ><br>";
}
?>
<input type="submit" value="upload" >&nbsp;&nbsp;&nbsp;<input type="reset" value="clear fields"></form>

ville-v [19.10.2008 12:47:46]

#

Lähetätkö sekä GETinä että POSTina? Otat nyt 'folder'in GETistä, aikaisemmin otit POSTista. Formissasi ei muuttujaa 'folder' näy. Onko se siis osoitteessa jo ennestään?

tsuriga [19.10.2008 16:17:45]

#

Vaihda PHP_SELF SCRIPT_NAMEen, PHP_SELFiin voi injektoida HTML:ää.

katket [19.10.2008 22:03:39]

#

Siis kokeilin kumpaakin get että post. Muttei sillä ollut vaikutusta kumpaa käytti. Tuo formi tuossa on se millä tiedostot uploadataan, ei se mistä folderin nimi tulee. Myöskään tuo SCRIPT_NAME ei tuonut muutosta.

ville-v [20.10.2008 14:18:12]

#

katket kirjoitti:

Siis kokeilin kumpaakin get että post. Muttei sillä ollut vaikutusta kumpaa käytti. Tuo formi tuossa on se millä tiedostot uploadataan, ei se mistä folderin nimi tulee.

Samaan formiinhan ne kannattaisi laittaa, koska vain yhden voi lähettää kerrallaan.

katket [21.10.2008 21:10:35]

#

Huomasin myös että kun uploadaan tuolla pätkällä missä kirjoitan koko polun (mikä siis toimii) niin tiedostojen chmodit on niin ettei niitä pysty lukemaan. php:n chmod-funktiolla ei pysty muuttamaan.
Kokeilin tätä samaa hommaa toisella palvelimella ja kaikki toimii hyvin eli ongelma onkin siinä että webolin palvelimella on jotain suojausasetuksia päällä.

Kiitokset kaikille ongelmaa pohtineille.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta