[PHP] Raar probleem met aanpassen variabele

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • tomk94
  • Registratie: Mei 2010
  • Laatst online: 18-09 18:57

tomk94

Developer

Topicstarter
Hallo allemaal,

Ik heb momenteel een heel raar probleem met een stukje php.

Ik heb namelijk de volgende code:

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
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
public function generateList($startTime = false, $middleTime = false, $endTime = false, $itemsToUse = false) {
            $dutchDayNames = array('' ,'ma','di','wo','do','vr','vr','za','zo');
            if($startTime !== false) $this->startTime = $startTime;
            if($endTime !== false) $this->endTime = $endTime;
            if(($k2Items = $this->getK2Items()) == false) return false;
            $dates = array();
            $beginMonth = false;
            $showEndMonth = false;
            $endMonth = false;
            $returnHTML = '';
            $colspan = 0;
            for($time=$this->startTime;$time<=$this->endTime;$time=$time+(24 * 60 * 60)) {
                if($beginMonth == false) { $beginMonth = date('m', $time); $beginYear = date('Y', $time); }
                if(date('m', $time) != $beginMonth) { $showEndMonth = true; $endMonth = date('m', $time); $endYear = date('Y', $time); }
                $dates[] = array('day'=>date('d', $time), 'month'=>date('m', $time), 'year'=>date('Y', $time), 'time'=>$this->toCorrectTime($time));
                $colspan = $colspan + 1;
            }
            
            $returnHTML .= '<div class="availability_clearer"></div><table class="availability_table">';
            $returnHTML .= '<tr><td colspan="1">&nbsp;</td><td colspan="'.floor($colspan / 2).'" class="availability_beginMonth">'.$this->monthNames[($beginMonth/1)].' '.$beginYear.' </td>';
            if($showEndMonth) $returnHTML .= '<td colspan="'.ceil($colspan / 2).'" class="availability_endMonth">'.$this->monthNames[($endMonth/1)].' '.$endYear.'</td>';
            $returnHTML .='</tr>';
            
            $returnHTML .='<tr><td class="availability_table_title">&nbsp;</td>';
            
            foreach($dates as $date) {
                $returnHTML .= '<td>'.$dutchDayNames[(date('w', $date['time'])/1)].'<br />'.($date['day'] == date('d', $middleTime) ? '<strong>'.$date['day'].'</strong>' : $date['day'] ) . '</td>';
            }
            
            $returnHTML .= '</tr>';
            $k2Items = $this->array_sort($k2Items);
    
            foreach($k2Items as $item)  {
                if(is_array($itemsToUse) && !in_array($item->id, $itemsToUse)) {} else {
                $h2 = ($this->getCategoryName($item->catid) != 'Accommodatie') ? true : false;
                $returnHTML .= '<tr><td class="availability_table_title"><a href="'.JRoute::_(($h2 ? "index.php?option=com_k2&view=item&id=".$item->id : "index.php?option=com_availability&Itemid=66&view_id=".$item->id)).'">'.($h2 ? '<h2>' : '').$item->title.' <small>['.$this->getCategoryName($item->catid).']</small>'.($h2 ? '</h2>' : '').'</a></td>';
                foreach($dates as $date) {
                    $av = $this->getAvailability($item->id, $date['time']);
                    if($av == 'unknown' ||  $av == 'booked' && $av == 'part') {
                        $returnHTML .= '<td class="test"><img src="components/com_availability/img/'.$av.'.png" style="width: 100%;height: 100%;"></td>';
                    } else {
                        $returnHTML .= '<td class="test"><img src="components/com_availability/img/available.png" style="width: 100%;height: 100%;"></td>';
                    }
                }
                $returnHTML .= '</tr>';
                }
            }
            $returnHTML .= '</table>';
            
            return $returnHTML;
        }


Dit stukje zorgt voor een lege pagina. Ik heb error_reporting op E_ALL staan, en display_errors op 1, maar er verschijnen geen error. Als ik expres een parse error tevoorschijn tover is er wel een error. Nou ben ik er achter gekomen wat voor de witte pagina zorgt.

Dat doen namelijk regel 40 en 42 in het stukje hierboven. Deze regels zijn bijna hetzelfde. Hieronder heb ik regel 40 nog een keer herhaald:
PHP:
1
$returnHTML .= '<td class="test"><img src="components/com_availability/img/'.$av.'.png" style="width: 100%;height: 100%;"></td>';


