[PHP] ob_start(), ob_end_flush() gaat niet goed in Opera

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben bezig met het maken van een PHP/MySQL-weblog en als iemand een reactie op een log van mij plaatst en op 'submit' drukt, dan is het de bedoeling dat die reactie wordt geplaatst (logisch ;)) en dat de plaatser van de reactie zijn reactie erbij ziet staan zonder dat hij de browser hoeft te refreshen.

Dat heb ik opgelost met header(location: blabla.php). Maar dat werkte niet goed in combinatie met de style-sheet-switcher die ik op mijn site gebruik en ik kreeg de welbekende 'headers already sent'-melding.

Na een tijdje zoeken naar een oplossing heb ik aan het begin van het script ob_start() en aan het eind van het script ob_end_flush() toegevoegd.

Dat werkt uitstekend in Firefox en in Internet Explorer, maar niet in Opera. Nou wordt Opera niet zo heel veel gebruikt, dus er zullen niet veel bezoekers van mijn site last van hebben, maar ikzelf gebruik wél Opera als default browser, dus ik heb er wel last van ;).

Opera blijft namelijk hangen als je op de submit-knop hebt gedrukt. De reactie wordt wel in de database geplaatst, maar de gebruiker wordt niet doorgestuurd naar de vernieuwde pagina, de pagina blijft op 'laden' staan.

Misschien iemand hier die een oplossing voor me heeft?

Acties:
  • 0 Henk 'm!

Verwijderd

Dit zou weinig met ob_start() te maken moeten hebben. Op het moment dat je een form verzendt met je browser wordt zowiezo doorverwezen naar de action van het form, dus dat hangen zou dan op dezelfde pagina moeten zijn.

Op zich kan je het ook prima oplossen door bovenin je pagina met reacties een stukje te zetten als je een form gesubmit is deze in de database gegooid wordt. Pas daarna haal je de info uit de database op, en de nieuwe reactie staat erbij

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op zaterdag 03 december 2005 @ 21:34:
Dit zou weinig met ob_start() te maken moeten hebben. Op het moment dat je een form verzendt met je browser wordt zowiezo doorverwezen naar de action van het form, dus dat hangen zou dan op dezelfde pagina moeten zijn.
Ik kon het zelf inderdaad ook niet echt voorstellen dat ob_start() gek doet in Opera, maar het zou misschien een bekende Opera-bug geweest kunnen zijn, die vaker voorkomt ofzo.

EDIT: maar het is trouwens dezelfde pagina, want action is ".$_SERVER['PHP_SELF']."
Op zich kan je het ook prima oplossen door bovenin je pagina met reacties een stukje te zetten als je een form gesubmit is deze in de database gegooid wordt. Pas daarna haal je de info uit de database op, en de nieuwe reactie staat erbij
Ik snap niet precies wat je bedoelt hiermee, bedoel je dat de plaatser van de reactie alsnog zijn browser moet refreshen? (Want dat wil ik natuurlijk niet)

P.S., kan even duren voordat ik weer terugreageer, want ik ga even eten :).

[ Voor 5% gewijzigd door Verwijderd op 03-12-2005 21:46 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Verwijderd schreef op zaterdag 03 december 2005 @ 21:40:
Ik snap niet precies wat je bedoelt hiermee, bedoel je dat de plaatser van de reactie alsnog zijn browser moet refreshen? (Want dat wil ik natuurlijk niet)

P.S., kan even duren voordat ik weer terugreageer, want ik ga even eten :).
Nee, hij bedoelt dat je gewoon je INSERT/UPDATE query bovenaan je script uitvoert, en pas daaronder alle records ophaalt die je nodig hebt. Je nieuwe/aangepaste record zit daar dan ook bij. ;)

'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!

Verwijderd

Topicstarter
-NMe- schreef op zaterdag 03 december 2005 @ 21:49:
Nee, hij bedoelt dat je gewoon je INSERT/UPDATE query bovenaan je script uitvoert, en pas daaronder alle records ophaalt die je nodig hebt. Je nieuwe/aangepaste record zit daar dan ook bij. ;)
Dat is wel een goede oplossing, bedankt :), dat ik daar zelf niet opgekomen ben :Z...

Maar toch blijf ik het raar vinden dat mijn huidige script het wel goed doet in Firefox en Internet Explorer, maar niet in Opera en dat is ook pas gebeurd sinds ik ob_start()/ob_end_flush() toegevoegd heb.

Acties:
  • 0 Henk 'm!

Verwijderd

Opera blijkt wel de Content-Location te ondersteunen ipv Location, mocht dat geen soelaas bieden dan kun je misschien nog de volgende header toepassen:

