Flatfiles opslaan in map
Ik ben momenteel een beetje aan het experimenteren met flat files..
Voor bijvoorbeeld een mailinglijst.
Het schrijven van de file was tot dusver geen probleem..
Maar nu wil ik op basis van de ingevulde gegevens in het formulier een map aan laten maken en daar de flat file in opslaan..
Het aanmaken van de map was overigens geen probleem maar het opslaan van de file in de map wil gewoon niet lukken..
dit heb ik tot dusver:
Het formulier [register.php]
Quote:
<form name="form1" method="post" action="signup.php">Email: <input type="text" name="mail"><br><input type="submit" name="Submit" value="Sign Up"> </form>
De code
Code (php)
ik hoop dat iemand mij een beetje op weg kan helpen!
mvg Kevin Kastelein
Gewijzigd op 25/09/2014 02:14:01 door Kevin Kastelein
Mag een @ in een filename staan?
Heb je al nagedacht over $email = '../../some/unexpected/location/'
Fopen bevat normaal een filename als 1è parameter, niet een map. De 2e is ook zeker niet een string met filename...
Je kan ook gewoon $_POST['email'] in je fopen() gebruiken.
Daarnaast is het woord 'bestand' beter dan 'flat file'.
En je controleert niets.
Ik zou het zo doen:
Code (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
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
<?php
// kijk of er wel gepost is...
if (filter_var($_POST['email'], FILTER_VALIDATE_EMAIL) == false)
{
echo 'Er is geen geldig emailadres opgegeven.';
}
else
{
// beveilig het emailadres tegen rare dingen als ' en <?php ...
$email = htmlentities($_POST['mail']);
// maak een geschikte map aan. Het emailadres is geldig (validate_filter())
$mapnaam = str_replace(array("@", "."), array("___", "_"), $email);
// maak een map voor elk emailadres om daarin het emailadres op te slaan... ???
if(mkdir($mapnaam, 0700) === false)
{
echo 'Kon geen map aanmaken. Onvoldoende rechten waarschijnlijk..';
}
else
{
// Maak een bestand aan. Als dat lukt: geef melding weer of ga verder.
if(fopen($mapnaam . "/user.txt", "a") === false)
{
echo 'Kon bestand niet openen of aanmaken';
}
else
{
// vul in voorbeeld___website_nl/user.txt als enige de string [email protected]
if(fwrite($openen_bestand, $email . PHP_EOL) === false)
{
echo 'Kon bestand niet bijwerken. Uw emailadres is niet opgeslagen.';
}
else
{
echo 'Uw emailadres is in uw eigen map in een eigen bestand opgeslagen...';
}
}
}
}
?>
Let wel: het idee is belachelijk.
Je maakt voor elk emailadres een map aan.
In die map komt 1 bestand: user.txt
In dat bestand staat 1 regel: het emailadres.
Waarom niet alle emailadressen in 1 bestand, zonder map?
Of beter: gewoon in een database?
// kijk of er wel gepost is...
if (filter_var($_POST['email'], FILTER_VALIDATE_EMAIL) == false)
{
echo 'Er is geen geldig emailadres opgegeven.';
}
else
{
// beveilig het emailadres tegen rare dingen als ' en <?php ...
$email = htmlentities($_POST['mail']);
// maak een geschikte map aan. Het emailadres is geldig (validate_filter())
$mapnaam = str_replace(array("@", "."), array("___", "_"), $email);
// maak een map voor elk emailadres om daarin het emailadres op te slaan... ???
if(mkdir($mapnaam, 0700) === false)
{
echo 'Kon geen map aanmaken. Onvoldoende rechten waarschijnlijk..';
}
else
{
// Maak een bestand aan. Als dat lukt: geef melding weer of ga verder.
if(fopen($mapnaam . "/user.txt", "a") === false)
{
echo 'Kon bestand niet openen of aanmaken';
}
else
{
// vul in voorbeeld___website_nl/user.txt als enige de string [email protected]
if(fwrite($openen_bestand, $email . PHP_EOL) === false)
{
echo 'Kon bestand niet bijwerken. Uw emailadres is niet opgeslagen.';
}
else
{
echo 'Uw emailadres is in uw eigen map in een eigen bestand opgeslagen...';
}
}
}
}
?>
Let wel: het idee is belachelijk.
Je maakt voor elk emailadres een map aan.
In die map komt 1 bestand: user.txt
In dat bestand staat 1 regel: het emailadres.
Waarom niet alle emailadressen in 1 bestand, zonder map?
Of beter: gewoon in een database?
Gewijzigd op 25/09/2014 08:57:25 door Eddy E
wat fijn dat je het idee belachelijk vind.. ook zo lekker aardig zonder dat je de context weet!
maar evengoed bedankt ik ga aan de slag met je antwoord :)
mvg kevin
Als dat niet zo is, dan is het wel een belachelijk grote omweg om een email adres op te slaan.
Maar ook als je plannen hebt om meer bestanden daar op te gaan slaan: het wordt al snel een onoverzichtelijk geheel wat slecht beheerbaar is.
Wat als iemand een ander emailadres wil gebruiken?
wat als iemands account moet worden opgeheven?
Je kunt ook alle bestanden in 1 directory opslaan. Liefst met een door jou scripts en database gekozen (numerieke) naam.
In die database kun je perfect bijhouden dat van de user [email protected] het bestand 1234 en 435 en 34343.doc zijn.
De site waarop dit script word gebruikt, verzamelt e-mailadressen allemaal in 1 file.. dat werkt perfect!
Maar voor software wat ik heb geschreven moeten er bepaalde berichten in een map gezet worden om die vervolgens met de software weer uit te kunnen lezen..
Het gaat feitelijk dus niet specifiek om het opslaan van e-mailadressen, maar wel ongeveer het zelfde principe..
overigens het script wat eddy heeft gemaakt doet vrijwel niks.. maakt geen map en maakt geen bestand.. maar krijg ook geen foutmeldingen..
Ondertussen heb ik het zelf al wel uitgevonden, dus mag ik jullie hartelijk bedanken voor jullie tijd en moeite!
mvg
welke versie van PHP gebruik je?
Het script van Eddy heeft een hoop gedaan aan foutenafvangen, dus "iets" moet het wel doen.
Tenzij je een wat oudere php versie hebt die bijvoorbeeld filter_var nog niet kent.
Verder: is een database echt geen optie? Het maakt je leven een stuk eenvoudiger (ok, misschien nu eerst een middagje nodig om de basis te snappen, maar daarna een heeele hoop gemak van...
ik denk dus dat ik een wat oudere versie van php heb, want er gebeurd werkelijk helemaal niets..
Nee ik werk uitsluitend zonder database omdat ik simpelweg de tijd er niet voor heb om me er teveel in verdiepen :)
mvg