While loops werken niet meer na update php?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Senior, Medior and Junior SAP HANA Developer

Vacature details Vakgebied: Software/IT Opleiding: Medior Werklocatie: Veldhoven Vacature ID: 12696 Introductie Our client is the world's leading provider of lithography systems for the semiconductor industry, manufacturing complex machines that are critical to the production of integrated circuits or chips. Our purpose is “unlocking the potential of people and society by pushing technology to new limits”. We do this guided by the principles “Challenge”, “Collaborate” and “Care”. Wat verwachten we van jou? SAP Certified Application Associate - SAP HANA Cloud Modeling (training and/or certification) Bachelor degree or higher Excellent understanding of SAP HANA (2.0 / Cloud), Data Modelling and writing

Bekijk vacature »

Stefan van Iwaarden

Stefan van Iwaarden

23/02/2020 14:27:26
Quote Anchor link
Ik heb pasgeleden mijn server geupdate naar php 7.2

En op geen enkele site werken de while loops nog lijkt het nu wel.
Ik denk dus dat dit aan de update ligt.

Ik heb even een phpinfo gemaakt op http://corjapin.nl/server.php

Is er iemand die hier iets geks ziet?

Hier een voorbeeld van een select query die in plaats van 4 resultaten, dus maar 1 resultaat weergeeft.
Ook zonder limit geeft hij maar 1 resultaat.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
$query
= "SELECT * FROM berichten ORDER BY id DESC LIMIT 4";
                $stmt = mysqli_query($connection, $query);
                
                while ($data = mysqli_fetch_array($stmt,MYSQLI_ASSOC))
                {

                ?>

            
                                <li class="col-md-3 col-sm-6 col-xs-12">
                                    <div class="thumbnail">
                                        <a href="page.php?id="<?php echo $data['id']; ?>"><img width="250" height="250" alt="<?php echo $data['title']; ?>" src="<?php echo $data['image']; ?>"></a>
                                        <div class="caption">
                                            <h3><a href="page.php?id="<?php echo $data['id']; ?>"><?php echo $data['title']; ?></a></h3>
                                            <p><?php echo nl2br(substr($data['message'],0,150)); ?>.....</p>
                                            <a href="page.php?id=<?php echo $data['id']; ?>" class="btn btn-link" role="button">Lees meer</a>
                                        </div>
                                    </div>                                        
                                </li>
<?php
                }
                ?>
Gewijzigd op 23/02/2020 14:32:36 door Stefan van Iwaarden
 
PHP hulp

PHP hulp

19/03/2024 03:16:58
 
Thomas van den Heuvel

Thomas van den Heuvel

23/02/2020 14:40:55
Quote Anchor link
Hmmm... mysqli_fetch_array($stmt,MYSQLI_ASSOC). Waarom niet meteen mysqli_fetch_assoc() dan? :D

Anyhow:
- weet je zeker dat er meer dan 1 resultaat is?
- heb je al wat errorlogging aangezet om te kijken of er dingen foutgaan?
- en/of heb je errorlogs geinspecteerd?
- heb je de HTML-broncode van de pagina bekeken? misschien gaat je code ergens onderuit met een foutmelding?

Met het volgende trap ik misschien een open deur in maar: er gebeurt iets onverwachts, je krijgt maar 1 resultaat terwijl dit er meerdere moeten zijn. Je zult dan eerst op onderzoek uit moeten gaan naar wat er misgaat. Hiervoor heb je informatie nodig die je meer kan vertellen over de toestand van bovenstaande code. Pas als je een oorzaak hebt kun je toe naar een oplossing.

Zo zou je in bovenstaande code heel simpel kunnen nagaan hoeveel resultaten $stmt heeft met num_rows().

Dan zou je bovenaan je code het volgende kunnen zetten:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
error_reporting(E_ALL);
ini_set('display_startup_errors', true);
ini_set('display_errors', 'stdout');
?>


Mogelijk vallen er dan nog wat andere lijken uit de kast die je ook of wellicht eerst zult moeten oplossen.