header('refresh:0;url=/map/bestand.php');

ps: Met welke versie Opera werk jij trouwens, want hier bij mij doet ie het gewoon met 'location' (Opera v8.0 Final)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op zondag 04 december 2005 @ 00:20:
Opera blijkt wel de Content-Location te ondersteunen ipv Location, mocht dat geen soelaas bieden dan kun je misschien nog de volgende header toepassen:

header('refresh:0;url=/map/bestand.php');

ps: Met welke versie Opera werk jij trouwens, want hier bij mij doet ie het gewoon met 'location' (Opera v8.0 Final)
Opera 8.5, maar ik heb ook niet beweerd dat Opera de header(location:)-functie niet ondersteunt ;). Probeer anders even een reactie te plaatsen in mijn weblog (zie huisje bij mijn naam, die reactie zal ik dan wel weer verwijderen hoor) met jouw versie van Opera, want ben eigenlijk wel benieuwd of het bij die versie wel goed werkt, want ik heb de tip van NME en Hdez nog niet toegepast.

[ Voor 10% gewijzigd door Verwijderd op 04-12-2005 00:51 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik zie dat je 2 reacties geplaatst hebt, bleef jouw Opera ook hangen of niet?

(Ik heb je reacties trouwens alweer verwijderd.)

[ Voor 26% gewijzigd door Verwijderd op 04-12-2005 01:03 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Nee inderdaad, mijn versie blijft ook hangen, vreemd :/

Overigens is de optie die Rdez aangaf wel de beste manier ;)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op zondag 04 december 2005 @ 01:03:
Nee inderdaad, mijn versie blijft ook hangen, vreemd :/

Overigens is de optie die Rdez aangaf wel de beste manier ;)
Ik vind het ook erg vreemd dat het in Firefox en Internet Explorer wel goed werkt en in Opera niet, maar ja, ik zal kijken of ik morgen tijd heb om het script te veranderen in de Hdez en NME-manier ;).

Acties:
  • 0 Henk 'm!

  • Suepahfly
  • Registratie: Juni 2001
  • Laatst online: 17-09 17:05
Of het een Opera probleem is weet ik zo niet, ik gebruik die browser bijna nooit
maar
iets in de geest van
PHP:
1
2
3
4
5
6
if($_SERVER['request_method'] == "POST"
{
      /* insert / update record */
}

/* Select records en geef pagina weer */

Zou zowiezo moeten werken zoals eerder opgemerkt door Hdez

Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
De enige irritante feature* van Opera die mij op dit gebied bekend is zijn de standaard vrij conservatieve cachingsinstellingen. Wanneer je een cookie zet en "relocate" naar dezelfde pagina dan laat Opera de pagina zien alsof het cookie er nog niet is omdat het de pagina uit zijn cache trekt (of simpelweg oordeelt dat een relocate naar het zelfde URL niet nuttig kan zijn). Het probleem uit de topicstart wordt volgens mij door dezelfde feature veroorzaakt.

Ik heb gezien de userbase van Opera nooit langer dan een half uur aan dit probleem gezeten. Wel tig verschillende cache-control headers geprobeerd maar helaas zonder succes. Als iemand hier een oplossing voor heeft ben ik zeer geïnteresseerd. (Met bij voorbaat excuses richting TS als dit als topic-kaping overkomt. Ik ben er echter van overtuigd dat het initiele probleem hierdoor veroorzaakt werd).

-----------
* "Feature" gebruik ik hier absoluut niet als een eufemisme voor een bug. Integendeel, de cachingstrategie zorgt voor zeer efficient bandbreedte-gebruik. Als programmeur zit je daar alleen niet altijd op te wachten...

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
T-MOB schreef op zondag 04 december 2005 @ 01:21:
(Met bij voorbaat excuses richting TS als dit als topic-kaping overkomt. Ik ben er echter van overtuigd dat het initiele probleem hierdoor veroorzaakt werd).

-----------
* "Feature" gebruik ik hier absoluut niet als een eufemisme voor een bug. Integendeel, de cachingstrategie zorgt voor zeer efficient bandbreedte-gebruik. Als programmeur zit je daar alleen niet altijd op te wachten...
Ik zie het zeker niet als topic-kaping, want het is mij ook al meerdere malen opgevallen dat Opera zeer slecht is in het refreshen van de pagina's, soms refresht Opera een pagina zelfs niet als je al een aantal keren op F5 hebt gedrukt en doet ie het pas wel nadat je CONTROL-F5 hebt gebruikt, maar ja, nadeel daarvan is, dat hij dan al je tabs gaat vernieuwen en dat wil je ook niet altijd. En ik denk (en dacht bij voorbaat al voor ik jouw reactie hier las), dat mijn probleem inderdaad ook enigszins met dat caching-gebeuren van Opera te maken zou kunnen hebben.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
O.k., nou, ik heb net van alles zitten proberen. Dat van Hdez en NME heb ik geprobeerd, mét de toevoeging van header(location:blabla.php) en zónder header(location:blabla.php), maar sowieso zonder ob_start(), ob_end_flush().

Mét header(location:blabla.php) blijf ik met hetzelfde probleem zitten dat Opera blijft hangen, zónder header(location:blabla.php) wordt de reactie ook wel in de database geplaatst, maar ja, de browser (ook Internet Explorer en Firefox) stuurt de bezoeker dus niet door (je krijgt een blanco pagina te zien).

Dat van designhulp.nl (header('refresh:0;url=/map/bestand.php');) heb ik ook geprobeerd, maar dat is natuurlijk ook niks, omdat dan de browser continu blijft refreshen.

Ik denk dat ik het (voorlopig) maar even opgeef, want voordat ik dit topic geplaatst heb, heb ik er ook al 3 dagen aan gezeten, ook met allerlei JavaScript-functies zitten prutsen :/ en dat werkte ook allemaal niet. En aangezien het probleem zich alleen maar in Opera voordoet, moet ik er maar mee leren leven ;). Ík gebruik dan wel Opera, maar ja, die ene andere verdwaalde Opera-gebruiker die eens in de 100 jaar langskomt én een reactie op mijn weblog wil plaatsen, die heeft dan maar eventjes pech ;).

