[PHP,MYSQL,CSV] CSV files import met pagina aanmaak

Pagina: 1
Acties:
  • 714 views

  • Spin1
  • Registratie: Maart 2009
  • Laatst online: 20-08-2024
Zoals de titel zegt:
Moet ik een functie maken die csv bestanden automatisch aan een pagina koppelt.
Dus ik heb een csv file die moet komen op het volgende pad Home/bakker/software/OS.
Nu bestaat de pagina Home en bakker al. Maar de Pagina's Software en OS nog niet.
Deze pagina's moeten nu aangemaakt worden en een parentid meekrijgen.
Dus ik heb Home/bakker.
Mijn CSV:

Pagina:
Home/Bakker/software/OS

tekst:
Het Os waar de computer van de bakker op draait is XP.

Nu moet het systeem kijken bestaat Bakker al zo ja door, bestaat software zo nee pagina aanmaken, en volgende pagina's ook aanmaken.
Maar de pagina software en OS kunnen ook voorkomen bij Home/slager/software/OS.

De database structuur die ik gebruik is die van crisp. Id met een parentid.

ik hoop dat de uitleg een beetje te begrijpen is mijn code nu:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
include_once('config.php');
$verbinding = mysql_connect(mysql_host, mysql_user, mysql_password) or die(mysql_error());
mysql_select_db(mysql_database, $verbinding) or die (mysql_error());

$output = array('Bestand is geimporteerd' => 0, 'Helaas, er is iets fout gegaan' => 0);
ini_set('auto_detect_line_endings',1);
$bestand = fopen('test2.csv', 'r');
while (($data = fgetcsv($bestand, 1000, ',')) !== FALSE) {
   $val1 = mysql_real_escape_string($data[0]);
   $val2 = mysql_real_escape_string($data[1]);
mysql_query("INSERT INTO `paginas` (`pagina`,`tekst`) VALUES ('{$val1}','{$val2}')");
   $result = (mysql_insert_id()> 0) ? 'Bestand is geimporteerd' : 'Helaas, er is iets fout gegaan' ;
   $output[$result]++;

}
  
print_r($result); 

?>


Met deze code kan ik alleen een pagina met paginanaam en tekst aanmaken. Maar ik zou niet weten hoe ik met deze code een pad kan aflopen en dan de missende pagina's aanmaken.

[ Voor 5% gewijzigd door Spin1 op 19-11-2009 11:37 ]


  • JefSnare
  • Registratie: Augustus 2007
  • Laatst online: 09-11-2020
Dus je bedoelt;