NB: mogelijk loont het ook de moeite om jezelf vertrouwd te maken met de object georienteerde schrijfwijze van mysqli. Dit scheelt je op zijn minst wat typewerk ;).
Gewijzigd op 23/02/2020 14:42:57 door Thomas van den Heuvel
 
Stefan van Iwaarden

Stefan van Iwaarden

23/02/2020 14:49:45
Quote Anchor link
Hoi Thomas,

Dank voor je reactie.

met num_rows geeft hij wel als aantal '4' weer, dus dat klopt.

De errors gaven alleen een fout op de while waar de tweede parameter stond, die heb ik weggehaald, en nu geen errors meer.
Maar dat lost het probleem niet op.

Het zit dus wel ergens in de while loop lijkt het.
 
- Ariën  -
Beheerder

- Ariën -

23/02/2020 14:53:57
Quote Anchor link
Zet eens deze code in je while?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
echo "<pre>".print_r($data,true)."</pre>";

Wat zie je dan?
 
Stefan van Iwaarden

Stefan van Iwaarden

23/02/2020 15:00:59
Quote Anchor link
Met print_r zie ik idd netjes alle 4 records verschijnen in de print_r.

Maar vreemder nog, hij geeft dan ook ineens alle 4 de records gewoon weer op de normale manier?
 
- Ariën  -
Beheerder

- Ariën -

23/02/2020 15:13:13
Quote Anchor link
Lijkt mij sterk, want print_r() geeft een array-boom aan om te debuggen, en geen kant-en-klaar formaat. Ik denk dat er wat in je code speelt wat buiten ons zicht is.
Gewijzigd op 23/02/2020 15:17:35 door - Ariën -
 
Stefan van Iwaarden

Stefan van Iwaarden

23/02/2020 15:18:09
Quote Anchor link
Dat klopt, en die array geeft hij ook weer, maar tevens de 4 records zoals ze weergegeven horen te worden.
Haal ik de print_r weer weg, dan weer maar 1 resultaat.

Maar het is ook niet alleen op deze pagina, maar alle pagina's op elke site op deze server.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

23/02/2020 15:21:55
Quote Anchor link
Zie je in de bron van je pagina ook maar één rij in plaats van vier?
 
Stefan van Iwaarden

Stefan van Iwaarden

23/02/2020 15:26:48
Quote Anchor link
In de bron zie ik wel alles staan.

Daar zag ik ook een <iframe> staan van een audioplayer, en daar liep de hele boel op vast blijkbaar.
Dit weggehaald uit het database record, en hij doet het...
 
- Ariën  -
Beheerder

- Ariën -

23/02/2020 15:31:43
Quote Anchor link
Fijn dat het opgelost is.

Uit interesse: Welke audioplayer?
Ik ben ooit een audioplayer gezien die in een playlist serieus ajax-requests in een loop uitvoerde, en alle JS-scripts ook steeds opnieuw inlaadde.
 
Thomas van den Heuvel

Thomas van den Heuvel

23/02/2020 15:34:05
Quote Anchor link
Klinkt als XSS (cross site scripting).
 
Stefan van Iwaarden

Stefan van Iwaarden

23/02/2020 15:35:07
Quote Anchor link
van soundcloud

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<iframe width="1" height="1" scrolling="no" frameborder="no" allow="autoplay" src="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/728567077&color=%23f51417&auto_play=true&hide_related=false&show_comments=true&show_user=true&show_reposts=false&show_teaser=true&visual=true"></iframe
 
- Ariën  -
Beheerder

- Ariën -

23/02/2020 16:06:52
Quote Anchor link
Er mist een > op het eind. Dan zal wel de troubles in het renderen (opbouwen) van de HTML-elementen veroorzaakt hebben. Geen XSS dus, dat is ook niet iets voor het bekende SoundCloud.
Gewijzigd op 23/02/2020 16:07:09 door - Ariën -
 
Frank Nietbelangrijk

Frank Nietbelangrijk

23/02/2020 16:36:08
Quote Anchor link
Misschien even htmlentities over de uitvoer uit de database halen?

--> Filter input en escape output.
 