Wanneer ik class="test" weghaal, werkt alles opeens weer. En als ik bijvoorbeeld id="test" toevoeg, werkt het ook. Maar weer niet als ik cccc="test" doe... Ik dacht dus dat php class als nieuwe klasse zag, maar aangezien ccc="test" ook niet werkt, is dat het niet.

Weet iemand waar dit anders mis kan gaan? Wie helpt me uit de brand 8)7

En owja, zo roep ik het aan:

PHP:
1
2
3
<?php 
echo $availability->generateList($beginTime, $middleTime, $endTime, $itemsToUse);
?>
.

Als ik dit weghaal werkt het ook gewoon...

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Wat je je goed moet beseffen is dat je een serverside deel hebt en een clientside deel. Wanneer je pagina "leeg blijft", kijk dan ook even naar de source (en dan bedoel ik de source in je browser, niet je php source). Zeer waarschijnlijk wordt alles dan wel gewoon opgestuurd. Je moet in dat geval je probleem niet in je php, maar in je html zoeken.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 10:43

Matis

Rubber Rocket

Misschien niet geheel irrelevant; Wat staat er in je CSS betreffende de td.test.

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • X_lawl_X
  • Registratie: September 2009
  • Laatst online: 19-09 09:07
Bekijk de source van de pagina eens.

edit: Janoz :(

[ Voor 20% gewijzigd door X_lawl_X op 11-04-2011 15:49 ]


Acties:
  • 0 Henk 'm!

  • TJHeuvel
  • Registratie: Mei 2008
  • Niet online
Wat je evt ook nog kan doen is de verloop van $returnHTML bekijken, misschien wordt hij op een gegeven moment ook wel leeg in de functie.

Freelance Unity3D developer


Acties:
  • 0 Henk 'm!

  • tomk94
  • Registratie: Mei 2010
  • Laatst online: 18-09 18:57

tomk94

Developer

Topicstarter
Bron is echt leeg volgens firefox(Cmd+U). Dus probleem ligt serverside.
CyCloneNL schreef op maandag 11 april 2011 @ 15:54:
Wat je evt ook nog kan doen is de verloop van $returnHTML bekijken, misschien wordt hij op een gegeven moment ook wel leeg in de functie.
Bedankt, ik zal alles nakijken.

Acties:
  • 0 Henk 'm!

  • chaozz
  • Registratie: Juni 2000
  • Laatst online: 29-08 01:01

chaozz

Retrofiel

Kwestie van debuggen. Die fout moet je zo gevonden hebben. Zet wat "echo's" in je bron op logische punten en bekijk het verloop.

chaozz.nl | RetroGameCouch


Acties:
  • 0 Henk 'm!

  • H3llrais3r
  • Registratie: Mei 2005
  • Laatst online: 16-09 09:12
Hmm wat mij opvalt in regel 2 is dat je 2x vr in je array stopt...

Acties:
  • 0 Henk 'm!

  • AlexAuto
  • Registratie: Februari 2001
  • Laatst online: 20-09 21:34

AlexAuto

Parttime Tweaker

Wat is de uitkomst van de code op regel 5?
code:
1
$this->getK2Items()


Regel 39 is trouwens buggy:
code:
1
if($av == 'unknown' ||  $av == 'booked' && $av == 'part') {


Een kwestie van debuggen en goede breakpoints neerzetten.

Acties:
  • 0 Henk 'm!

  • tomk94
  • Registratie: Mei 2010
  • Laatst online: 18-09 18:57

tomk94

Developer

Topicstarter
Mmm, ben erachter gekomen dat het probleem waarschijnlijk niet aan mij kant ligt maar aan die van joomla.

De laatste 3 regels zijn:

<?php
$availability->generateList($beginTime, $middleTime, $endTime, $itemsToUse);
?>

Wanneer ik hierin exit() zegt(na de generatelist), werkt het.

De verwerking gaat dus mis. Dat word nog leuk uitpluizen in joomla!....

Acties:
  • 0 Henk 'm!

  • tomk94
  • Registratie: Mei 2010
  • Laatst online: 18-09 18:57

tomk94

Developer

Topicstarter
Ben nu meer dan 1 week verder, en heb het nog steeds niet opgelost.Heb delen opnieuw geschreven maar niks gevonden.

Zijn er misschien dingen in de bovenstaande code die geen errors veroorzaken, en meteen php eruit knallen?

Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Daar kom je natuurlijk redelijk makkelijk zelf achter door spul even uit te commenten en te kijken of je dan wel output krijgt. Debuggen zul je toch echt zelf moeten doen. ;)

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

  • tomk94
  • Registratie: Mei 2010
  • Laatst online: 18-09 18:57

tomk94

Developer

Topicstarter
NMe schreef op donderdag 21 april 2011 @ 19:51:
Daar kom je natuurlijk redelijk makkelijk zelf achter door spul even uit te commenten en te kijken of je dan wel output krijgt. Debuggen zul je toch echt zelf moeten doen. ;)
Ja dat heb ik gedaan, maar dat heeft me weinig geholpen.

