PHP tekst-bewerkingen, uploaden csv-bestanden import/eport
PHP tekst- en csv-bestanden, bestanden uploaden
Inhoudsopgave Inleiding!
3
Voorkennis voor PHP-gevorderd!
3
PHP Bestandsbewerkingen!
4
Gegevens in een tekstbestand zetten!
4
Gegevens zoeken in een tekstbestand!
7
Gegevens zoeken en vervangen in een tekstbestand!
9
CSV-format en grafieken maken!
14
CSV-bestanden!
14
Grafieken maken!
14
Gegevens exporteren naar een csv-bestand!
15
Importeren vanuit een CSV-bestand!
17
Een enkel bestand uploaden naar de server!
18
© 2011
2
PHP tekst- en csv-bestanden, bestanden uploaden
Inleiding Deze reader / handleiding behandeld hoe met PHP kan omgaan met tekstdocumenten (txt) en CSVbestanden (basic-spreadsheets). In deze reader worden praktische acties uitgewerkt, zodat er een oplossing wordt geboden die als basis kan dienen om tekstdocumenten en csv-bestanden met PHP toe te passen.
Gegevens uit een formulier toevoegen aan een tekstdocument, gegevens opzoeken en wijzigen in een een tekstdocument, exporteren naar een csv bestand en importeren vauit een csv-bestand. De code is opzettelijk zo eenvoudig mogelijk beschreven, zodat de noodzakelijke stappen makkelijk te begrijpen zijn.
Ook wordt er aandacht besteed aan het uploaden van een bestand naar de webserver.
Voorkennis voor PHP-gevorderd Ervaring hebben met inzicht in het volgende moeten hebben: · · · ·
HTML-code (en of XHTM). Gebruik en installatie van een webservers (bijv: Apache als web-server in: XAMPP of MAMP) Basiskennis van PHP.
© 2011
3
PHP tekst- en csv-bestanden, bestanden uploaden
PHP Bestandsbewerkingen Gegevens in een tekstbestand zetten Het eerste hoofdstuk bevat code en uitleg hoe er gegevens uit een formulier in een tekstbestand gezet wordt. Voorbeeld 1:
Het formulier om een nieuwe gegevens in een tekstbestand op te slaan (index.php). Hierin zitten geen schokkende dingen ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
Waarde naar bestand! ! ! ! ! ! !! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
! ! ! ! ! ! ! !
© 2011
!
! ! ! ! !
!
4
PHP tekst- en csv-bestanden, bestanden uploaden
Het bestand index.php gaat verder met de volgende code ! ! ! alert("Bedankt voor het meedoen.\r ! ! ! Je gegevens zijn toegevoegd.");! ! ! '; }
!
!
!
!
!
elseif (isset($_POST[schrijf]) && ($_POST[anaam] == "" || $_POST[mobiel] == "" ! || $_POST[email] == "")) { ! echo 'het formulier is niet volledig gevuld'; ! } else {! ! ! ! ! ! ! echo 'vul het formulier in en doe mee!'; } ?>!
!
!
!
!
Het PHP-gedeelte start met een check of er wel echt op de submit-knop is gedrukt en of de velden wel gevuld zijn. Waarna het tekstbestand ‘deelnemers.txt wordt geopend met fopen(). De modus is a+, wat betekend dat het bestand in lees en schrijf modus wordt geopend, nieuwe content komt aan het einde van het document. Ik heb er voor gekozen om elke set informatie te scheiden met een *. Alle geposte informatie wordt met fwrite() aan het einde in het bestand toegevoegd. De ‘’\r\n’’ zorgt voor een return en een nieuwe regel, dit moet tussen dubbel quotes, anders is dit gewoon tekst die geplaatst wordt. Het bestand wordt gesloten met fclose() en er volgt een alert om de gebruiker op de hoogte te stellen dat alle gegevens opgeslagen zijn. Tot slot volgen de meldingen in alle andere gevallen en het sluiten van de tags.
© 2011
5
PHP tekst- en csv-bestanden, bestanden uploaden
NB: Alle mogelijke waarden bij het openen van een bestand ‘fopen() staan hieronder: "r"
(Alleen lezen. Start aan het begin van het bestand)
"r+"
(Lezen en schrijven. Start aan het begin van het bestand)
"w"
(Alleen schrijven. Bestand openen en leegmaken of maak een nieuw bestand als die nog niet bestaat)
"w+"
(Lezen en schrijven. Bestand openen en leegmaken of maak een nieuw bestand als die nog niet bestaat)
"a"
(Lezen en schrijven. Open en schrijf aan het einde van het bestand of maak een nieuw bestand als die nog niet bestaat)
"a+"
(Lezen en schrijven. Bewaar de inhoud en schrijft alleen aan het einde van het bestand)
"x"
(Alleen schrijven. Maakt een nieuw bestand en geeft FALSE terug en een fout / error als het bestand al bestaat)
"x+"
(Lezen en schrijven. Maakt een nieuw bestand en geeft FALSE terug en een fout / error als het bestand al bestaat)
© 2011
6
PHP tekst- en csv-bestanden, bestanden uploaden
Gegevens zoeken in een tekstbestand De volgende code geeft uitleg hoe er op een waarde gezocht kan worden en hierover verschillende waarden verzameld worden. Voorbeeld 2:
Het formulier om de achternaam uit een tekstbestand te zoeken (zoek.php). Het formulier is ook nu weer zo eenvoudig mogelijk weergegegeven. !
Zoeken in File !
! ! ! ! ! ! ! !
Er staan in dit formulier uitsluitend een zoekveld op de achternaam en een submit-knop.
© 2011
7
PHP tekst- en csv-bestanden, bestanden uploaden
Het php gedeelte sluit ook hier weer met een start melding en sluitende tags. Ook het begin idee is hetzelfde. Eerst moet de submit-knop zijn geklikt, alleen nu mag het zoekveld niet leeg zijn.
foreach ($file as $waarde) { ! $waarde = rtrim($waarde); // rechter space weghalen ! $regel++; //regelnummer ophogen; ! if($_POST[zoek] == $waarde) ! ! { ! ! $teller++; // aantal maal gevonden ! ! $gevondenin[$teller] = $regel; ! ! } }
! ! ! ! ! ! ! ! }! else { ! }
echo 'de zoekwaarde: '.$_POST[zoek].' is in regel:
'.$teller.' !
!
gevonden.
';
echo 'Het is gevonden in regel: '; // print_r(array_values($gevondenin)); //inhoud array foreach ($gevondenin as $regelgevonden) { echo $regelgevonden.', ';! }
echo 'voer een zoekwaarde in';!
?>
Vervolgens worden alle gegevens in een array gelezen en met een foreach wordt elke array-waarde vergeleken met de zoek waarde. Dit gebeurt met een IF.
De regel waarin het gevonden is wordt bewaard in een array en het aantal maal dat de waarde in totaal gevonden staat in $teller.
Uiteindelijk wordt het de gezochte waarde en het aantal maal dat het gevonden is weergegeven. Ook de regels waar de waarde staan worden weergegeven, gescheiden met een komma.
© 2011
8
PHP tekst- en csv-bestanden, bestanden uploaden
Gegevens zoeken en vervangen in een tekstbestand De volgende code geeft uitleg hoe er op een waarde gezocht kan worden en enkele waarden die daarbij horen worden dan vervangen. Voorbeeld 3a:
De code hieronder zoekt een waarde in het tekstbestand en wijzigt deze. !
Wijzig 1 waarde in een bestand !
! !
Wanneer doe knop zoek is geklikt en de zoek- en vervang-waarde zijn ingevuld wordt het bestand gelezen en in een array gezet. Elke waarde in de array wordt vergeleken met de zoek waarde. Bij een overeenkomst wordt de gevonden waarde in de array overschreven if (isset($_POST[wijzig]) && $_POST[zoek] != "" && $_POST[vervang] != "") {! ! $file = file("deelnemers.txt"); ! $aantal_records = count ($file); ! for($i = 0; $i <= $aantal_records; $i++) ! ! { ! ! ! if (rtrim($file[$i]) == $_POST[zoek]) ! ! ! ! { ! ! ! ! $file[$i] = $_POST[vervang]; ! ! ! ! $wijzigen[$wijzigingen] = $i; ! ! ! ! $wijzigingen ++; ! ! ! ! } ! ! }!
© 2011
9
PHP tekst- en csv-bestanden, bestanden uploaden
Het bestand wordt opnieuw geopend in een schrijf-modus en alle waarden, zonder spaties, worden opnieuw in het tekstbestand geschreven. ! ! ! ! ! !
$bestand = fopen("deelnemers.txt","w+"); for ($t = 0; $t <= $aantal_records; $t++) ! { ! ! ! fwrite($bestand,rtrim($file[$t])."\r\n"); ! }! fclose($bestand); unset($_POST[wijzig]);
Een alert en start-boodschap sluiten het geheel ! ! ! ! }! else { ! }
// alert - Gegegevens gewijzigd echo ! '<script type="text/javascript"> ! ! alert("Er zijn '.$wijzigingen.' wijziging doorgevoerd."); ! ';
echo 'voer een zoek en vervang-waarde in';!
?>
© 2011
10
PHP tekst- en csv-bestanden, bestanden uploaden Voorbeeld 3b:
In het volgende formulier worden meerdere waarden vervangen op één enkele zoekwaarde. Er wordt gezocht in een tekstbestand op het veld ‘achternaam’ gezocht. De standaardwaarde in het bevat de eerder ingevoerde waarden, na submit. !
Wijzig waarden in bestand ! !
© 2011
11
PHP tekst- en csv-bestanden, bestanden uploaden
De volgende PHP-code komt na het formulier: '; // inhoud tekst uit document ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
while (list($key, $val) = each($file)) { $val = rtrim($val); // rechter space weghalen if ($val == '*') //Zoek sterretje ! { ! // check of array-vakje + 1 overeenkomt met zoekwaarde ! if (rtrim($file[$key+1]) == $_POST[zoek]) ! ! { ! ! // zo ja, schrijf nieuwe arraywaarden in +2 t/m +4 ! ! ! $file[$key] = '*'."\n"; ! ! $file[$key+1] = $_POST[anaam]."\n"; ! ! $file[$key+2] = $_POST[vnaam]."\n"; ! ! $file[$key+3] = $_POST[mobiel]."\n"; ! ! $file[$key+4] = $_POST[email]."\n"; ! ! } ! }
!
Het tekstbestand word ingelezen en in een array gezet, wanneer alle velden gevuld zijn en de submit-knop is geklikt. Het aantal velden in de array worden geteld, deze waarde wordt later weer gebruikt als eindwaarde in een for-loop.
Elke waarde en array-sleutel (key) worden in uit de array doorlopen met een while. Als de waarde een * is dan betekend dat dat de variabele met de sleutelwaarde (key) verhhoogd met 1, de achternaam bevat. Verhoogd met 2, de voornaam. Verhoogd met 3, het mobiele nummer en tenslotte met 4 verhoogd bevat het email-adres.
Bij het invoeren van nieuwe deelnemers zorgt de \r ervoor dat er een ‘return’ wordt toegevoegd. Dit geeft een spatie in de array-waarde. Dit wordt door de rtrim() verwijdert waarin de achternaam staat (key + 1). Als deze waarde overeenkomt met de gezochte waarde, dan worden de nieuwe waarden in de bijbehorende array-waarden gezet.
vervolg PHP-code. © 2011
12
PHP tekst- en csv-bestanden, bestanden uploaden
! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! }! else { ! } ?>
} // einde while $bestand = fopen("deelnemers.txt","w+"); ! // open bestand en leeg het schrijf daarna. for ($i = 0; $i <= ($aantal_records-4); $i = $i + 5) ! {! ! fwrite($bestand,$file[$i].$file[$i+1].$file[$i+2].$file[$i+3].$file[$i+4]); ! } //print_r($file); echo '
'; // nieuwe inhoud array voor tekstdocument ! fclose($bestand); unset($_POST[wijzig]); // alert - Gegegevens gewijzigd echo ! '<script type="text/javascript"> ! ! alert("Wijziging uitgevoerd."); ! ';
echo 'voer een zoekwaarde in en de nieuwe gegevens'; !
Nadat de array is doorlopen met eventuele wijzigingen, zal deze informatie weer in het tekstbestand geplaatst worden. Hiervoor wordt het bestand vanaf het begin herscherven. Per sterretje (*) worden de waarden in het bestand gezet, hiervoor zijn er 5 array-waarden per loop nodig. De loop loopt zolang als het maximale aantal records in de array min 4, zo zal alleen het laatste sterretje nog een loop hebben. Hierna wordt het bestand gesloten en de submit wordt gereset. No een melding aan de gebruiker worden de resterende html-tags worden gesloten.
© 2011
13
PHP tekst- en csv-bestanden, bestanden uploaden
CSV-format en grafieken maken CSV-bestanden
CSV staat voor ‘comma seperated value’ en is een eenvoudig format om waarden in een spreadsheet weer te geven. Een opbouw kan als volgt:
De opmaak in het csv-bestand is dan als volgt:
Grafieken maken Grafieken maken kan met http://www.swiftchart.com. Download de applet waarin een class gelink is met verschillende meegeleverde html-bestanden. In de ze html-documenten staat code die aan te passen is. Door van deze html-documenten phpdocuemnten te maken kunnen er waarden ge-echoed worden op de gewenste plekken. Een garfiek kan er dan alsvolgd uitzien:
© 2011
14
PHP tekst- en csv-bestanden, bestanden uploaden
Gegevens exporteren naar een csv-bestand De volgende code maakt het mogelijk om gegegvens uit een tekstbestand te halen, deze in een array te zetten en dit in een csv-bestand te zetten. Een csv-bestand kan in EXCEL worden geopend en heeft een basic opmaak met cel-waarden. Voorbeeld 4: !
Exporteer bestand in cvs (spreadsheet) !
! ! !
inhoud bestand overzetten naar CSV
! ! ! ! ! !
! !
Het formlier bevat enkel een submit-knop die de export naar een csv gaat triggeren. Dit wordt gevolgd door de volgende php-code
Als de knop is geklikt, worden de regels uit het tekstbestand in een array gezet. Daarna wordt het totaal aantal records geteld in deze array.
© 2011
15
PHP tekst- en csv-bestanden, bestanden uploaden $fileCSV = fopen("deelnemersheet.csv","w");
! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! } ?>
fwrite($file,'Deelnemers voor onze activiteiten;;;'."\n"); fwrite($file, 'Naam;Voornaam;mobiel;email'."\n"); for ($i = 0; $i <= ($aantal_records-4); $i = $i + 5) { ! // trim haalt spaties weg van array-waarde, in CSV wordt dit een nieuwe cel ! $waarde = trim($line[$i+1]).'; '.trim($line[$i+2]).'; '.trim($line[$i+3]).'; '.trim($line[$i+4])."\n"; ! echo $waarde.'
'; ! fwrite($file,$waarde); ! } ! fclose($file); // alert - nieuw content in CSV-bestand echo '<script type="text/javascript"> ! alert("Export voltooid.\r open CSV-bestand om inhoudt te zien."); '; unset($_POST[converteer]);
Eerst wordt een csv-bestand aangemaakt of leeg gemaakt en schrijft vanaf het begin.
De eerste methode, als opmerking in de code, loopt alle records langs en zet deze in een csv-bestand waarbij alle waarden onder elkaar komen.
De code gaat verder waarbij waarden in rijeen te plaatsen met extra info ervoor. Er wordt met fwrite() geschreven in het bestand. Na een punt-komma volgt een nieuwe cel. Met de \n wordt er naar een nieuwe regel gesprongen.
Met de loop worden de verschillende array-waarden doorlopen, totdat alle waarden zijn geweest. De loop maakt sprongen van vijf, omdat er vijf waarden per deelnemer worden gebruikt. Het bestand wordt gesloten.
De gebruiker krijgt een allert en de submit-actie wordt gereset.
© 2011
16
PHP tekst- en csv-bestanden, bestanden uploaden
Importeren vanuit een CSV-bestand Omgekeerd kan het natuurlijk ook. Een CSV-bestand wordt aangeleverd en dit wordt binnen gehaald in een tekst-bestand. In plaatst hiervan kan de schrijf-actie naar het tekst-bestand ook een query zijn, waarin er in de database een record wordt toegevoegd/overschreven. !
Importeer CSV <pre>
$fileTXT = fopen('deelnemerimport.txt', 'w+'); // clears tesktbestand of maakt het aan ! foreach ($list as $lijn) ! { ! fwrite($fileTXT, '*'."\r".$lijn[0]."\r".$lijn[1]."\r".$lijn[2]."\r".$lijn[3]."\r"); ! } fclose($fileTXT);
!
importeer csv-bestand
! output is: deelnemerimport.txt ! NB: wanneer een print_r() functie wordt gebruikt is het zinnig om dit binnen de html-tag <pre> te doen, zo komen de array-waarden onder elkaar te staan, wat beter leesbaar is.
© 2011
17
PHP tekst- en csv-bestanden, bestanden uploaden
Een enkel bestand uploaden naar de server De volgende code geeft uitleg hoe een enkel bestand geselecteerd kan worden en vervolgend geupload wordt naar een folder naar keuze. Enkele controles worden uitgevoerd. Zo wordt de grootte van het bestand gecontroleerd en het type of de extensie mag geen php-bestand zijn. Voorbeeld 5:
Bestand upload.php wordt hieronder weergegeven: ! !
uploaden upload een bestand
$max_mb) { // beperk bestands grootte ! echo "Het bestand is groter dan ".($maxMB/1000). ! ! ! "MB
Upload een kleiner bestand
"; ! $ok=0; } if (isset($_POST[submit]) && ($uploaded_type == "text/php" || preg_match('/\.php$/i', basename($_FILES['name'])) == "php")) { //Beperk het soort bestanden ! echo "PHP-bestanden mogen niet worden geupload
"; ! $ok=0; } if (isset($_POST[submit]) && $ok==0 ) { //Error-melding wanneer niet aan de voorwaarden wordt voldaan ! echo "Het betsand voldoet niet aan de voorwaarden"; } else { //Er is voldaan aan upload-voorwaarden -> uploaden bestand if(move_uploaded_file($_FILES['uploaded']['tmp_name'], $targetfolder)) ! { ! echo "Het bestand
". basename( $_FILES['uploadedfile']['name']). " is geupload naar de map"; ! } } unset($_POST[submit]) ?>
© 2011
18