Krijg een variabele van een DOM niet buiten een loop

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • thomasdenhaagg
  • Registratie: Juli 2013
  • Laatst online: 02-12-2021
Mijn vraag

Deze code werkt, hij haalt netjes de prijzen op.

PHP:
1
2
3
4
5
6
7
8
9
10
11
$prijs = $row['prijs'];

//link ophalen 
$html2 = file_get_html("$prijs");

//uitlezen dlink en prijs uit de class 'price' halen
foreach($html2->find('span.price')[0] as $prijs2) {
    $a= $prijs2->innertext;
    global $a;
    echo $a
}



wanneer ik buiten de loop hetvolgende oproep:
$a= $prijs2->innertext;
$item_prijs_totaal = $item_prijs_totaal + $a;

, krijg ik helemaal geen output. Hoe kan ik deze variabele gebruiken buiten de loop?


Wat ik al gevonden of geprobeerd heb
Heel google doorzocht over manieren om de variabele wel te kunnen gebruiken. Sessies, cookies, for loops; ik kom er echt niet uit

[ Voor 1% gewijzigd door RobIII op 10-11-2021 14:59 . Reden: Code geformatteerd zodat deze leesbaar is ]

Alle reacties


Acties:
  • 0 Henk 'm!

  • TheNephilim
  • Registratie: September 2005
  • Laatst online: 15:41

TheNephilim

Wtfuzzle

Waar werk je precies mee? Dat is me niet duidelijk op basis van je code. Iets van een dom-parser, maar dat ken ik eigenlijk niet in gebruik.

Acties:
  • +1 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Uh, dit moet je helemaal niet willen; globals zijn vrijwel altijd een slecht idee. Misschien is het handig even uit te leggen op een iets grotere schaal wat je probeert te doen?
TheNephilim schreef op woensdag 10 november 2021 @ 14:59:
Iets van een dom-parser, maar dat ken ik eigenlijk niet in gebruik.
https://simplehtmldom.sourceforge.io/manual.htm