Of als ik de 2 returnHTML hieronder comment werkt het:
PHP:
1
2
3
4
5
if($av == 'unknown' ||  $av == 'booked' && $av == 'part') {
                        $returnHTML .= '<td class="test"><img src="components/com_availability/img/'.$av.'.png" style="width: 100%;height: 100%;"></td>';
                    } else {
                        $returnHTML .= '<td class="test"><img src="components/com_availability/img/available.png" style="width: 100%;height: 100%;"></td>';
                    }

Of als ik de volgende comment:
PHP:
1
$returnHTML .= '<tr><td class="availability_table_title"><a href="'.JRoute::_(($h2 ? "index.php?option=com_k2&view=item&id=".$item->id : "index.php?option=com_availability&Itemid=66&view_id=".$item->id)).'">'.($h2 ? '<h2>' : '').$item->title.' <small>['.$this->getCategoryName($item->catid).']</small>'.($h2 ? '</h2>' : '').'</a></td>';



Dus als ik een van de bovenste 2 comment (// ervoor) werkt het...

En laat ik in die regels nou net geen probleem zien:( Ik snap het echt niet meer. Nog effe en ik begin van 0.

Edit
Lijkt haast wel of ik over een of andere limiet heen ga want:
PHP:
1
echo '<td><img src="components/com_availability/img/'.$av.'.png" style="width: 100%;height: 100%;" class="ad" id="abcdefg"></td>';

werkt niet, en:
PHP:
1
echo '<td><img src="components/com_availability/img/'.$av.'.png" style="width: 100%;height: 100%;" class="ad"></td>';


Werkt wel:S Weet iemand of dit kan?

[ Voor 12% gewijzigd door tomk94 op 21-04-2011 20:53 ]


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
tomwebfreak schreef op donderdag 21 april 2011 @ 19:48:
Ben nu meer dan 1 week verder, en heb het nog steeds niet opgelost.
Maar je negeert ook al 10 dagen de hint van AlexAuto, die toch echt terecht op een logica fout in r39 wijst...

{signature}


Acties:
  • 0 Henk 'm!

  • skabouter
  • Registratie: Oktober 2000
  • Laatst online: 20-08 08:55

skabouter

Skabouter

Voutloos schreef op donderdag 21 april 2011 @ 21:34:
[...]
Maar je negeert ook al 10 dagen de hint van AlexAuto, die toch echt terecht op een logica fout in r39 wijst...
Die fout zorgt er alleen voor dat regel 42 ipv 40 wordt uitgevoerd of andersom, aangezien het probleem op beide regels voorkomt maakt dat dus wezenlijk geen verschil voor dit probleem.

Wat is de output aan de browser kant? Helemaal niets of onjuiste HTML? In het eerste geval kun je kijken of je error reporting/logging aan staat en of er iets in je apache logs staat.

[edit]
Code even doorgelopen en lijkt verder ok, al kan ik uiteraard niet de functie aanroepen die je doet nagaan...

[ Voor 9% gewijzigd door skabouter op 21-04-2011 22:02 ]

[ Dislect ]


Acties:
  • 0 Henk 'm!

  • tomk94
  • Registratie: Mei 2010
  • Laatst online: 18-09 18:57

tomk94

Developer

Topicstarter
skabouter schreef op donderdag 21 april 2011 @ 21:48:
[...]


Die fout zorgt er alleen voor dat regel 42 ipv 40 wordt uitgevoerd of andersom, aangezien het probleem op beide regels voorkomt maakt dat dus wezenlijk geen verschil voor dit probleem.

Wat is de output aan de browser kant? Helemaal niets of onjuiste HTML? In het eerste geval kun je kijken of je error reporting/logging aan staat en of er iets in je apache logs staat.
Error reporting staat op z'n hoogst en ik krijg dan allemaal strict errors van Joomla!, maar geen van mijn script. Het lijkt haast wel of er iets is waardoor heel PHP vastloopt... Ik ga de apache logs erbij pakken

Acties:
  • 0 Henk 'm!

  • YopY
  • Registratie: September 2003
  • Laatst online: 13-07 01:14
Doe eens een debugger eraan hangen en er regel voor regel doorheen bladeren, dan kun je precies volgen wat hij doet en (evt) wanneer hij eruit knalt.

Acties:
  • 0 Henk 'm!

  • lauwsa
  • Registratie: Juli 2010
  • Laatst online: 10-09 20:43
Eerste wat ik in je code zie:

code:
1
if($av == 'unknown' ||  $av == 'booked' && $av == 'part') {


Hoe kan $av ooit booked en part tegelijk zijn?
Maar goed dat hadden andere ook gemeld maar kan het probleem niet zijn omdat je dan wel output zou moeten krijgen.

Kijk eens voor de grap hoe ver je in de code komt, en als hij afhaakt kijk je waarom hij dat doet. je kan wel gaan raden maar dat heeft ook geen zin. Voert hij wel een gedeelte van de code uit? loopt hij niet hier vast?

code:
1
if(($k2Items = $this->getK2Items()) == false) return false;


etc etc

Acties:
  • 0 Henk 'm!

  • Oid
  • Registratie: November 2002
  • Niet online

Oid

check je error log van je webserver eens, wat zegt die? Daar kan ik vaak ook nog wel data uithalen....

Acties:
  • 0 Henk 'm!

  • Ventieldopje
  • Registratie: December 2005
  • Laatst online: 19-09 11:00

Ventieldopje

I'm not your pal, mate!

PHP:
1
2
3
4
5
6
7
<?php
public function generateList($startTime = false, $middleTime = false, $endTime = false, $itemsToUse = false) {
            $returnHTML = 'hierjouhelelangestringmetallemaalbullshit'; // en dat nog iets langer dan
            
            return $returnHTML;
        }
?>


Als je tegen een of ander limiet aan zou lopen zou je dat zo makkelijk kunnen testen ;) Bovendien kan ik je aanraden je code eens op te ruimen!

www.maartendeboer.net
1D X | 5Ds | Zeiss Milvus 25, 50, 85 f/1.4 | Zeiss Otus 55 f/1.4 | Canon 200 f/1.8 | Canon 200 f/2 | Canon 300 f/2.8


Acties:
  • 0 Henk 'm!

  • T020
  • Registratie: Juli 2007
  • Laatst online: 31-08 20:30
In deze regel staat een fout:
PHP:
1
$returnHTML .= '<tr><td class="availability_table_title"><a href="'.JRoute::_(($h2 ? "index.php?option=com_k2&view=item&id=".$item->id : "index.php?option=com_availability&Itemid=66&view_id=".$item->id)).'">'.($h2 ? '<h2>' : '').$item->title.' <small>['.$this->getCategoryName($item->catid).']</small>'.($h2 ? '</h2>' : '').'</a></td>';


view_id=".$item je gebruikt daar als ik me niet vergis een double quote terwijl de string begint met een single quote, dus vervang dit eens door view_id='.$item en kijk wat het doet.
En zoals Ventieldopje al zegt, ruim je code even op ;) Kleine foutjes zijn veel makkelijker te ontdekken wanneer je alleen al wat meer consistente indenting gebruikt.
Kijk ook eens naar de PHP functie sprintf, dat gebruik ik altijd om dit soort problemen met quotes te voorkomen

Acties:
  • 0 Henk 'm!

  • Borizz
  • Registratie: Maart 2005
  • Laatst online: 24-08 20:35
T020 schreef op maandag 25 april 2011 @ 13:33:
In deze regel staat een fout:
PHP:
1
$returnHTML .= '<tr><td class="availability_table_title"><a href="'.JRoute::_(($h2 ? "index.php?option=com_k2&view=item&id=".$item->id : "index.php?option=com_availability&Itemid=66&view_id=".$item->id)).'">'.($h2 ? '<h2>' : '').$item->title.' <small>['.$this->getCategoryName($item->catid).']</small>'.($h2 ? '</h2>' : '').'</a></td>';


view_id=".$item je gebruikt daar als ik me niet vergis een double quote terwijl de string begint met een single quote, dus vervang dit eens door view_id='.$item en kijk wat het doet.
En zoals Ventieldopje al zegt, ruim je code even op ;) Kleine foutjes zijn veel makkelijker te ontdekken wanneer je alleen al wat meer consistente indenting gebruikt.
Kijk ook eens naar de PHP functie sprintf, dat gebruik ik altijd om dit soort problemen met quotes te voorkomen
Kijk nog eens naar de syntax hilighting en de code die je zelf post. De string die wordt afgesloten begon ook met een dubbele quote. Wat je zegt is dus onzin.
Als het wel zo zou zijn, had het ook een parse error opgeleverd in PHP en zou de melding ook door PHP gerapporteerd zijn omdat de TS aangeeft error_reporting op E_ALL te hebben staan.