code:
1
2
3
foreach(item as definitie){
 if(exist($var){true} else {exit+error}
}

offtopic:
Even in een pseudo/eigen taal/leken code :X


Dat er dus gecontroleerd wordt of iets bestaat en zo niet er een error wordt weergeven?

Twitter Flickr


  • Spin1
  • Registratie: Maart 2009
  • Laatst online: 20-08-2024
JefSnare schreef op donderdag 19 november 2009 @ 11:44:
Dus je bedoelt;

code:
1
2
3
foreach(item as definitie){
 if(exist($var){true} else {exit+error}
}

offtopic:
Even in een pseudo/eigen taal/leken code :X


Dat er dus gecontroleerd wordt of iets bestaat en zo niet er een error wordt weergeven?
Ja ongeveer er moet gekeken worden
-bestaat Home zo ja door
-bestaat bakker zo ja door
-bestaat software nee, maak automatisch pagina aan
-bestaat OS nee, maak automatisch Os aan
-zet tekst op pagina OS.

Maar pagina software en OS kunnen ook voorkomen bij slager,schoenmaker,fietsenmaker enz. Dus daar zit ik ook een beetje mee in.

Database opbouw ziet er ongeveer zo uit

ID Parentid Pagina tekst
1 0 klanten Selecteer gewenste klant
2 1 bakker Pagina van bakker
3 2 software Selecteer de software
4 3 OS bakker draait op windows XP
5 1 slager Pagina van slager
6 5 software Selecteer de software
7 6 OS Slager draait op windows Vista

[ Voor 8% gewijzigd door Spin1 op 19-11-2009 11:55 ]


  • JefSnare
  • Registratie: Augustus 2007
  • Laatst online: 09-11-2020
Ehm, dus je wil als het ware controleren of de pagina bestaat en zoniet dat deze aangemaakt wordt? Ik denk dat het opzich niet zo lastig is (voor een gevorderde php-er) maar als je dit zo wilt ga je richting docuWiki op waar dit ook gebeurt (een onbestaande pagina aanmaken). Maar je wilt dus ook de pagina's "koppelen"?

[ Voor 4% gewijzigd door JefSnare op 19-11-2009 12:00 ]

Twitter Flickr


  • Spin1
  • Registratie: Maart 2009
  • Laatst online: 20-08-2024
JefSnare schreef op donderdag 19 november 2009 @ 11:59:
Ehm, dus je wil als het ware controleren of de pagina bestaat en zoniet dat deze aangemaakt wordt? Ik denk dat het opzich niet zo lastig is (voor een gevorderde php-er) maar als je dit zo wilt ga je richting docuWiki op waar dit ook gebeurt (een onbestaande pagina aanmaken). Maar je wilt dus ook de pagina's "koppelen"?
Ja precies, De pagina's wil ik ook koppelen ja, Dus dat ze in de goede volgorde worden weergegeven aan de hand van een parentid. En dat de pagina software als die 2 keer voorkomt niet bij de verkeerde klant wordt weergegeven.

[ Voor 7% gewijzigd door Spin1 op 19-11-2009 12:14 ]


  • JefSnare
  • Registratie: Augustus 2007
  • Laatst online: 09-11-2020
Ik zou eerst even een goed overzicht maken inclusief PSD diagram en dan kun je vrij snel bepalen hoe je gaat coderen. Dus wat ik al eerder zijn met de foreach, while en for functies kom je heel ver. Met de PSD kun je twee dingen, starten met coderen en veiligheidslekken of problemen zien

Twitter Flickr


Acties:
  • 0 Henk 'm!

  • Spin1
  • Registratie: Maart 2009
  • Laatst online: 20-08-2024
Ik heb dus een psd gemaakt, en gekeken wat nou het grootste probleem is.
Ik kom de volgende problemen tegen.

bestaande paginas te importeren:

1 0 Klanten
9 1 Bakker
33 9 Besturingssysteem.

En hoe kan ik na Besturingssysteem de pagina Windows en daarna Windows 7 toevoegen.

Ik had zelf iets in gedacht van:
- Bestaat deze pagina al
- Achterhaal id
- Zet bij de volgende import dit id als parentid
- Haal id op van laatst geimporteerde
- Zet deze weer als parentid.
enz.

[ Voor 36% gewijzigd door Spin1 op 01-12-2009 10:56 ]


Acties:
  • 0 Henk 'm!

  • Spin1
  • Registratie: Maart 2009
  • Laatst online: 20-08-2024
Zou iemand mij kunnen vertellen waar ik meer info over: een csv file importeren in een mysql tree met de parentid methode. via google kan ik ook niet veel vinden namelijk.

En is de bovenstaande psd in orde.

[ Voor 137% gewijzigd door Spin1 op 11-12-2009 09:47 ]


Acties:
  • 0 Henk 'm!

  • Spin1
  • Registratie: Maart 2009
  • Laatst online: 20-08-2024
Ik ben nu weer verder, ik moet nu alleen een parentid aanwijzen maar zit daar behoorlijk mee te kl*&%en.
Hij leest nu perfect het pad af maar de nieuwe pagina toevoegen gaat redelijk.

Ik had in gedachte om een array te vullen met de id's daarna hoogste id eruit halen en die als parentid helaas werkt dit op een of andere rare reden niet zou iemand ff naar mijn code kunnen kijken of zeggen wat er verkeerd is aan de array.

Verder werkt het als gehoopt, alleen parentid toewijzen lukt op een of andere rare wijze niet.

code:
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
$output = array('Bestand is geimporteerd' => 0, 'Helaas, er is iets fout gegaan' => 0);
ini_set('auto_detect_line_endings',1);
$bestand = fopen('test2.csv', 'r'); 
while (($data = fgetcsv($bestand, 1000, ',')) !== FALSE) {
   $val1 = mysql_real_escape_string($data[0]);
$que = mysql_query("SELECT * FROM paginas WHERE pagina='". $val1 ."' AND parentid='". $id ."'"); 
$resultaat = mysql_fetch_array($que); 
$naam = $resultaat['pagina'];
$id = $resultaat['id'];


$c = array($id);
foreach($c as $q) {
print $q."<br>"; 
}

  


if( $id == 0 )
{    
mysql_query("INSERT INTO `paginas` (`pagina`,`parentid`) VALUES ('{$val1}','$q')");   
}
}

function printbreadcrumb($id) {
    $sql = "SELECT id, parentid, pagina
                FROM paginas
                WHERE id = $id";
    $result    = mysql_query($sql) or die('Er ging iets fout');
    $row = mysql_fetch_array($result);
    if ($row['parentid']) {
        printbreadcrumb($row['parentid']); 
    }
    echo "> <a href='index.php?id=$id'>$row[pagina]</a> ";
    return;
}
printbreadcrumb($id);


de array geeft de id's perfect maar als ik doe:
echo max ($c);

geeft hij het eerste id |:(

ook :echo max ($q); werkt niet.
Zal wel een ongelooflijke stomme fout inzitten, maar zou iemand mij hiermee kunnen helpen.

[ Voor 24% gewijzigd door Spin1 op 11-12-2009 09:57 ]


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 21:34

MueR

Admin Tweakers Discord

is niet lief

PHP:
1
$c = array($id);
Stiekem vind ik het niet verbazend dat je bij een max($c) enkel de eerste terugkrijgt. Met bovenstaande regel maak je namelijk een array met maar 1 waarde: $id. Dus dan kan je hoog of laag springen, je gaat er hoe dan ook maar 1 terugkrijgen.

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Je moet even (voor ons, maar ook voor jezelf) iets duidelijker zijn over wat je nou eigenlijk probeert te bereiken. Je wil een CSV-bestand importeren in een database, maar je hebt nog niet één keer verteld wat er nou eigenlijk in dat CSV-bestand staat. Natuurlijk kun je daarom niks bruikbaars vinden in Google, want er is geen magische methode om specifiek jouw CSV-bestandje in een parent-childcollectie op te slaan.

Wat je moet doen is even noteren wat er in je CSV-bestand staat, wat de relatie hiervan is en hoe je dat wil opslaan. Staat er in je CSV iets als "Home,Bakker,Software,Os", en lees je dat in een array in? Dan moet je één voor één de items op gaan vragen aan je database, en als ze bestaan het volgende item onder de bestaande opzoeken.

Loop dus één voor één door je ingelezen items heen. Je zou de opgevraagde array ook zelf multidimensionaal kunnen maken:
PHP:
1
2
3
4
5
6
7
8
$fromCSV[0]['id'] = -1;
$fromCSV[0]['page'] = "Home";
$fromCSV[1]['id'] = -1;
$fromCSV[1]['page'] = "Bakker";
$fromCSV[2]['id'] = -1;
$fromCSV[2]['page'] = "Software";
$fromCSV[3]['id'] = -1;
$fromCSV[3]['page'] = "OS";

Vervolgens loop je de hele array door, en vraag je aan de database het ID van ieder page-element van de array op, met parentid = fromCSV[current - 1]['id'] (behalve natuurlijk bij het eerste item, dat heeft standaard parentid 0). Wordt die pagina gevonden dan ken je het ID toe aan het id-element van het huidige item van de array, en wordt 'ie niet gevonden dan voeg je de hem toe aan de database, vraag je het last_insert_id op en ken je dát toe aan het id-element van het huidige item van de array. Zo vraag je telkens een element dieper op, terwijl je tegelijk je hele boom doorloopt.

[ Voor 3% gewijzigd door CodeCaster op 11-12-2009 10:36 ]

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • Spin1
  • Registratie: Maart 2009
  • Laatst online: 20-08-2024
CodeCaster schreef op vrijdag 11 december 2009 @ 10:35:
Je moet even (voor ons, maar ook voor jezelf) iets duidelijker zijn over wat je nou eigenlijk probeert te bereiken. Je wil een CSV-bestand importeren in een database, maar je hebt nog niet één keer verteld wat er nou eigenlijk in dat CSV-bestand staat. Natuurlijk kun je daarom niks bruikbaars vinden in Google, want er is geen magische methode om specifiek jouw CSV-bestandje in een parent-childcollectie op te slaan.

Wat je moet doen is even noteren wat er in je CSV-bestand staat, wat de relatie hiervan is en hoe je dat wil opslaan. Staat er in je CSV iets als "Home,Bakker,Software,Os", en lees je dat in een array in? Dan moet je één voor één de items op gaan vragen aan je database, en als ze bestaan het volgende item onder de bestaande opzoeken.

Loop dus één voor één door je ingelezen items heen. Je zou de opgevraagde array ook zelf multidimensionaal kunnen maken:
PHP:
1
2
3
4
5
6
7
8
$fromCSV[0]['id'] = -1;
$fromCSV[0]['page'] = "Home";
$fromCSV[1]['id'] = -1;
$fromCSV[1]['page'] = "Bakker";
$fromCSV[2]['id'] = -1;
$fromCSV[2]['page'] = "Software";
$fromCSV[3]['id'] = -1;
$fromCSV[3]['page'] = "OS";

Vervolgens loop je de hele array door, en vraag je aan de database het ID van ieder page-element van de array op, met parentid = fromCSV[current - 1]['id'] (behalve natuurlijk bij het eerste item, dat heeft standaard parentid 0). Wordt die pagina gevonden dan ken je het ID toe aan het id-element van het huidige item van de array, en wordt 'ie niet gevonden dan voeg je de hem toe aan de database, vraag je het last_insert_id op en ken je dát toe aan het id-element van het huidige item van de array. Zo vraag je telkens een element dieper op, terwijl je tegelijk je hele boom doorloopt.
bedankt voor de reactie,

Nog even terugkomend op jouw vraag: "wat wil je bereiken ?" en "hoe ziet jou csv eruit? ".

Als eerste: mijn csv ziet er zo uit:
"vervoersmiddelen"
"auto's"
"bmw"
"coupe"
"335i"
Maar het kan er ook uitzien als het vorige voorbeeld met bakker, os enz.

Wat ik wil bereiken is:
Bestaat de pagina vervoersmiddelen ja, bestaat auto's nee maak auto's en de volgende pagina's aan in een boom met de parent child constructie. Nu gaat het aflopen van de pagina's perfect alleen als iets niet bestaat weet ik niet hoe ik het juiste parentid moet kunnen toewijzen.

Nu heb je me daar een vrij uitgebreide uitleg over gegeven, dus ik zou daarmee wel uit de voeten moeten kunnen. d:)b

[ Voor 4% gewijzigd door Spin1 op 11-12-2009 11:24 ]


Acties:
  • 0 Henk 'm!

  • Spin1
  • Registratie: Maart 2009
  • Laatst online: 20-08-2024
code:
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
$output = array('Bestand is geimporteerd' => 0, 'Helaas, er is iets fout gegaan' => 0);
ini_set('auto_detect_line_endings',1);
$bestand = fopen('test2.csv', 'r'); 
while (($data = fgetcsv($bestand, 1000, ',')) !== FALSE) {
   $val1 = mysql_real_escape_string($data[0]);
$que = mysql_query("SELECT * FROM paginas WHERE pagina='". $val1 ."' AND parentid='". $id ."'"); 
$resultaat = mysql_fetch_array($que); 
$naam = $resultaat['pagina'];
$id = $resultaat['id'];

if ($id > 1)
$c = array($id);
foreach($c as $q) {
print $q."<br>"; 
}

  
if( $id < 1 )
{    
mysql_query("INSERT INTO `paginas` (`pagina`,`parentid`) VALUES ('{$val1}','$q')");  
} 
}
function printbreadcrumb($id) {
    $sql = "SELECT id, parentid, pagina
                FROM paginas
                WHERE id = $id";
    $result    = mysql_query($sql) or header("location: import.php");
    $row = mysql_fetch_array($result);
    if ($row['parentid']) {
        printbreadcrumb($row['parentid']); 
    }
    echo "> <a href='index.php?id=$id'>$row[pagina]</a> ";
    return;
}
printbreadcrumb($id);



Misschien wat eigenwijs, maar ik ben verder gegaan met me oude code. Nu werkt deze code goed maar laat een paar sporen achter.

Als ik importeer dan voegt hij komende pagina's ook toe dus:
Home>Auto>Onderdelen>remschijven.

Dit gaat perfect maar de pagina Auto ziet er nu zo uit:
Auto
Onderdelen
remschijven

Is er een manier om limiet op 1 te zetten ofzo bij insert. Als ik de insert uit de while lus haal gaat het ook niet perfect.

Verder nog 1 vraag kan ik met een batch commando het volgende:

Import test2.csv
Import Onderdelen.csv
enz.

En zo ja wat moet ik in de code dan aanpassen.

  • Spin1
  • Registratie: Maart 2009
  • Laatst online: 20-08-2024
De import is nu al een tijdje perfect in orde, Maar nu is er weer een probleem:

Hoe kan ik via CMD de importfile oproepen en een bestand selecteren vanaf de hard disc ?

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Google: php command line arguments, niet zo moeilijk ;)

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 22:41

Creepy

Tactical Espionage Splatterer

Wat CodeCaster zegt. We gaan er hier vanuit dat je in eerste instantie zelf probeerd je probleem op te lossen door zelf wat zaken na te kijken, op te zeken e.d. Alleen maar aangeven wat je wil en hopen dat je van ons een kant en klaar werkende oplossing krijgt is niet de bedoeling. Alleen je laatste paar posts lijken dat wel te doen. Ik ga dit topic dan ook sluiten. Ga eerst zelf even opzoek naar een oplossing. Mocht je er dan alsnog niet uitkomen dan kan je een nieuw topic openen maar geef dan in dat topic wel aan wat je zelf al hebt gezocht/gevonden en waarom dat dan niet voldeed.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney

Pagina: 1

Dit topic is gesloten.