[PHP] Loop - Tekstbestand naar SQL query?

Pagina: 1
Acties:

Onderwerpen


  • sh4dow
  • Registratie: Augustus 2006
  • Laatst online: 13:10
Ik ben al een poosje aan het stoeien met een stukje code in PHP. Mijn doel is om een .txt bestand uit te lezen met op elke regel een nummer. Dit nummer wil ik gebruiken in een mssql query. Op een of andere manier werkt mijn loop in PHP niet goed. Hij toont alleen de output van het laatste nummer uit mijn txt file.

file.txt:
code:
1
2
3
0001
0002
0003


Script:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php

function getpath($nr) {

    require('sql.php');

    $query = "SELECT path, name FROM files WHERE id = '$nr'";
    $sql = mssql_query($query);
    $row = mssql_fetch_object($sql);

    return ''. $row->path.'/'. $row->name .'';
}

$tmp = file("list.txt"); 
$i=1;
foreach($tmp as &$line) {
    echo "Regel ".$i. " - ".$line." - ".getpath($line)."<br />";
$i++;
}

?>


De output die ik krijg:
code:
1
2
3
Regel 1 - 0001 - /
Regel 2 - 0002 - /
Regel 3 - 0003 - http://localhost/tmp/photo3.jpg


De output die ik graag wil hebben:
code:
1
2
3
Regel 1 - 0001 - http://localhost/tmp/photo1.jpg
Regel 2 - 0002 - http://localhost/tmp/photo2.jpg
Regel 3 - 0003 - http://localhost/tmp/photo3.jpg


Ik heb vanalles geprobeerd, while, for, foreach, next, continue zoals ik gevonden heb op php.net maar ik kom er niet uit. Ook een loop in een loop lijkt niet te werken. Het lijkt er gewoon op dat PHP de loop niet goed uitvoert, en alleen de laatste regel pakt. Weet iemand wat ik fout doe?

  • 418O2
  • Registratie: November 2001
  • Laatst online: 09:45
dump die rows eens?

Dit lijkt me een std debug verhaal.

waarom include je die sql.php in de functie en niet 1x? Ik neem aan dat je daarin de connectie opzet?

  • Thomasje
  • Registratie: Augustus 2002
  • Laatst online: 29-05-2024

Thomasje

Semacode

Je hebt het in je uitleg over mysql en je roept mssql aan? Lijkt me niet het probleem van je fout. Hoe ziet je database eruit?

  • sh4dow
  • Registratie: Augustus 2006
  • Laatst online: 13:10
require('sql.php'); bovenaan het bestand is idd netter, maar dat maakt voor de output geen verschil.

stukje db:
code:
1
2
3
4
id   path                    name
0001 http://localhost/tmp    photo1.jpg
0002 http://localhost/tmp    photo2.jpg
0003 http://localhost/tmp    photo3.jpg
Thomasje schreef op donderdag 13 november 2008 @ 15:42:
Je hebt het in je uitleg over mysql en je roept mssql aan? Lijkt me niet het probleem van je fout. Hoe ziet je database eruit?
Oh inderdaad, het gaat om MSSQL.

Met maar 1 regel in het .txt bestand gaat het wel goed maar ik wil een .txt bestand met meerdere regels in één keer verwerken. Die txt wordt namelijk gegenereerd door een softwarepakket.

[ Voor 46% gewijzigd door sh4dow op 13-11-2008 15:47 ]


  • Thomasje
  • Registratie: Augustus 2002
  • Laatst online: 29-05-2024

Thomasje

Semacode

Wat als je print_r($row) doet, wat voor info krijg je dan?

  • 418O2
  • Registratie: November 2001
  • Laatst online: 09:45
Wat geef je precies mee aan die functie ?Heb je niet toevallig een newline aan het eind van 1 en 2 staan?

dan vraag je dus WHERE id = '1\n' en dat gaat niet goed

[ Voor 21% gewijzigd door 418O2 op 13-11-2008 15:49 ]


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
sh4dow schreef op donderdag 13 november 2008 @ 15:43:
require('sql.php'); bovenaan het bestand is idd netter, maar dat maakt voor de output geen verschil.
+
Met maar 1 regel in het .txt bestand gaat het wel goed maar ik wil een .txt bestand met meerdere regels in één keer verwerken.
== meerdere malen require('sql.php'); gaat mogelijk toch fout. :z

{signature}


  • sh4dow
  • Registratie: Augustus 2006
  • Laatst online: 13:10
Met print_r($row); krijg ik ook alleen de query te zien met 0003. 0001 en 0002 slaat ie over.

require('sql.php'); staat buiten de functie nu. Geen verschil.


Edit: Opgelost! rtrim op ($line) was de oplossing. Blijkbaar toch \r\n achter elke regel.

[ Voor 24% gewijzigd door sh4dow op 13-11-2008 15:53 ]


  • 418O2
  • Registratie: November 2001
  • Laatst online: 09:45
does var_dump($nr) in je functie

Verwijderd

Check met mssql_num_rows of er daadwerkelijk een record wordt opgehaald uit de database.
Staat er überhaupt een record in de database voor id 1 en 2?

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
<?php 
require('sql.php'); 

function getpath($nr) { 
    $nr = 0+trim($nr); // force conversion to float
    $query = "SELECT path, name FROM files WHERE id = '$nr'"; 
    $sql = mssql_query($query); 
    $row = mssql_fetch_object($sql); 

    if (mssql_num_rows() > 0) {
       return ''. $row->path.'/'. $row->name .''; 
    } else {
       return "geen record gevonden";
    }
} 

$tmp = file("list.txt");  
$i=1; 
foreach($tmp as $line) { 
    echo "Regel ".$i. " - ".$line." - ".getpath($line)."<br />\n"; 
    $i++; 
} 

?>


De aanpassingen:
- "&" weg (overbodig)
- sql.php eerder aangeroepen, is slechts eenmalig nodig
- check op het voorkomen van een record
- stukje netheid: "\n" na <br />, zodat de output leesbaar wordt
- conversion of string to integer

[ Voor 4% gewijzigd door Verwijderd op 13-11-2008 16:02 ]


  • Cartman!
  • Registratie: April 2000
  • Niet online
PHP:
1
$nr = 0+trim($nr); // force conversion to float 

waarom naar float?! doe dan zoiets:
PHP:
1
$nr = (int)$nr; // force to integer


Bottomline: leer debuggen (!).

[ Voor 5% gewijzigd door Cartman! op 13-11-2008 16:09 ]


  • Raynman
  • Registratie: Augustus 2004
  • Laatst online: 11:02
Cartman! schreef op donderdag 13 november 2008 @ 16:09:
PHP:
1
$nr = 0+trim($nr); // force conversion to float 

waarom naar float?! doe dan zoiets:
PHP:
1
$nr = (int)$nr; // force to integer


Bottomline: leer debuggen (!).
Ik zou ook een cast gebruiken, dan kan dat commentaar ook wel meteen weg.

Maar het id staat nu als ik het goed begrijp ook als string in de database. Dat is vreemd, maar dan is casten misschien niet zo'n goed idee.

Nog drie dingetjes (aanmerkingen/tips los van het probleem):
• lege strings voegen nogal weinig toe (regel 11)
• $nr hoort net als de rest niet binnen de aanhalingstekens te staan
• je kunt direct bij het echoën al $i++ schrijven
(en *_fetch_object() verdient ook niet echt de voorkeur)
Pagina: 1