If I can't fix it, it ain't broken.


Acties:
  • 0 Henk 'm!

  • Wizz15
  • Registratie: Januari 2004
  • Laatst online: 26-10-2022
Thijmen schreef op zaterdag 23 april 2011 @ 23:24:
check je error log van je webserver eens, wat zegt die? Daar kan ik vaak ook nog wel data uithalen....
Ventieldopje schreef op zondag 24 april 2011 @ 22:45:
Als je tegen een of ander limiet aan zou lopen zou je dat zo makkelijk kunnen testen ;) Bovendien kan ik je aanraden je code eens op te ruimen!
Als het een limiet is, dan staat het vrijwel zeker in de error logs van je webserver. Zou de TS willen aanraden om daar even te kijken. Het is de eerste plek waar ik kijk als ik weer eens een lege pagina voor mijn kiezen krijg :)

[ Voor 36% gewijzigd door Wizz15 op 25-04-2011 14:27 ]

PSN: RikBruil | BFBC2 stats


Acties:
  • 0 Henk 'm!

  • bindsa
  • Registratie: Juli 2009
  • Niet online
Duur het laden van de pagina door de browser ook erg lang? In dat geval moet je het namelijk in een of andere loop zoeken, dat heb ik ook wel eens, i.p.v. een time-out error een white screen.

