[PHP] Oplossing nodig voor loop probleempje

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Spin1
  • Registratie: Maart 2009
  • Laatst online: 20-08-2024
Ik heb weer eens een probleempje :P .
Een tijdje geleden heb ik een importtscript gemaakt voor het importeren van CSV bestanden dit werkte perfect. maar nu wordt het csv file op een andere manier aangeroepen en kan ik de refresh methode niet meer gebruiken.

Wat ik zelf heb geprobeerd om dit script werkend te maken is:
Een import1.php voor het file te seleteren en uit te voeren in een import2.php.
Een break in de lus zetten, dit had ook geen effect,
en een functie om de uit te voeren loop zetten dit heeft ook geen effect.

de code:
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<?php

fwrite(STDOUT, "Geef bestand op: ");
$num1 = rtrim(fgets(STDIN));
fwrite(STDOUT, $num1);

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());
$row = 1;
ini_set('auto_detect_line_endings',1);
$bestand = fopen($num1, 'r');
while (($data = fgetcsv($bestand, 1000, ',')) !== FALSE) {
   $val1 = mysql_real_escape_string($data[0]); 
   $val2 = mysql_real_escape_string($data[1]); 
       
        $que = mysql_query("SELECT * FROM paginas WHERE pagina='". $val1 ."' AND parentid='". $pagina ."'");
        $resultaat = mysql_fetch_array($que);
        $pagina = $resultaat['id'];   
        $num_rows = mysql_num_rows($que);
       
       
        if ($pagina >0)
        {
        $ids['id'] = $pagina;
        foreach($ids as $q) {
        $q."<br>";
        }
        }

       

        if ($pagina<1)
        {mysql_query("INSERT INTO `paginas` (`pagina`,`tekst`,`parentid`) VALUES ('{$val1}','{$val2}','$q')");

        function printbreadcrumb($pagina) {
    $sql = "SELECT id, parentid, pagina
                FROM paginas
                WHERE id = $pagina";
    $result    = mysql_query($sql) or header("location: import.php");
    $row = mysql_fetch_array($result);
    if ($row['parentid']) {
        printbreadcrumb($row['parentid']); 
    }
    return;
}
printbreadcrumb($pagina);
          exit(); 
          
          
        }
          
        }
    


?>


Als ik de exit() weg haal wordt alles gegooid wat niet gevonden wordt in de database in 1 keer neegezet.
Als ik het csv file handmatig selecteer op de volgende wijze:
code:
1
$bestand = fopen(test2.csv, 'r');

dan werkt het script perfect.

Is er een mogelijkheid om deze code aan te passen:
code:
1
  $result    = mysql_query($sql) or header("location: import.php");


dat hij niet de hele pagina verandert maar de while loop weer overnieuw start.
Ik heb hier een break neergezet, een functie om de while loop gezet. En naar een ander file toegelinkt. Dit allemaal zonder effect.

Zou iemand mij kunnen helpen.

[ Voor 3% gewijzigd door Spin1 op 29-12-2009 11:09 ]


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Lijkt me een kwestie van debuggen, als het eerst goed werkte. Je zegt dat er iets in de aanroep veranderd is, wat dan? Gewoon lekker echo-en en print_r-en en kijken waarom ie er nog een keer doorgaat.

Je laatste vraag: tuurlijk kan dat :) Kijk eens naar classes/functies.

Acties:
  • 0 Henk 'm!

  • Spin1
  • Registratie: Maart 2009
  • Laatst online: 20-08-2024
Cartman! schreef op dinsdag 29 december 2009 @ 11:32:
Je zegt dat er iets in de aanroep veranderd is, wat dan?
in de aanroep is dit verandert:
code:
1
$bestand = fopen(test2.csv, 'r');


naar dit:
code:
1
$bestand = fopen($num1, 'r');


zodat deze niet meer op de gewenste manier werkt (wat zeker logisch is):
code:
1
$result    = mysql_query($sql) or header("location: import.php");


Maar achter de or, zou ik een return willen plaatsen of iets dat de lus weer overnieuw begint.

