Hallo,

ik ben hier nieuw en als ik op de verkeerde plek post, dan nu alvast mijn excuses.

Ik ben geen programmeur, nooit gedaan en helemaal geen ervaring mee maar een week geleden liep ik tegen het probleem aan dat ik een scriptje moest hebben dat ik zo nergens kon vinden.

Dus ben ik maar zelf gaan knutselen (google is your friend).

Wat heb ik nou gemaakt?

- een formulier in html waarin je een gebruikersnaam, email en wachtwoord kan invullen en een foto kan uploaden.

- een mysql database met de nodige velden.

- een php bestand om te includen voor de database connectie.

- een php bestand dat alle $_POST variabelen overneemt.

- vervolgens wordt een basispad bepaalt (\\server\map\)

- daar achter wordt een gebruikersnaam en een geslacht geplakt.

- deze map wordt dan aangemaakt.

- dan moet het bestand (foto) naar deze map gekopieert worden.

- als laatse in de database alles opslaan inclusief het pad naar het bestand dat net gekopieert is.

Nou, bijna alles werkt, behalve het kopieren van het bestand.
Ik zeg het verkeerd, hij kopieert het wel van de temp dir naar de basis dir, maar vervolgens niet naar de submap die aangemaakt is.

Ik zei al, ik ben geen programmeur en doe dit uit pure noodzaak, dus ik snap ook niet waar het foutgaat.

Heeft misschien een van jullie een idee of een duwtje in de juiste richting ?

bij voorbaat al dank.

ps. ik weet niet of ik het script hier mag posten dus dat doe ik dan op verzoek wel.
Welkom Mario.

Je topic staat in het juiste forum en je post is goed constructief. We zijn dus nu al blij met je.

Zou je een stukje relevante code willen posten. Namelijk het deel waar de mappen worden aangemaakt en het deel waar er geupload wordt.

Gr,

Erik
Hallo erik en bdankt voor het welkom.
Hieronder vindt je het scriptje zoals het nu is. Ik weet dat het waarschijnlijk het ergste script is dat je ooit hebt gezien maar goed...

<?php

//verbinding maken met database
INCLUDE ("dbconnect.php");

//plaats de gegevens uit het formulier in variabelen
$naam= $_POST['naam'];
$email= $_POST['email'];
$geslacht= $_POST['geslacht'];
$foto= $_POST['foto'];

//het basispad wordt aangevuld met geslacht en gebruikersnaam
$target_path="//wxasrv/php/test/".$_POST['geslacht']."/".$_POST['naam']."/";

//maak nu een map geslacht/gebruikersnaam in de basisdir
mkdir("./$geslacht");
mkdir("./$geslacht"."./$naam");

//kopieer nu het bestand naar de map die net aangemaakt is. ALS IK DEZE REGEL WEGLAAT KOPIEERT HIJ WEL, MAAR NAAR DE BASISMAP !!!

$target_path = $target_path . basename( $_FILES['foto']['name']);


if(move_uploaded_file($_FILES['foto']['tmp_name'], $target_path)) {
echo "het bestand ". basename( $_FILES['foto']['name']).
" is succesvol opgeslagen";
} else{
echo "Er ging iets mis met het bestand. Probeer het opnieuw!";
}

//toon het pad op het scherm voor controle
echo "<BR>";
echo "<BR>";
echo "target path :";
echo $target_path;
echo "<BR>";


//bouw de query op voor gegevens overdracht. vul de variabelen met de waardes. dus ook het pad naar het bestand dat net gekopieerd is

$sql = "INSERT INTO user (naam, email, geslacht, foto) VALUES ('$naam', '$email', '$geslacht', '$target_path')";

//plaats nu de variabele in de database velden
mysql_query($sql);
?>

Dit lijkt mij de fout:

mkdir("./$geslacht"."./$naam");
(dit is namelijk ./geslacht./naam)

Dat moet worden:

mkdir("./$geslacht/$naam");
(dit is namelijk ./geslacht/naam)



(verder is het trouwens meestal aan te raden de bestanden te hernoemen in verband met onder andere veiligheid. en het is verstandig om te controleren of de extensie en mimetype wel kloppen, maar misschien doe je dat hierboven al)


Dank je voor de snelle reaktie, ik zal het gelijk uitproberen.