Of iemand anders moet nog een suggestie hebben ;).

Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Verwijderd schreef op zondag 04 december 2005 @ 16:59:


Dat van designhulp.nl (header('refresh:0;url=/map/bestand.php');) heb ik ook geprobeerd, maar dat is natuurlijk ook niks, omdat dan de browser continu blijft refreshen.
Continu??? Je geeft deze header toch alleen terug als de client een POST verzoek doet. Als hij bekijkt krijgt hij deze header toch niet???

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Gomez12 schreef op zondag 04 december 2005 @ 17:11:
Continu??? Je geeft deze header toch alleen terug als de client een POST verzoek doet. Als hij bekijkt krijgt hij deze header toch niet???
:/

O.k., je hebt gelijk, ik had het inderdaad niet op de goede plek gezet, nu wel :). En nu werkt het :). Maar ik ben er al zolang mee bezig geweest, met dat ene dingetje, waardoor ik het echt allemaal niet meer zag. Maar wauw, bedankt allemaal, het werkt O+.

Edit: te vroeg gejuicht, nu werkt het weer niet in Internet Explorer :(! Maar goed, vandaag geen tijd meer om eraan verder te gaan :(.

[ Voor 14% gewijzigd door Verwijderd op 04-12-2005 17:35 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Omdat het een typische 'hack' is voor 1 browser kun je beter daarop controleren, dus bv
if(preg_match('/opera/i',$_SERVER['HTTP_USER_AGENT'])){
// opera-hack
// refresh-header
}else{
// gewone location-header
}

Als je dan 2 maandjes later je code bekijkt weet je ook gelijk waarom je met de refresh-header werkt ;)

Acties:
  • 0 Henk 'm!

  • Calamor
  • Registratie: Oktober 2004
  • Laatst online: 20:06
Verwijderd schreef op zondag 04 december 2005 @ 01:29:
[...]


Ik zie het zeker niet als topic-kaping, want het is mij ook al meerdere malen opgevallen dat Opera zeer slecht is in het refreshen van de pagina's, soms refresht Opera een pagina zelfs niet als je al een aantal keren op F5 hebt gedrukt en doet ie het pas wel nadat je CONTROL-F5 hebt gebruikt, maar ja, nadeel daarvan is, dat hij dan al je tabs gaat vernieuwen en dat wil je ook niet altijd. En ik denk (en dacht bij voorbaat al voor ik jouw reactie hier las), dat mijn probleem inderdaad ook enigszins met dat caching-gebeuren van Opera te maken zou kunnen hebben.
[offtopic]
Als het goed is heeft IE dat ook hoor. Heb het op school getest. We moesten netwerk verkeer kijken. En toen moesten we ook naar kijken wat er gebeurt met F5 en crtl+F5. Bij F5 wordt er naar gekeken of de tijd van de pagina aan maak(als het goed is) maar als het zelfde is dan wordt er uit de cash gelezen en haalt het niet alles weer opnieuw op(sneller). En bij crtl+F5 dan geef je aan dat het alles opnieuw moet opgehaalt worden.
Pagina: 1