Acties:
  • 0 Henk 'm!

  • doeternietoe
  • Registratie: November 2004
  • Laatst online: 12-09 23:09
Wat je eerste deel betreft: kan je het probleem iets beter isoleren? Ik snap het probleem niet helemaal en de grote lap code is niet echt behulpzaam. [code=php] gebruiken zou ook fijn zijn :).
Spin1 schreef op dinsdag 29 december 2009 @ 11:08:
Is er een mogelijkheid om deze code aan te passen:
code:
1
  $result    = mysql_query($sql) or header("location: import.php");


dat hij niet de hele pagina verandert maar de while loop weer overnieuw start.
Ik heb hier een break neergezet, een functie om de while loop gezet. En naar een ander file toegelinkt. Dit allemaal zonder effect.
Kijk eens naar een recursieve functie. Wel uitkijken dat je niet in een eeuwige loop terechtkom. Het is nog beter er voor te zorgen dat die query altijd lukt, zodat het alternatief nooit wordt uitgevoerd.

Edit: Ik denk dat ik nu ongeveer je probleem snap. Doe eens
PHP:
1
var_dump( $num1 );

vlak voor de declaratie van $bestand.

[ Voor 13% gewijzigd door doeternietoe op 29-12-2009 11:48 ]


Acties:
  • 0 Henk 'm!

  • Spin1
  • Registratie: Maart 2009
  • Laatst online: 20-08-2024
Edit: Ik denk dat ik nu ongeveer je probleem snap. Doe eens
PHP:
1
var_dump( $num1 );

vlak voor de declaratie van $bestand.
Met var_dump code krijg ik

code:
1
C:\wamp\www\test2.csvstring<21>"

[ Voor 13% gewijzigd door Spin1 op 29-12-2009 12:20 ]


Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Laatst online: 14-09 14:15
En als je gewoon:
PHP:
1
echo $num1 . " | ";
doet? Dan als ik jou voorbeeld zie hoor je: "C:\wamp\www\test2.csv | " dat eruit te krijgen. Hier gebruik je absolute paden en hiervoor niet. Daar deed je gewoon xxxxxx.csv

Acties:
  • 0 Henk 'm!

  • Spin1
  • Registratie: Maart 2009
  • Laatst online: 20-08-2024
Manuel schreef op dinsdag 29 december 2009 @ 12:41:
En als je gewoon:
PHP:
1
echo $num1 . " | ";
doet? Dan als ik jou voorbeeld zie hoor je: "C:\wamp\www\test2.csv | " dat eruit te krijgen. Hier gebruik je absolute paden en hiervoor niet. Daar deed je gewoon xxxxxx.csv
Met de code van Manuel krijg ik:
C:\wamp\www\test2.csv |
Te zien.

Maar dat is het grootste probleem volgens mij niet: volgens mij is meer het probleem dit stukje:
PHP:
1
$result    = mysql_query($sql) or header("location: import.php");


Met de header location kan hij natuurlijk niet meer de opgegeven variabele vinden, als de pagina gerefresht wordt. En bij een statische invoer wel.

[ Voor 18% gewijzigd door Spin1 op 30-12-2009 08:16 ]


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Dat is ook wel een domme constructie, zo met die header() achter de mysql_query. Doe dat eens niet. Wat probeer je daar mee te bereiken?

Ah... ik snap opeens wat je er mee probeert, je wilt de while opnieuw starten zonder de code erna uit te voeren. Daarvoor hebben ze continue uitgevonden. Alleen ben ik bang dat die niet gaat werken in zo'n recursieve functie.

[ Voor 49% gewijzigd door HuHu op 30-12-2009 11:01 ]


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Je code is ook fucking onleesbaar trouwens. Gebruik eens een nette opmaak, juiste inspringing met spaties en de [ php ] tag hier op Tweakers.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  if ($pagina < 1) {
    mysql_query ( "INSERT INTO `paginas` (`pagina`,`tekst`,`parentid`) VALUES ('{$val1}','{$val2}','$q')" );
    
    function printbreadcrumb($pagina) {
      $sql = "SELECT id, parentid, pagina FROM paginas WHERE id = {$pagina}";
      
      $result = mysql_query ( $sql ) or header ('Location: import.php');
      $row = mysql_fetch_array ( $result );
      
      if ($row ['parentid']) {
        printbreadcrumb($row['parentid']);
      }
      
      return;
    }
    printbreadcrumb ( $pagina );
    exit ();  
  }


