PHP script problemen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Jan deman

jan deman

26/11/2019 22:17:57
Quote Anchor link
goedenavond iedereen,

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)
PHP script in nieuw venster Selecteer het PHP script
1
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');
}

?>
 
PHP hulp

PHP hulp

29/11/2024 05:36:14
 
- Ariën  -
Beheerder

- Ariën -

26/11/2019 22:54:45
Quote Anchor link
Je wilt dus een txt-file plaatsen in de directory?
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 -
 
Jan deman

jan deman

26/11/2019 23:14:44
Quote Anchor link
ik heb het script gedeeltelijk ergens anders vandaan en zelf verder aangepast, dus ik zou ook niet weten waarom lijn 11 er zo uitziet.

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
 
- Ariën  -
Beheerder

- Ariën -

26/11/2019 23:17:53
Quote Anchor link
Ga eerst een GOED controleren op lijn 11 of de directory aangemaakt is. (controleer op een boolean (true/false)
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 -
 
Jan deman

jan deman

26/11/2019 23:30:06
Quote Anchor link
zoiets?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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
 
- Ariën  -
Beheerder

- Ariën -

26/11/2019 23:43:47
Quote Anchor link
TRUE is een boolean, geen string!
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.
 
Jan deman

jan deman

26/11/2019 23:53:45
Quote Anchor link
ik krijg nu een fout melding ( ik ben geen pro met php ik ben nog steeds elke dag aan het leren) wat doe ik fout?:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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');
}

?>
 
Thomas van den Heuvel

Thomas van den Heuvel

27/11/2019 00:02:14
Quote Anchor link
Wordt XAMPP tegenwoordig niet standaard uitgerust met een (MySQL) database?

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
 
Bart V B

Bart V B

27/11/2019 00:06:13
Quote Anchor link
even uit de losse pols, zoiets?
Leuk om weer eens wat te pielen zoals Thomas hierboven zegt, lang geleden haha..

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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>


edit typo..
Gewijzigd op 27/11/2019 00:08:27 door Bart V B
 
Thomas van den Heuvel

Thomas van den Heuvel

27/11/2019 00:13:46
Quote Anchor link
Er ontbreekt nog een FILE_APPEND flag denk ik? Anders wordt de vorige inhoud overschreven? Maar dit hangt af van wat de topicstarter wil I suppose, misschien wil 'ie wel per gebruiker een bestandje maken ofzo, geen idee.

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
 
Bart V B

Bart V B

27/11/2019 00:21:23
Quote Anchor link
True Thomas.
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. ;)
 
Jan deman

jan deman

27/11/2019 02:39:56
Quote Anchor link
dankjewel bart en iedereen alles werkt perfect!
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.
 
Thomas van den Heuvel

Thomas van den Heuvel

27/11/2019 16:07:06
Quote Anchor link
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
 
Jan deman

jan deman

27/11/2019 18:49:10
Quote Anchor link
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 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:



Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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>
 
Thomas van den Heuvel

Thomas van den Heuvel

27/11/2019 19:15:27
Quote Anchor link
Hm, maar hoe je een pagina serveert hoeft niet per se 1:1 gekoppeld te zijn met hoe je betandenindeling is. Je zou de content ook buiten de webdirectory kunnen opslaan (en zelfs kunnen cachen in de database of op een andere manier).

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
 
Jan deman

jan deman

27/11/2019 19:44:07
Quote Anchor link
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!
 
- Ariën  -
Beheerder

- Ariën -

27/11/2019 19:51:01
Quote Anchor link
Over dat eerste heeft Thomas ooit een blog geschreven:
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.
 
Jan deman

jan deman

27/11/2019 20:19:47
Quote Anchor link
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 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 :)
 
- Ariën  -
Beheerder

- Ariën -

27/11/2019 20:32:26
Quote Anchor link
Dat is de tweede stap in dat proces.
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 -
 
Jan deman

jan deman

27/11/2019 20:45:49
Quote Anchor link
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.
 
- Ariën  -
Beheerder

- Ariën -

27/11/2019 20:57:49
Quote Anchor link
Het punt is dat een vaste voordeur via één index.php de beste manier is om de andere pagina's aan te roepen. Normaal ga je toch ook via je voordeur naar je keuken, woonkamer, slaapkamer etc, waarbij je na het binnenlopen door de voordeur je jas ophangt, sleutels neerlegt 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 -
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.