Thomas van den Heuvel

Thomas van den Heuvel

24/02/2020 17:05:32
Quote Anchor link
- Ariën - op 23/02/2020 16:06:52:
Geen XSS dus, dat is ook niet iets voor het bekende SoundCloud.

Laat ik het anders verwoorden: de huidige opzet stelt XSS in staat. Het feit dat het aan een "veilige" bron refereert is niet echt relevant. Dit soort sites kunnen ook misbruikt worden voor dit soort aanvallen dus wat dat betreft zou je geen enkele externe bron zondermeer moeten vertrouwen.

Zoals @Frank aanhaalt dient je output veilig te zijn, ontdaan van mogelijke JavaScript fratsen. Dus tenzij je de auteurs van deze berichten vertrouwt en ook kunt identificeren, is het wellicht beter om een andere manier te vinden om hetzelfde te bereiken. Bijvoorbeeld door een soort van UBB-tag: [soundcloud]skelermusic/ava[/soundcloud], waarbij jouw systeem zelf de omzettingen naar iframes et cetera verzorgt, zodat de controle aan jouw kant ligt.

En zo'n aanpak heeft meteen een ander pluspunt: nu is het zo dat als iemand een sluitingshaak mist dat dan je hele site in puin ligt. Als je alle output onschadelijk maakt en deze zelf verzorgt gebeurt dat ook niet meer.
 
Yoop Overmaat

Yoop Overmaat

24/02/2020 18:12:46
Quote Anchor link
Het verhaal komt mij bekend voor, ben dit probleem in een grijs verleden al eens tegengekomen. Het probleem komt weg uit het feit dat je statische html binnen de dynamiek van een php-script probeert te mixen en dat komt niet goed want er wordt van de diverse uitkomsten slechts de eerste mogelijkheid weergegeven in jouw opzet van het verhaal.

Als je de opzet wijzigt van html naar een php echo met toevoeging van een voorafgaande while loop wordt het een handelbaarder verhaal
Gewijzigd op 24/02/2020 18:17:26 door Yoop Overmaat
 
Thomas van den Heuvel

Thomas van den Heuvel

24/02/2020 19:14:34
Quote Anchor link
Yoop Overmaat op 24/02/2020 18:12:46:
Het probleem komt weg uit het feit dat je statische html binnen de dynamiek van een php-script probeert te mixen

Nou nee, meer het feit dat je niet uit kunt gaan van een kloppende syntax. En daarbij heb je geen controle over wat dit vervolgens doet (AJAX-calls die cookies stelen et cetera).

Yoop Overmaat op 24/02/2020 18:12:46:
en dat komt niet goed want er wordt van de diverse uitkomsten slechts de eerste mogelijkheid weergegeven in jouw opzet van het verhaal.

Dit volg ik niet.

Yoop Overmaat op 24/02/2020 18:12:46:
Als je de opzet wijzigt van html naar een php echo met toevoeging van een voorafgaande while loop wordt het een handelbaarder verhaal

Dit maakt niet zoveel uit denk ik. PHP en HTML zijn en blijven onlosmakelijk met elkaar verbonden. Dit is enkel een (abstractie)laag die je hier tussenmetselt, het resultaat blijft hetzelfde. Bedoel je met bovenstaande quote het (verder) scheiden van logica en weergave? Je zult dan nog steeds een knoop moeten doorhakken over wat de content uiteindelijk mag doen. Volledige HTML weergeven? Beperkte HTML weergeven? Enkel platte tekst?

Het escapen van alle output, het beperken van de HTML-mogelijkheden of dit compleet verbieden door gebruikmaking van een surrogaat (UBB-achtige tags) gaat je waarschijnlijk een stuk verder helpen. Of een WYSIWYG-editor die je op de vingers tikt of simpelweg niets doet wanneer je deze ongeldige HTML probeert te voeren, maar dan heb je dus nog steeds het probleem van de mate van betrouwbaarheid van de bron.

Dit is een afweging die de topicstarter zal moeten maken en op grond daarvan zullen beperkingen qua output-functionaliteit opgelegd moeten worden.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.