Acties:
  • 0 Henk 'm!

  • fikst
  • Registratie: Juni 2010
  • Laatst online: 12-12-2021
Ik heb ooit een vergelijkbaar probleem gehad met Joomla. Na dagen zoeken en debuggen ben ik er bij uit gekomen dat dit voorvalt wanneer je output zeer lang is, en alles achter elkaar staat, zonder newlines tussen.

Probeer eens achter elke <tr></tr> "\r\n" te echo'en.

Acties:
  • 0 Henk 'm!

  • skabouter
  • Registratie: Oktober 2000
  • Laatst online: 20-08 08:55

skabouter

Skabouter

T020 schreef op maandag 25 april 2011 @ 13:33:
In deze regel staat een fout:
PHP:
1
$returnHTML .= '<tr><td class="availability_table_title"><a href="'.JRoute::_(($h2 ? "index.php?option=com_k2&view=item&id=".$item->id : "index.php?option=com_availability&Itemid=66&view_id=".$item->id)).'">'.($h2 ? '<h2>' : '').$item->title.' <small>['.$this->getCategoryName($item->catid).']</small>'.($h2 ? '</h2>' : '').'</a></td>';


view_id=".$item je gebruikt daar als ik me niet vergis een double quote terwijl de string begint met een single quote, dus vervang dit eens door view_id='.$item en kijk wat het doet.
En zoals Ventieldopje al zegt, ruim je code even op ;) Kleine foutjes zijn veel makkelijker te ontdekken wanneer je alleen al wat meer consistente indenting gebruikt.
Kijk ook eens naar de PHP functie sprintf, dat gebruik ik altijd om dit soort problemen met quotes te voorkomen
Deze code is correct, hij gebruikt echter niet concequent " en ' voor PHP strings, maar hij eindigd het voorgaande blok met " en start een nieuw block met '. Hoewel dit niet netjes is werkt het uiteraard wel, zolang het eerste blok met een " wodt gestart en het laatste blok maar met een ' eindigd.

[ Dislect ]

Pagina: 1