PHP script problemen
ik ben met een script bezig die ervoor zorgt dat ik directorys kan aanmaken met een automatisch gegenereerde naam in mijn user panel. maar ik wil nu er ook voor zorgen dat er daarna een txt file met wat info van me inputfield automatisch word toegevoegd aan de directory die net is aangemaakt. hier is een voorbeeld van mijn script.
een map aanmaken lukt, maar txt file met content van me input fields toevoegen aan de net aangemaakte map krijg ik niet voor elkaar dus wat zou ik hierbij toe moeten voegen om dat te laten lukken.
ik heb in mijn html 4 input fields en al die info moet in een txt komen met dus de aangemaakt directory.
hopelijk is het te volgen en kan iemand me helpen!
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
$bytes = 5;
$result = bin2hex(random_bytes($bytes));
if(isset($_POST['submit'])) {
$folder = $_POST['pathname'];
$dirPath = 'c:/xampp/htdocs/amkscript/'.$folder;
$result = mkdir($dirPath);
if ($result == '1') {
echo $dirPath . " has been created";
} else {
echo $dirPath . " has NOT been created";
}
header('location:index.php');
}
?>
$bytes = 5;
$result = bin2hex(random_bytes($bytes));
if(isset($_POST['submit'])) {
$folder = $_POST['pathname'];
$dirPath = 'c:/xampp/htdocs/amkscript/'.$folder;
$result = mkdir($dirPath);
if ($result == '1') {
echo $dirPath . " has been created";
} else {
echo $dirPath . " has NOT been created";
}
header('location:index.php');
}
?>
Heb je al gekeken naar file_put_contents ?
Enne... op lijn 11 kijk je of de waarde van $result '1' is (een string)? Waarom?
Dit staat in de PHP manual:
Quote:
Returns TRUE on success or FALSE on failure.
Verder is het verstandig om een exit() na je location-header te plaatsen. Nu maakt het weinig uit, maar als je script nog uitgebouwd zal worden, moet het wel meteen na het doorsturen stoppen.
Gewijzigd op 26/11/2019 22:56:13 door - Ariën -
ik heb naar file_put_content gekeken maar ik kom er niet helemaal aan uit hoe ik dit samen aan mijn huidige php script toevoeg zodat het gelijk na het toevoegen van mij directory de txt erbij toevoegt met de input info die is meegestuurd. graag een voorbeeld in code
alvast bedankt
Ga in het geval dat het gelukt is dan het bestand aanmaken. Zie ook example #1 op de genoemde pagina over file_put_contents.
Gewijzigd op 26/11/2019 23:18:27 door - Ariën -
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
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
<?php
$bytes = 5;
$result = bin2hex(random_bytes($bytes));
if(isset($_POST['submit'])) {
$folder = $_POST['pathname'];
$dirPath = 'c:/xampp/htdocs/script/'.$folder;
$result = mkdir($dirPath);
if ($result == 'TRUE') {
$file = 'people.txt';
// Open the file to get existing content
$current = file_get_contents($pathname);
// Append a new person to the file
$current .= "John Smith\n";
// Write the contents back to the file
file_put_contents($file, $current);
echo $dirPath . " has been created";
} else {
echo $dirPath . " has NOT been created";
}
header('location:index.php');
}
?>
$bytes = 5;
$result = bin2hex(random_bytes($bytes));
if(isset($_POST['submit'])) {
$folder = $_POST['pathname'];
$dirPath = 'c:/xampp/htdocs/script/'.$folder;
$result = mkdir($dirPath);
if ($result == 'TRUE') {
$file = 'people.txt';
// Open the file to get existing content
$current = file_get_contents($pathname);
// Append a new person to the file
$current .= "John Smith\n";
// Write the contents back to the file
file_put_contents($file, $current);
echo $dirPath . " has been created";
} else {
echo $dirPath . " has NOT been created";
}
header('location:index.php');
}
?>
en hoe zorg ik er nu dan voor dat mijn 3 input values worden toegevoegd in people.txt via post method?
Gewijzigd op 26/11/2019 23:30:33 door jan deman
Dus weg met die quotes eromheen!
Je kan toch $_POST['person_1'], $_POST['person_2'] en $_POST['person_3'] gebruiken, of hoe die inputs maar mogen heten. Dat kan ik niet opmaken uit je script.
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
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
<?php
$bytes = 5;
$result = bin2hex(random_bytes($bytes));
if(isset($_POST['submit'])) {
$folder = $_POST['pathname'];
$dirPath = 'c:/xampp/htdocs/script/'.$folder;
$result = mkdir($dirPath);
if ($result == TRUE) {
$file = 'people.txt';
// Open the file to get existing content
$current = file_get_contents($pathname);
// Append a new person to the file
$current .= $_POST['naam'], $_POST['achternaam'], $_POST['leeftijd'], $_POST['geslacht'];
// Write the contents back to the file
file_put_contents($file, $current);
echo $dirPath . " has been created";
} else {
echo $dirPath . " has NOT been created";
}
header('location:index.php');
}
?>
$bytes = 5;
$result = bin2hex(random_bytes($bytes));
if(isset($_POST['submit'])) {
$folder = $_POST['pathname'];
$dirPath = 'c:/xampp/htdocs/script/'.$folder;
$result = mkdir($dirPath);
if ($result == TRUE) {
$file = 'people.txt';
// Open the file to get existing content
$current = file_get_contents($pathname);
// Append a new person to the file
$current .= $_POST['naam'], $_POST['achternaam'], $_POST['leeftijd'], $_POST['geslacht'];
// Write the contents back to the file
file_put_contents($file, $current);
echo $dirPath . " has been created";
} else {
echo $dirPath . " has NOT been created";
}
header('location:index.php');
}
?>
Waarom zou je deze gegevens in een tekstbestand willen opslaan?
Of, een betere vraag:
Waarom zou je deze gegevens ongestructureerd in een tekstbestand willen opslaan?
Als je dat dan toch om een of andere reden wilt doen (wat is hiervoor de motivatie?) dan zou ik op zijn minst denken aan een standaard formaat zoals CSV of JSON.
Wat er hierboven misgaat is waarschijnlijk het volgende:
- $pathname bestaat niet (deze variabele wordt nergens gedefinieerd in het bovenstaande fragment), dus het uitlezen lukt niet
- $file is enkel de bestandsnaam, en niet het volledige pad naar het bestand, dus het wegschrijven lukt ook niet
- je controleert nergens of het lezen of schrijven misgaat door de waarden die file_get_contents() en file_put_contents() retourneren te inspecteren
Je krijgt waarschijnlijk ook een E_WARNING "fout"melding wanneer je de directory probeert te creëren op het moment dat deze al bestaat.
Maar nogmaals, vanwaar dit gepiel met bestanden en directories?
NB: omdat je hier meteen een header('Location: ...') achteraan gooit die je naar index.php doorstuurt zie je waarschijnlijk ook geen meldingen op het scherm. Ik zou deze in eerste instantie weglaten zodat je kunt zien/onderzoeken wat er misgaat.
Gewijzigd op 27/11/2019 00:07:37 door Thomas van den Heuvel
Leuk om weer eens wat te pielen zoals Thomas hierboven zegt, lang geleden haha..
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
if( $_SERVER['REQUEST_METHOD'] == 'POST' )
{
//$dirPath = 'c:/xampp/htdocs/amkscript/'.$folder;
// even van mijn eigen wampserverje
$dirPath = 'C:/wamp64/www/test/'.$_POST['pathname'];
$result = mkdir($dirPath);
if($result === true)
{
echo $dirPath . " has been created";
$file = 'naam.txt';
$current = $_POST['voornaam']."\n";
$current .= $_POST['achternaam']."\n";
$current .= $_POST['pathname']."\n";
file_put_contents($dirPath.'/'.$file, $current);
}
else
{
echo $dirPath. " not been created";
}
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>demo</title>
</head>
<body>
<form name="form" method="post" action="test.php">
eerste naam<br>
<input type="text" name="voornaam"><br>
tweede naam<br>
<input type="text" name="achternaam"><br>
path<br>
<input type="text" name="pathname"><br>
<input type="submit" name="submit" value="toevoegen">
</body>
</html>
if( $_SERVER['REQUEST_METHOD'] == 'POST' )
{
//$dirPath = 'c:/xampp/htdocs/amkscript/'.$folder;
// even van mijn eigen wampserverje
$dirPath = 'C:/wamp64/www/test/'.$_POST['pathname'];
$result = mkdir($dirPath);
if($result === true)
{
echo $dirPath . " has been created";
$file = 'naam.txt';
$current = $_POST['voornaam']."\n";
$current .= $_POST['achternaam']."\n";
$current .= $_POST['pathname']."\n";
file_put_contents($dirPath.'/'.$file, $current);
}
else
{
echo $dirPath. " not been created";
}
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>demo</title>
</head>
<body>
<form name="form" method="post" action="test.php">
eerste naam<br>
<input type="text" name="voornaam"><br>
tweede naam<br>
<input type="text" name="achternaam"><br>
path<br>
<input type="text" name="pathname"><br>
<input type="submit" name="submit" value="toevoegen">
</body>
</html>
edit typo..
Gewijzigd op 27/11/2019 00:08:27 door Bart V B
Als je dan toch geen formattering gebruikt zou ik denk ik alle informatie van een enkele gebruiker wel op één regel zetten misschien, gescheiden door een of ander karakter. Als je dit over meerdere regels gaat verspreiden wordt het fatsoenlijk uitlezen (nog) bewerkelijker. Plus dan moet mogelijk veel code op de schop op het moment dat je besluit hier een of meer stukken informatie aan toe te voegen (ander "aantal regels" per gebruiker etc.).
Gewijzigd op 27/11/2019 00:16:22 door Thomas van den Heuvel
Ik denk dat TS nog een beetje moet oefenen met de code syntax.
Dan is het denk ik nog niet zo van belang dat er allemaal extra toeters en bellen aan zitten.
Vandaar dat ik het zo kaal mogelijk en dichtbij zijn eigen code heb gelaten. ;)
nu wil ik het volgende krijgen in het script:
ik wil dat alle directorys die ik heb aangemaakt de txt files van gedisplayd worden in mijn html (zelfde plek waar ik directorys aanmaak) in een individuele tabel, en in die tabel zie je weer de inhoud van de txt file met daar aan een delete button om die tabel/directory en alle inhoud weer te kunnen verwijderen.
alleen mijn admin panel folder zit in dezelfde directory waar al die nieuwe directorys worden aangemaakt en ik wil dus niet dat ik straks de inhoud van die folder te zien krijg. ik moet dus echt alleen de inhoud van alle txt bestanden kunnen zien van de directorys/folders die ik net heb aangemaakt. en iedere nieuwe directory die erbij komt word gelijk gedisplayed. als dit werkt ben ik bijna klaar met het script. hopelijk is het nog te volgen.
misschien lijkt het allemaal te veel gedoe en ik weet een database zou logisch zijn als je mijn voorbeelden bekijkt maar het moet echt allemaal op deze manier gaan, dit is namelijk een opdracht van een klant en het moet gewoon nou eenmaal op deze manier anders zal de rest van de bijkomende backend bugs opleveren, (dus alle data die je ziet is niet wat daadwerklijk wat er in de txt komt te staan maar anders word het te ingewikkeld verhaal en doe het steeds in delen hopelijk geeft dat een beetje opheldering waarom het perse zo allemaal moet.
Jan deman op 27/11/2019 02:39:56:
alleen mijn admin panel folder zit in dezelfde directory
Oef, dat lijkt mij niet optimaal.
Doet het er toe waar deze directories precies staan, of gaat het meer over de aanwezigheid? In het laatste geval zou ik opteren voor een aparte "hoofd"directory buiten de webroot die als een soort van kapstok dient voor alle directories en tekstbestanden die je hieronder aanmaakt. Op die manier heb je een aparte "zandbak" voor deze functionaliteit, en zie je ook geen andere informatie en kun je ook niet per ongeluk ongerelateerde bestanden en directories verwijderen.
Dus maak van $dirpath een (vaste) verwijzing naar een locatie die uitsluitend bedoeld/geschikt is voor dit doel. Bij voorkeur buiten de publieke webdirectory, zodat deze bestanden nooit rechtstreeks te benaderen zijn. Dit is waarschijnlijk uit security oogpunt ook beter.
Gewijzigd op 27/11/2019 16:31:33 door Thomas van den Heuvel
www.mijnwebsite.nl/vlinder dus het is wel noodzakelijk dat het in publieke webdirectory zit, admin panel daarin hoeft niet perse in dezelfde directory te zitten maar waar kan ik mijn admin panel dan beter kwijt? aub wat voorbeeld code aangesloten op wat ik al eerder gepost heb en wat bart hierboven heeft.
daarbij is het me gelukt om txt inhoud te zien van mijn nieuw aangemaakt directory alleen als ik weer een nieuwe aanmaak veranderd het alleen steeds naar de nieuw aangemaakt directory maar ik wil alle directorys zien in een soort loop, ik wil ze dus constant in een tabel te zien krijgen individueel dus als voorbeeld:
directory "A":krijgt een tabel in html => directory "B":krijgt een tabel in html => directory "C":krijgt een tabel in html => etc etc
dus iedere aangemaakt directory krijg ik txt inhoud van gezien en aan die tabel wil ik een verwijder button die specifiek heel die directory verwijderd inclusief alle content. hopelijk is het een beetje duidelijk, zo ziet mijn code er nu uit in een html div:
het doet er wel doe waar de directory staat, het is de bedoeling dat er website content etc gekopieerd word naar de aangemaakte directorys dus als de directory naam is "vlinder" moet ik de content kunnen zien op daarbij is het me gelukt om txt inhoud te zien van mijn nieuw aangemaakt directory alleen als ik weer een nieuwe aanmaak veranderd het alleen steeds naar de nieuw aangemaakt directory maar ik wil alle directorys zien in een soort loop, ik wil ze dus constant in een tabel te zien krijgen individueel dus als voorbeeld:
directory "A":krijgt een tabel in html => directory "B":krijgt een tabel in html => directory "C":krijgt een tabel in html => etc etc
dus iedere aangemaakt directory krijg ik txt inhoud van gezien en aan die tabel wil ik een verwijder button die specifiek heel die directory verwijderd inclusief alle content. hopelijk is het een beetje duidelijk, zo ziet mijn code er nu uit in een html div:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<div>
<?php
$path="C:/xampp/htdocs/amkscript/$folder.";
$pathname= $_GET["pathname"];
$file="naam.txt";
//read file contents
$content="
<h2>$file</h2>
<code>
<pre>".htmlspecialchars(file_get_contents("$path/$file"))."</pre>
</code>";
//display
echo $content;
?>
</div>
<?php
$path="C:/xampp/htdocs/amkscript/$folder.";
$pathname= $_GET["pathname"];
$file="naam.txt";
//read file contents
$content="
<h2>$file</h2>
<code>
<pre>".htmlspecialchars(file_get_contents("$path/$file"))."</pre>
</code>";
//display
echo $content;
?>
</div>
Wanneer iemand een pagina opvraagt dan zou je dit ook naar een centraal doorgeefluik kunnen sturen (index.php) en daarvandaan kijk je in je content-directory of je daar informatie kunt vinden. Hiervoor zou je ook require() of include() kunnen gebruiken, je haalt deze informatie immers lokaal op.
Ik neem ook aan dat het controlepaneelspul niet letterlijk in de publieke webdirectory staat, maar dat dit een soort van symbolische link is? En anders zou je bij het uitlezen van de directories hier specifieke directories uit kunnen filteren.
Daarbij, we hebben het hier dus over content-creatie. Dit kun je ook via de database regelen? Het enige wat je opslaat is het pad (hoe deze content bereikbaar dient te zijn) en de inhoud zelf: html, text, of wat dan ook. Dan, met de eerder voorgestelde techniek (de "single point of entry" in je applicatie: index.php) vergelijk je het aangeroepen pad met de "paden" die staan opgeslagen bij deze teksten. Hier heb je helemaal geen losse bestanden of directories voor nodig.
Het enige wat je hiervoor nodig hebt is:
- een mechaniek dat alles intern doorstuurt naar index.php
- een databasetabel met hierin de velden pad, content, en wat je nog meer wilt opslaan
- een index.php bestand die de aangeroepen URL uitleest, een database-query uitvoert die controleert of er zo'n pad bestaat, en zoja, de bijbehorende content serveert
And Bob's your uncle? :)
Gewijzigd op 27/11/2019 19:19:55 door Thomas van den Heuvel
oke ik wist niet dat het ook zo kon maar alsnog weet ik niet waar ik precies naar opzoek moet qua info en code. dit kan ik nog wel: "een databasetabel met hierin de velden pad, content, en wat je nog meer wilt opslaan" maar de eerste en laatste benodigdheden weet ik niet precies waar ik naar moet kijken dus graag zie ik wat extra helpende info tegemoet komen :) alvast bedankt!
http://fangorn.thijma.nl/news/redirecting-all-requests-to-index-php-with-htaccess
Hiermee zorg je dat alles, behalve de fysiek bestaande bestanden en directories, doorgestuurd worden naar index.php. Dat is dan de voordeur waar alle aanvragen op binnenkomen zodat je die op een centrale plek kan afhandelen en naar de juiste plek kan dirigeren.
www.mijnwebsite.nl/vlinder index3 kan zien en /hond weer index1 etc etc. maar als ik zo kijk vraag ik me af hoe ik doet voor elkaar krijg met htaccess, (ik gebruik nu xampp maar word uiteindelijk gebruikt voor ubuntu 18 dus) daarom via de manier hoe ik het eerst deed leek mij het een stuk practicer aangezien ik ook niet echt weer te werken met htaccess. hopelijk is het allemaal niet teveel. zie graag uitgebreide info :)
nog steeds een hoop vraagtekens voor mij.. ik heb het doorgenomen maar ik blijf stuiten op het feit dat ik 3 index pages heb die ik doormiddel van "option" wil laten zien aan het aangemaakt path dus stel ik heb index1 index2 en index3 dan wil ik dat bijv Vanaf de allereerste index.php de aanvraag doorsturen naar de juiste index.php
Ga eens naar jouw site toe via zo een soort link: http://WWW.JOUWSITEHIER.NL/nieuws/1234/bla
Lees $path eens uit met print_r().
Gewijzigd op 27/11/2019 20:34:20 door - Ariën -
ik zit op xampp en daarbij snap ik nog steeds niet helemaal waar je naar toe wilt en waar ik nou precies mee moet beginnen etc.
Dat laatste zijn acties die je altijd uitvoert als je je huis binnen gaat. Je kan ook ervoor kiezen om losse bestanden aan te maken, die je direct benadert zoals: slaapkamer.php, keuken.php etc.... maar dat betekent dan dat je steeds door een raampje klimt, en in elke kamer een kapstok voor je jas moet ophangen en een plankje voor de sleutels moet aanbrengen.
Dat is niet efficiënt....
Dus daarom is het zinvol om eerst de .htaccess aanmaken, die ervoor zorgt dat je wordt doorverwezen naar de index.php. Daarna moet je jouw index.php aanmaken, en die leest dan je URL uit, zodat je zelf je acties ermee kan aanleggen. Eventueel kan je daarin nog een authenticatie-beveiliging inbouwen, ban-controle of andere controles die steeds plaats moeten vinden. En daarna kan je de gegevens uit de URL verwerken en de gebruiker doorsturen naar de juiste pagina.
Ik hoop dat je het nu snapt.
Gewijzigd op 27/11/2019 20:58:59 door - Ariën -