en je hebt gelijk dat ik zeker nog wat dingen moet aanpassen (controle op gebruikersnaam, bestaat de map al ?, is het een foto (jpg,gif,png etc), maar ik wilde het eerst werkend hebben voor ik details ga aanpassen.

ik heb het aangepast maar blijft nog steeds hetzelfde. Trouwens, het aanmaken van de mappen werkte al. Alleen het kopieren werkte niet.

als ik de regel:

//kopieer nu het bestand naar de map die net aangemaakt is
$target_path = $target_path . basename( $_FILES['foto']['name']);

weglaat, kopiert hij het bestand wel, maar alleen naar de basismap.

voeg ik de regel in, dan kopiert hij helemaal niet.

maar ik moet toch een doelmap bepalen voor het kopieren verplaatsen ?
Dit is de situatie.

Als je die regel weghaalt, dan staat nog steeds daarboven de volgende regel:

$target_path="//wxasrv/php/test/".$_POST['geslacht']."/".$_POST['naam']."/";


Dan gebruik hij dat dus als path. Dat is raar. Onder welke naam upload hij het dan? Want je code ziet er eigenlijk gewoon correct uit. Misschien heeft het met chmod te maken, bestandsrechten.

Je zou de functie copy() kunnen proberen. Maar het lijkt me heel sterk dat die het wel gaat doen. De fout moet zitten in de path of de bestandsrechten.

Als je dit bovenaan je script zet, krijg je dan errors:

<?
error_reporting(E_ALL);
ini_set('display-errors', 1);
?>
?
MIsschien handig om even te melden dat ik gewoon op windows XP draai met wamp. dus chmod() werkt niet en de map zelf heeft gewoon schrijfrechten.

uploaden gaat gewoon met een form. de regel voor het bestand is:

Foto: <input type="file" name="foto" />

ik geloof zelf dat het iets ermee te maken heeft dat ik submappen aanmaak en hij het complete pad niet kan resolven ofzo.

want waarom zou het programma anders wel werken als ik gewoon de submappen niet aan het pad toevoeg ?

Dus opzich werkt het script wel, alleen het move/copy naar de submap daar zit iets fout....

error reporting levert trouwens geen melding op.
<?php

//verbinding maken met database
INCLUDE ("dbconnect.php");

//plaats de gegevens uit het formulier in variabelen
$naam= $_POST['naam'];
$email= $_POST['email'];
$geslacht= $_POST['geslacht'];
$foto= $_POST['foto'];

//het basispad wordt aangevuld met geslacht en gebruikersnaam
$target_path="//wxasrv/php/test/".$_POST['geslacht']."/".$_POST['naam']."/";

//maak nu een map geslacht/gebruikersnaam in de basisdir
mkdir("./$geslacht");
mkdir("./$geslacht"."./$naam");

//kopieer nu het bestand naar de map die net aangemaakt is. ALS IK DEZE REGEL WEGLAAT KOPIEERT HIJ WEL, MAAR NAAR DE BASISMAP !!!

$target_path = $target_path . basename( $_FILES['foto']['name']);


if(move_uploaded_file($_FILES['foto']['tmp_name'], $target_path)) {
echo "het bestand ". basename( $_FILES['foto']['name']).
" is succesvol opgeslagen";
} else{
echo "Er ging iets mis met het bestand. Probeer het opnieuw!";
}

//toon het pad op het scherm voor controle
echo "<BR>";
echo "<BR>";
echo "target path :";
echo $target_path;
echo "<BR>";


//bouw de query op voor gegevens overdracht. vul de variabelen met de waardes. dus ook het pad naar het bestand dat net gekopieerd is

$sql = "INSERT INTO user (naam, email, geslacht, foto) VALUES ('$naam', '$email', '$geslacht', '$target_path')";
mkdir("./$geslacht/$naam");

//plaats nu de variabele in de database velden
mysql_query($sql);
?>


Graag gedaan!

Je kan altijd nog gebruik maken van:
--------------------------------------------
-DIT NIET IN JE SCRIPT DOEN---------
--------------------------------------------

<?
error_reporting(E_ALL);
ini_set('display-errors', -1);
?>

Of

<?
error_reporting(E_ALL);
ini_set('display-errors', 1);
?>


Graag gedaan!
Eerst allemaal heel erg bedankt voor de hulp en de suggesties.

@remco: sorry ik snap het niet goed... jou aanpassing werkte ook niet. zal wel aan mij liggen.

Ik heb het probleem inmiddels opgelost. Wat heb ik gedaan ?

- Ik heb alle bestanden verhuist van mijn xp machine naar mijn reguliere hosting (linux).

- heb daar natuurlijk de database aangemaakt en de paden gewijzigd.

- daarna heb ik het script aangepast.

de mkdir functie die jullie voorstellen werkte niet, hij weigert gewoon recursive dirs aan te maken, dus mijn eerste insteek was denk ik goed, een dir aanmaken dan de volgende.

zie hieronder het volledige script dat dus nu op mijn hosting goed werkt.

<?php

//verbinding maken met database
INCLUDE ("dbconnect.php");

//plaats de gegevens uit het formulier in variabelen
$naam= $_POST['naam'];
$email= $_POST['email'];
$geslacht= $_POST['geslacht'];
$foto= $_POST['foto'];

//het basispad wordt aangevuld met geslacht en gebruikersnaam
$target_path="image/".$_POST['geslacht']."/".$_POST['naam']."/";

//maak nu een map geslacht/gebruikersnaam in de basisdir. doe dit door eerst een map dan de andere te maken.
mkdir("./image/$geslacht");
mkdir("./image/$geslacht/$naam");

//kopieer nu het bestand naar de map die net aangemaakt is.
$target_path = $target_path . basename( $_FILES['foto']['name']);

if(move_uploaded_file($_FILES['foto']['tmp_name'], $target_path)) {
echo "het bestand ". basename( $_FILES['foto']['name']).
" is succesvol opgeslagen";
} else{
echo "Er ging iets mis met het bestand. Probeer het opnieuw!";
}

//toon het pad op het scherm voor controle
echo "<BR>";
echo "<BR>";
echo "target path :";
echo $target_path;
echo "<BR>";


//bouw de query op voor gegevens overdracht. vul de variabelen met de waardes. dus ook het pad naar het bestand dat net gekopieerd is
$sql = "INSERT INTO user (naam, email, geslacht, foto) VALUES ('$naam', '$email', '$geslacht', '$target_path')";

//plaats nu de variabele in de database velden
mysql_query($sql);
?>


nogmaals heel erg bedankt voor de hulp. ik ga nu verder met leren hoe ik die gegevens weer uit de database haal. Dat wordt dan week 2 van mijn php zelfstudie :)



Wel snel een antwoord :P

Reageren