Zie ik het nu goed dat je binnen deze if een recursieve functie printbreadcrumb declareert die printbreadcrumb heet, maar helemaal niets print? Waarom? Waarom recursief? Waarom binnen een while en een if? Wat doet het daar? Wat verwacht jij dat het zou doen?

Acties:
  • 0 Henk 'm!

  • Spin1
  • Registratie: Maart 2009
  • Laatst online: 20-08-2024
HuHu schreef op woensdag 30 december 2009 @ 10:57:
Zie ik het nu goed dat je binnen deze if een recursieve functie printbreadcrumb declareert die printbreadcrumb heet, maar helemaal niets print? Waarom? Waarom recursief? Waarom binnen een while en een if? Wat doet het daar? Wat verwacht jij dat het zou doen?
Ik had de breadcrumb functie binnen de loop geplaatst met als bedoeling:
Kan geen volledig pad maken> Voer de lus overnieuw uit door header.
En als pad in orde is laat zien.

De code werkte met een statische invoer van het csv file. Maar met een invoer via een formulier of iets dergelijks werkt het natuurlijk niet |:( 8)7 .

Ik heb daarom een paar dingen geprobeerd die ik in mijn startpost heb aangegeven.
En ik zoek daar eigenlijk een oplossing voor.

Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Laatst online: 14-09 14:15
In welke directorie staat het bestand precies? Heb vaak genoeg vragen gezien die hadden ook zo'n probleem en bleek nou stond hun file in een andere directorie. Het is gewoon kijken wat de code doet, hier en daar een echo en je hebt het probleem zo te pakken.

Acties:
  • 0 Henk 'm!

  • Spin1
  • Registratie: Maart 2009
  • Laatst online: 20-08-2024
Manuel schreef op woensdag 30 december 2009 @ 14:02:
In welke directorie staat het bestand precies? Heb vaak genoeg vragen gezien die hadden ook zo'n probleem en bleek nou stond hun file in een andere directorie. Het is gewoon kijken wat de code doet, hier en daar een echo en je hebt het probleem zo te pakken.
Het probleem is niet dat het file niet gevonden wordt. Deze wordt wel gevonden.
Maar het probleem is .
Als er een naam geïmporteerd is.
Moet de lus stoppen.
Nieuwe database gegevens ophalen.
En hetzelfde bestand weer inscannen.
net zolang totdat alle items uit het csv file geimporteerd zijn.

Acties:
  • 0 Henk 'm!

  • Spin1
  • Registratie: Maart 2009
  • Laatst online: 20-08-2024
Zou iemand misschien een functie weten waarmee ik bovenstaande voor elkaar krijg.

Acties:
  • 0 Henk 'm!

  • RedRose
  • Registratie: Juni 2001
  • Niet online

RedRose

Icebear

Spin1 schreef op dinsdag 05 januari 2010 @ 14:16:
Zou iemand misschien een functie weten waarmee ik bovenstaande voor elkaar krijg.
Ja hoor: IfNameImportedExitLoopAndGetRecordsThenScanFileAgainUntilEOF()

:P

Sundown Circus


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Spin1 schreef op dinsdag 05 januari 2010 @ 14:16:
Zou iemand misschien een functie weten waarmee ik bovenstaande voor elkaar krijg.
Wat heb je nou feitenlijk al zelf bedacht? Je geeft een lijst dingen die je wilt, en je verwacht dat daar iemand een kant en klare functie voor heeft gemaakt? Zo werkt het natuurlijk niet met programmeren.

Je zult je probleem op moeten delen in kleine sub-problemen, en die oplossen. Daarna kun je die sub-oplossingen aan elkaar knopen met standaard taal constructies.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1