[ Voor 47% gewijzigd door RobIII op 10-11-2021 15:02 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • thomasdenhaagg
  • Registratie: Juli 2013
  • Laatst online: 02-12-2021
RobIII schreef op woensdag 10 november 2021 @ 15:00:
Uh, dit moet je helemaal niet willen; globals zijn vrijwel altijd een slecht idee. Misschien is het handig even uit te leggen op een iets grotere schaal wat je probeert te doen?

[...]

https://simplehtmldom.sourceforge.io/manual.htm

Acties:
  • 0 Henk 'm!

  • thomasdenhaagg
  • Registratie: Juli 2013
  • Laatst online: 02-12-2021
RobIII schreef op woensdag 10 november 2021 @ 15:00:
Uh, dit moet je helemaal niet willen; globals zijn vrijwel altijd een slecht idee. Misschien is het handig even uit te leggen op een iets grotere schaal wat je probeert te doen?

[...]

https://simplehtmldom.sourceforge.io/manual.htm
ik probeer de prijzen van een website op te halen. dat gaat goed met de dom parser. alleen als ik het buiten de loop wil optellen bij elkaar kan ik de variabele niet meer gebruiken

ik werk overigens met : https://simplehtmldom.sourceforge.io/

[ Voor 5% gewijzigd door thomasdenhaagg op 10-11-2021 15:09 ]


Acties:
  • +1 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
thomasdenhaagg schreef op woensdag 10 november 2021 @ 15:08:
ik probeer de prijzen van een website op te halen. dat gaat goed met de dom parser. alleen als ik het buiten de loop wil optellen bij elkaar kan ik de variabele niet meer gebruiken
Daar zit je probleem. Waarom wil je dat überhaupt buiten de loop doen :?
Post ik niet net die link dan? En quote je die zelfs niet?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • rickbrg
  • Registratie: Oktober 2018
  • Laatst online: 13-06 08:47
Lees eens over de scope:
https://www.php.net/manual/en/language.variables.scope.php

[ Voor 169% gewijzigd door rickbrg op 10-11-2021 16:04 . Reden: Bedacht ]


Acties:
  • 0 Henk 'm!

  • thomasdenhaagg
  • Registratie: Juli 2013
  • Laatst online: 02-12-2021
RobIII schreef op woensdag 10 november 2021 @ 15:10:
[...]

Daar zit je probleem. Waarom wil je dat überhaupt buiten de loop doen :?


[...]

Post ik niet net die link dan? En quote je die zelfs niet?
Excuses. Ik dacht een andere link te zien.
Nu snap ik er echter nog minder van,

code:
1
2
3
4
5
6
7
8
9
10
$prijs = $row['prijs'];

//link ophalen electroworld
$html3 = file_get_html("$prijs");

//uitlezen electroworldlink en prijs uit de class 'price' halen
foreach($html3->find('span.price')[0] as $prijs3) {
$b= $prijs3->innertext;
echo $b;
$item_prijs_totaal = $b;


De eenderlaatste regel parsed wel een resultaat. De laatste regel laat helemaal niets zien als ik hem echo...

Acties:
  • 0 Henk 'm!

  • rickbrg
  • Registratie: Oktober 2018
  • Laatst online: 13-06 08:47
-

[ Voor 100% gewijzigd door rickbrg op 10-11-2021 16:04 . Reden: Heb mij bedacht... ]


Acties:
  • 0 Henk 'm!

  • Aganim
  • Registratie: Oktober 2006
  • Laatst online: 22:48

Aganim

I have a cunning plan..

Niet gerelateerd aan de vraag, maar leer jezelf aan om Engelse comments en namen te gebruiken. Scheelt je je later weer een slechte gewoonte afleren, maakt het makkelijker om hulp te vragen en het leest (naar mijn mening) een stuk prettiger als je niet twee talen door elkaar gebruikt. Immers zijn alle ingebouwde functienamen en constructies ook al in het Engels.

Mocht je dat onzin vinden, dan heeft een oud-werkgever van me nog wel ergens een ongedocumenteerd, in het Roemeens opgesteld PHP project liggen, wat volledig opnieuw opgebouwd moet worden. :+

[ Voor 3% gewijzigd door Aganim op 10-11-2021 15:23 ]


Acties:
  • 0 Henk 'm!

  • rvrbtcpt
  • Registratie: November 2000
  • Laatst online: 14-06 13:01
Misschien is het handig om wat best practices rondom het programmeren te hanteren en dan leren hoe je dat toepast in je code.
Het is alweer even geleden maar volgens mij wil je de dingen die je in de loop doet in de loop houden en die mogen weer verdwijnen als de loop gereed is. Dat heeft ook te maken met de scope van een variabele zoals in een link hierboven wordt aangegeven.
Gegevens die je buiten je loop nodig hebt zet je vanuit je loop in variabelen die je buiten je loop gedefinieerd hebt of je gebruikt een set functie op een object, wat hier misschien wat teveel van het goede is.
Mocht iemand een andere mening hebben dan is die ook welkom.

Acties:
  • 0 Henk 'm!

  • thomasdenhaagg
  • Registratie: Juli 2013
  • Laatst online: 02-12-2021
rickbrg schreef op woensdag 10 november 2021 @ 15:21:
[...]


Lijkt mij niet echt de manier om iemand wegwijs te maken in PHP. Zo wil ik zelf ook niet geholpen worden.


[...]


Heb je de hele code voor ons beschikbaar?
Gaat om dit stuk.
Wat me nu opvalt is het volgende wat het probleem dus is :
Het eerste dikgedrukte stukje weergeeft hij gewoon.
Het tweede dikgedrukte stukje niet. Wel als ik ->innertext weg laat, maar dan krijg je een resultaat van heel veel cijfers, want dan haalt ie ze allemaal op ipv de specifieke prijs.
Hoe kan ik in die tweede dikgedrukte code alsnog ->innertext toepasen?
Oh, BB kan niet in de code tag, gaat dus om de stukjes waar

echo $a;

bij staat

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
58
59
60
61
62
63
64
                            <td><?php echo $item_aantal; ?></td>
                            <td><?php echo $item_levering; ?></td>
                            <td style="text-align: right;">
                                <?php
                                // $item_prijs = getItemName ("bh_producten", $item_product_id,"prijs"); 
                        

                                                                
                                
$querytest= "SELECT * FROM bh_producten WHERE id = '$item_product_id'";
    $resulta = mysql_query($querytest);
    $row = mysql_fetch_array($resulta);
    $item_id =              $row["id"];
    $item_date =            $row["date"];
    $item_filename =        $row["filename"];
    $item_product =         stripslashes($row["product"]);
    $item_product_url =     URLstring($item_product);
    $item_prijst =          stripslashes($row["prijs_elec"]);
    $item_prijs_installatie =   stripslashes($row["prijs"]);
$item_prijs_geenelectro =   stripslashes($row["prijs_geenelec"]);

$prijselec = $row['prijs_elec'];

//link ophalen 
$html2 = file_get_html("$prijselec");

//uitlezen link en prijs uit de class 'price' halen
foreach($html2->find('span.price')[0] as $prijs2) {
$a= $prijs2->innertext;
global $a;

[h1][i][b]echo $a;[/b][/i][/h1]
}



?>

                            
                            </td>
                            
                            <?php
                            if ($stap == 1)
                            {
                                ?>
                                <td style="text-align: right;">
                                    <a href="<?php echo $domain_name; ?>order/winkelwagen.php?
                                    action=delete_product&amp;delete_product_id=<?php echo $item_product_id; ?>&amp;delete_kleur_id=<?php echo $item_kleur_id; ?>&amp;delete_maat_id=<?php echo $item_maat_id; ?>">
                                        <img src="<?php echo $domain_name; ?>pictures/button-delete.png" alt="Verwijder product" width="20" height="20" border="0">
                                    </a>
                                </td>
                                <?php
                            }
                            else
                            {
                                ?>
                                <td>&nbsp;</td>
                                <?php
                            }
                            ?>
                        </tr>
                        <?php
                        $item_prijs_totaal = $item_prijs_totaal + [h1][b][i]$prijs2->innertext;[/i][/b][/h1]
                    }

Acties:
  • +1 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 11-06 00:38

NMe

Quia Ego Sic Dico.

rickbrg schreef op woensdag 10 november 2021 @ 15:12:
Ook werk ("$prijs") niet. Ditch de quotes. Met quotes is het een string.
...behalve dat PHP in dubbele quotes ook variabelen parset. Zou ik verder ook niet doen en als ik het dan wel zou doen, dan deed ik het eerder met brackets er omheen (echo "{$prijs}";), maar dit werkt wel. Heeft trouwens ook een impliciete cast naar string als gevolg.
rickbrg schreef op woensdag 10 november 2021 @ 15:21:
[...]

Lijkt mij niet echt de manier om iemand wegwijs te maken in PHP. Zo wil ik zelf ook niet geholpen worden.
Hoe wil je anders iemand vertellen dat het waarschijnlijk slecht design is en hij een probleem aan het oplossen is dat geen probleem zou moeten zijn?
Heb je de hele code voor ons beschikbaar?
Asjeblieft niet, alleen relevante code is veel handiger... Niemand zit te wachten op het doornemen van honderden regels code om een probleem op te lossen dat in 10 regels past.
Je doet buiten die foreach helemaal niks met $a? Je gebruikt wel $prijs2, maar die wordt elke iteratie van die loop overschreven met een nieuwe waarde, dus je krijgt alleen de laatste prijs die je gevonden hebt uiteindelijk onderaan in je code te zien... Waarom gebruik je überhaupt een loop als je kennelijk alleen geïnteresseerd bent in de laatste waarde die je vindt?

Ontbreekt het je niet gewoon aan een stukje basiskennis? Ik denk dat je enorm veel beter geholpen bent als je nog eens goed het hoofdstukje over control structures en het hierboven genoemde stukje over scopes doorleest. Alles in je code schreeuwt dat je het stukje kennis mist dat elke uitleg die we je hier kunnen geven voor je duidelijk maakt.

[ Voor 30% gewijzigd door NMe op 10-11-2021 15:41 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Aganim
  • Registratie: Oktober 2006
  • Laatst online: 22:48

Aganim

I have a cunning plan..

$querytest= "SELECT * FROM bh_producten WHERE id = '$item_product_id'";
$resulta = mysql_query($querytest);
Oef, ik denk dat je beter even een goede, recente tutorial en PHP versie kunt pakken..

Je gebruikt geen prepared statements, wat je vatbaar maakt voor SQL injecties. En je maakt blijkbaar gebruik van een PHP versie die de mysql driver nog kent, dus dat is sowieso antieke zut. Mysql is al sinds PHP 7.0 foetsie, in plaats daarvan dien je de mysqli of PDO driver te gebruiken.

Acties:
  • 0 Henk 'm!

  • thomasdenhaagg
  • Registratie: Juli 2013
  • Laatst online: 02-12-2021
NMe schreef op woensdag 10 november 2021 @ 15:35:
[...]

...behalve dat PHP in dubbele quotes ook variabelen parset. Zou ik verder ook niet doen en als ik het dan wel zou doen, dan deed ik het eerder met brackets er omheen (echo "{$prijs}";), maar dit werkt wel. Heeft trouwens ook een impliciete cast naar string als gevolg.


[...]

Hoe wil je anders iemand vertellen dat het waarschijnlijk slecht design is en hij een probleem aan het oplossen is dat geen probleem zou moeten zijn?

[...]

Asjeblieft niet, alleen relevante code is veel handiger... Niemand zit te wachten op het doornemen van honderden regels code om een probleem op te lossen dat in 10 regels past.

[...]

Je doet buiten die foreach helemaal niks met $a? Je gebruikt wel $prijs2, maar die wordt elke iteratie van die loop overschreven met een nieuwe waarde, dus je krijgt alleen de laatste prijs die je gevonden hebt uiteindelijk onderaan in je code te zien... Waarom gebruik je überhaupt een loop als je kennelijk alleen geïnteresseerd bent in de laatste waarde die je vindt?

Ontbreekt het je niet gewoon aan een stukje basiskennis? Ik denk dat je enorm veel beter geholpen bent als je nog eens goed het hoofdstukje over control structures en het hierboven genoemde stukje over scopes doorleest. Alles in je code schreeuwt dat je het stukje kennis mist dat elke uitleg die we je hier kunnen geven voor je duidelijk maakt.
toon volledige bericht
Ik heb vroeger wat sporadisch gedaan in php, moet nu voor iemand even iets doen met de huidige site. is idd vrij oude code; ik ben niet helemaal bekend met de nieuwste php versie.

wat ik eigenlijk wil is gewoon de eerste waarde van de 'price' class ophalen van een website.
Die wil ik kunnen echo-en en vervolgens van meerdere producten dit bij elkaar optellen.

Ik was er achter gekomen dat het scrapen er van goed gaat met een dom parser. Dat doet hij dus ook wel aardig; alleen ik kan de $prijs2>innerhtml niet echoe-en in het stukje code dat t zou moeten optellen.

Acties:
  • +3 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 11-06 00:38

NMe

Quia Ego Sic Dico.

thomasdenhaagg schreef op woensdag 10 november 2021 @ 15:51:
[...]

Ik heb vroeger wat sporadisch gedaan in php, moet nu voor iemand even iets doen met de huidige site. is idd vrij oude code; ik ben niet helemaal bekend met de nieuwste php versie.
Doe die persoon een plezier en geef hem het advies dit offline te halen, het is een kwestie van tijd voordat die hele server gehackt wordt.
Ik was er achter gekomen dat het scrapen er van goed gaat met een dom parser. Dat doet hij dus ook wel aardig; alleen ik kan de $prijs2>innerhtml niet echoe-en in het stukje code dat t zou moeten optellen.
Dat is waar het advies van RobIII hierboven relevant is: je wil optellen binnen de loop en de opgetelde waarde alleen afdrukken of anderszins gebruiken buiten de loop. Stel je voor dat je een zak knikkers hebt met elk een willekeurige kleur. Je pakt nu een voor een elke knikker op, kijkt naar de kleur en doet er vervolgens niks mee. Vervolgens wil je vertellen hoeveel verschillende rode knikkers er zijn. Je hebt dat niet opgeschreven en je hebt niet in je hoofd meegeteld. Hoe ga je het dan kunnen afdrukken?

Wat je dus wil doen is binnen de loop bij elke iteratie de prijs ergens wegschrijven en optellen bij het totaal.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • thomasdenhaagg
  • Registratie: Juli 2013
  • Laatst online: 02-12-2021
NMe schreef op woensdag 10 november 2021 @ 15:58:
[...]

Doe die persoon een plezier en geef hem het advies dit offline te halen, het is een kwestie van tijd voordat die hele server gehackt wordt.


[...]

Dat is waar het advies van RobIII hierboven relevant is: je wil optellen binnen de loop en de opgetelde waarde alleen afdrukken of anderszins gebruiken buiten de loop. Stel je voor dat je een zak knikkers hebt met elk een willekeurige kleur. Je pakt nu een voor een elke knikker op, kijkt naar de kleur en doet er vervolgens niks mee. Vervolgens wil je vertellen hoeveel verschillende rode knikkers er zijn. Je hebt dat niet opgeschreven en je hebt niet in je hoofd meegeteld. Hoe ga je het dan kunnen afdrukken?

Wat je dus wil doen is binnen de loop bij elke iteratie de prijs ergens wegschrijven en optellen bij het totaal.
Klopt. Zal wat met je tips doen en zelf wat meer verdiepen.
kan je me trouwens vertellen waarom dit niets doet ? $a echo-ed hij gewoon maar de array_sum doet het niet. Wel zonder ->innertext maar dan krijg je een rare uitkomst. Hoe kan ik die $prijs2->innertext ooklaten werken in array_sum($prijs->innertext); ?

code:
1
2
3
4
5
foreach($html2->find('span.price')[0] as $prijs2) {
$a = $prijs2->innertext;
echo $a;
}
echo array_sum($a);

Acties:
  • 0 Henk 'm!

  • luukvr
  • Registratie: Juni 2011
  • Niet online
er vanuit gaande dat je loop en echos werken:

code:
1
2
3
4
5
$a = 0;
foreach($html2->find('span.price')[0] as $prijs2) {
$a = $a + $prijs2->innertext;
}
echo $a;


PS. Al heel lang geen PHP geschreven.

Acties:
  • +1 Henk 'm!

  • bwerg
  • Registratie: Januari 2009
  • Niet online

bwerg

Internettrol

De prijzen die je wil optellen zijn waar je in de loop overheen loopt? Nu doe je bij elke iteratie "$a = ...", oftewel, elke iteratie ken je een nieuwe prijs aan $a toe en vergeet je de oude waarde. Zodra je die waarde vergeet kun je hem daarna moeilijk meer optellen.

array_sum gaat niet magischerwijs bedenken welke waardes $a allemaal in het verleden heeft gehad. Die neemt de huidige waarde van $a om de som over te berekenen, en $a bevat alleen nog de laatste prijs waar je overheen hebt gelopen.

Heeft geen speciale krachten en is daar erg boos over.


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 11-06 00:38

NMe

Quia Ego Sic Dico.

thomasdenhaagg schreef op woensdag 10 november 2021 @ 16:04:
[...]

$a echo-ed hij gewoon maar de array_sum doet het niet.
$a is geen array maar een string. Dat de functie toevaliig "sum" in de naam heeft wil niet zeggen dat je er willekeurig dingen in kan stoppen he? ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • +1 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
luukvr schreef op woensdag 10 november 2021 @ 16:39:
er vanuit gaande dat je loop en echos werken:

[...]

PS. Al heel lang geen PHP geschreven.
Give a man a fish and feed him for a day. Teach a man how to fish and feed him for a lifetime - RobIII :+

We zijn hier niet héél happig op kant-en-klare, of beter: copy/paste-bare, antwoorden, precies om bovenstaande quote ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • luukvr
  • Registratie: Juni 2011
  • Niet online
RobIII schreef op woensdag 10 november 2021 @ 18:18:
[...]

Give a man a fish and feed him for a day. Teach a man how to fish and feed him for a lifetime - RobIII :+

We zijn hier niet héél happig op kant-en-klare, of beter: copy/paste-bare, antwoorden, precies om bovenstaande quote ;)
In dit geval eerder: Give a man a fish and he'll eat for one day. Teach a man to fish and he'll stink for the rest of his life.
Pagina: 1