MYSQL in PHP

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Peter Brok

Peter Brok

18/01/2020 04:00:44
Quote Anchor link
Iemand een idee waarom onderstaande niet werkt? Zolang aan de voorwaarde wordt voldaan gaat het goed. Dan wordt er een cel in de tabel geel (achtergrond_vakantie)
Wanneer er niet wordt voldaan dan zou de kleur anders moeten zijn (achtergrond_weekend).
En daar gaat het fout, op zich werkt het wel maar er wordt niets gedaan met class=achtergrond_weekend. Daardoor zijn de cellen vervormd en staat de tekst niet in het midden.
Iets wat logisch is, want het > van de td wordt dan niet weergeven. Oftewel, de if else werkt wel maar wat na else staat wordt niet opgenomen tussen de td haakjes.
Misschien verwarrend, maar beter kam ik het niet omschrijven.

Dit is dus een gedeelte van een kalender (tabel), die bij bepaalde data een vlak moet kleuren (cel). Wanneer ik het vereenvoudig, door bijvoorbeeld de MYSQl eruit te halen en de IF te veranderen in ($a ==1) dan wordt er wel gekeken naar wat er achter else staat. Ik ben al uren bezig, maar zie het niet. Zeer beginnend programmeur ben ik bang. :-(



echo '<td style=" text-align:center" width="140px"';


$query2 ="SELECT begin_vakantie, eind_vakantie FROM podo_thema";
$result = $conn->query($query2);
while ($row = $result->fetch(PDO::FETCH_ASSOC)) {
$begin_vakantie = $row["begin_vakantie"];
$eind_vakantie = $row["eind_vakantie"];

$begin_vakantie = strtotime($begin_vakantie);
$begin_vakantie = $begin_vakantie - 86400;
$eind_vakantie = strtotime($eind_vakantie);



if( ($a) > $begin_vakantie && ($a-86400) < $eind_vakantie ) {echo 'class="achtergrond_vakantie">';} else {echo 'class="achtergrond_weekend">';}
}

echo '<p class="';
if( date("F", ($a)) == $maand_nu ) {echo 'podo_6';} else {echo 'podo_4';}
echo '"><a class="speciaal3" href="dag_kalender.php?id=' . $a . '">' . date("d",$a) . '</a></p>';
$a = $a+86400;
echo '</td>';
 
PHP hulp

PHP hulp

28/02/2020 20:01:30
 
- Ariën -
Beheerder

- Ariën -

18/01/2020 07:36:40
Quote Anchor link
Zou je code tussen de code-tags willen plaatsen? Dan is het beter leesbaarder. Zie ook de opmaakcodes in de Veelgestelde Vragen.

Waar komt $a vandaan? Ook raad ik aan om querie-variabelen niet te nummeren, maar om deze netjes te omschrijven. Dit maakt je code ook duidelijker.
 
Paul Balen

Paul Balen

18/01/2020 09:09:44
Quote Anchor link
Dit gaat nooit goed werken om de achtergrond kleur van je veld te kleuren....
Je eerste regel is al de td-tag en daarna ga je pas bepalen welke kleur je veld moet krijgen omdat je binnen de td tag een vergelijking uitvoert met een MySQL command. Logischer is om eerst je vergelijkingen uit te voeren en de informatie uit je MySQL in variabelen te plaatsen en aan het eind in een TD-tag de output te plaatsen. Zo voorkom je ook dat je de mist in gaat met tags openen en sluiten. Daarnaast wordt je code overzichtelijker want zoals je het nu hebt is rommelig.
Standaard opbouw wat ik altijd doe:
- include bestanden (Header , Title, scripts, metatags css links etc)
- definitie variabelen (binnenhalen formulier waarden of vaste variabelen instellen etc)
- Mysql queries uitvoeren en resultaat in variabelen zetten
- Scherm opbouw en uitvoer tonen naar scherm van variabelen/berekeningen
- Afsluiten Mysql
- Afsluiten pagina
 
Peter Brok

Peter Brok

18/01/2020 15:08:07
Quote Anchor link
- Ariën - op 18/01/2020 07:36:40:
Zou je code tussen de code-tags willen plaatsen? Dan is het beter leesbaarder. Zie ook de opmaakcodes in de Veelgestelde Vragen.

Waar komt $a vandaan? Ook raad ik aan om querie-variabelen niet te nummeren, maar om deze netjes te omschrijven. Dit maakt je code ook duidelijker.


Dank je wel, ik zal kijken hoe dat beter tussen code-tags te zetten. $a is een datum, maar is in deze niet belangrijk denk ik omdat dat allemaal goed werkt. Het gaat puur om die td die ik niet kan afsluiten met een >. Het eerste gedeelte van de IF else werkt wel, het tweede gedeelte doet hij niets mee. De website staat onder paswoord, maar je mag wel kijken. Graag.



Toevoeging op 18/01/2020 15:11:39:

Paul Balen op 18/01/2020 09:09:44:
Dit gaat nooit goed werken om de achtergrond kleur van je veld te kleuren....
Je eerste regel is al de td-tag en daarna ga je pas bepalen welke kleur je veld moet krijgen omdat je binnen de td tag een vergelijking uitvoert met een MySQL command. Logischer is om eerst je vergelijkingen uit te voeren en de informatie uit je MySQL in variabelen te plaatsen en aan het eind in een TD-tag de output te plaatsen. Zo voorkom je ook dat je de mist in gaat met tags openen en sluiten. Daarnaast wordt je code overzichtelijker want zoals je het nu hebt is rommelig.
Standaard opbouw wat ik altijd doe:
- include bestanden (Header , Title, scripts, metatags css links etc)
- definitie variabelen (binnenhalen formulier waarden of vaste variabelen instellen etc)
- Mysql queries uitvoeren en resultaat in variabelen zetten
- Scherm opbouw en uitvoer tonen naar scherm van variabelen/berekeningen
- Afsluiten Mysql
- Afsluiten pagina

Dank je wel, ik snap denk ik wat je bedoelt. Ik zal beginnen om de volgorde beter neer te zetten en variabelen aan te maken. Maar in principe werkt het wel. Ik krijg alleen die td niet afgesloten omdat hij dat > niet ziet.
 
Thomas van den Heuvel

Thomas van den Heuvel

18/01/2020 16:43:40
Quote Anchor link
Wat er precies misgaat kan ik zo snel niet zien, maar ik kan wel een aantal kanttekeningen geven bij het bovenstaande codefragment.

Zoals @Paul aangeeft kan het handig zijn om wat zaken uit elkaar te trekken. Hierbij is het zeer handig als alles "in de haak" is. Dat wil zeggen, dingen die je binnen een bepaald codeblok (een stuk code dat bij elkaar hoort qua { accolades }) start, eindig je ook daar.

Wat dat betreft kom je een beetje in een rare spagaat door een tabel-cel-tag (td) te starten buiten een while-loop en deze binnen een if-statement binnen de while-loop af te sluiten.

Daarbij, na dat if-statement eindigt ook meteen de while-loop. Levert dit alles ook een syntactisch correcte HTML-tabel op? Hoeveel resultaten heeft $query2? Heb je al eens naar de uiteindelijke broncode van de HTML gekeken? Mogelijk gaat daar iets mis. En/of ontbreken er argumenten in de query, deze heeft immers geen WHERE-clause.


Op het moment dat je HTML syntactisch (qua vorm) niet klopt dan is er geen enkele garantie (meer) dat alles ook juist wordt weergegeven op het scherm.

EDIT: oh, en tussen het width-attribuut en het class-attribuut staat volgens mij geen spatie, dus de HTML wordt zoiets als:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
width="..."class="..."

Dat gaat misschien ook niet altijd goed.

Long story short: controleer de uiteindelijk gegenereerde HTML, hier kun je uit afleiden wat er anders/beter moet.
Gewijzigd op 18/01/2020 17:00:29 door Thomas van den Heuvel
 
Paul Balen

Paul Balen

18/01/2020 17:54:29
Quote Anchor link
Je schrijfwijze is zo wie zo foutief;

echo 'class="achtergrond_vakantie">';

Beter is om het als volgt te schrijven;

echo "<td class=\"achtergrond_vakantie\">";

Wederom eerst bepalen en dan pas output naar het scherm. en niet bepalen binnen de output naar het scherm.

Maak hier een standaard regel van voor je zelf. Zoals ik al eerder vermelde.
Principe is werk in blokken:
Welke variabelen nodig, en dan welke variabelen uit te lezen / te bepalen
dan pas als alles er is uitvoer naar het scherm.

Dit houd je code overzichtelijk. Een ander punt is ook zet niet alles op een regel maar gebruik meerdere regels, bijvoorbeeld;
if($a=="begin"){
then etc....
} else {
etc....
}

Zo blijft het beter leesbaar en is het makkelijker om een fout die ontstaat terug te zoeken.
Gewijzigd op 18/01/2020 18:00:34 door Paul Balen
 
Thomas van den Heuvel

Thomas van den Heuvel

18/01/2020 18:21:51
Quote Anchor link
Actually, het zou nog eenvoudiger zijn om de logica uit de HTML te trekken:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
if (whatever) {
    $class = 'een';
}
else {
    $class = 'twee';
}


// ... andere code ...

?>
<td class="<?php echo $class; ?>">...</td>


Enkel de naam van de CSS-klasse is het echte variabele deel (het onderdeel dat inhoudelijk kan variëren), dus dat class="..." hoef je ook niet in een variabele op te nemen.

Ook is het niet nodig om (eindeloos) lappen HTML te echo'en. Je kunt op elk moment een PHP-blok opschorten en weer starten door de openings- en sluitingshaken voor PHP te gebruiken.

Statische delen hoeven niet in PHP-code of in een PHP-variabele te staan.
 
Peter Brok

Peter Brok

18/01/2020 22:25:42
Quote Anchor link
Thomas van den Heuvel op 18/01/2020 16:43:40:
Wat er precies misgaat kan ik zo snel niet zien, maar ik kan wel een aantal kanttekeningen geven bij het bovenstaande codefragment.

Zoals @Paul aangeeft kan het handig zijn om wat zaken uit elkaar te trekken. Hierbij is het zeer handig als alles "in de haak" is. Dat wil zeggen, dingen die je binnen een bepaald codeblok (een stuk code dat bij elkaar hoort qua { accolades }) start, eindig je ook daar.

Wat dat betreft kom je een beetje in een rare spagaat door een tabel-cel-tag (td) te starten buiten een while-loop en deze binnen een if-statement binnen de while-loop af te sluiten.

Daarbij, na dat if-statement eindigt ook meteen de while-loop. Levert dit alles ook een syntactisch correcte HTML-tabel op? Hoeveel resultaten heeft $query2? Heb je al eens naar de uiteindelijke broncode van de HTML gekeken? Mogelijk gaat daar iets mis. En/of ontbreken er argumenten in de query, deze heeft immers geen WHERE-clause.


Op het moment dat je HTML syntactisch (qua vorm) niet klopt dan is er geen enkele garantie (meer) dat alles ook juist wordt weergegeven op het scherm.

EDIT: oh, en tussen het width-attribuut en het class-attribuut staat volgens mij geen spatie, dus de HTML wordt zoiets als:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
width="..."class="..."

Dat gaat misschien ook niet altijd goed.

Long story short: controleer de uiteindelijk gegenereerde HTML, hier kun je uit afleiden wat er anders/beter moet.


Heb je al eens naar de uiteindelijke broncode van de HTML gekeken? Dat zou ik graag willen, maar weet niet hoe, ik werk met Microsoft Expression 4 en zet alles gelijk online om het resultaat te zien. Ik probeer dan ook de broncode in te zien met de Google Chrome browser, maar dat lukt mij niet. Wat kan ik het beste gebruiken om de broncode in te zien?
 
- Ariën -
Beheerder

- Ariën -

18/01/2020 22:35:32
Quote Anchor link
Wauw..... Microsoft Expression 4 stamt uit 2006, en is al weer 14 jaar oud. In deze periode is er een hoop veranderd aan HTML en CSS dat je beter dit programma naar het 'museum der webdesignkunsten' kan brengen ;-)

Zelf ben ik van mening dat je met het leren en typen van code in plaats van klikken en slepen (wysiwyg je site juist fijnmaziger is op te bouwen. Hierbij kan je zelf beroep doen op een aantal hulpbibiliotheken, zoals Bootstrap die je site mooi responsive kan maken voor op mobiele schermen zoals tablets en smartphones.

Zelf raad ik aan om een lokale webserver te installeren (zoals XAMPP) zodat je jouw site (ook inclusief PHP en MySQL) via het lokale adres http://localhost in je browser kan bekijken. Een goede editor is: Notepad++
Deze heeft allemaal hulpfuncties (zoals automatisch aanvullen) aan boord om een mooie site te bouwen met codes.
Gewijzigd op 18/01/2020 22:35:57 door - Ariën -
 
Peter Brok

Peter Brok

18/01/2020 22:46:01
Quote Anchor link
Ik hoor waarschijnlijk zelf ook in het 'museum der webdesignkunsten' maar heb net Note++ opgehaald, zal even wennen worden, zie ik al gauw. Ik type trouwens alle code wel zelf en gebruik niet het wysiwyg gedeelte van Expression!
XAMPP ga ik nu ook ophalen en installeren! Bedankt!

Toevoeging op 18/01/2020 23:16:28:

Thomas van den Heuvel op 18/01/2020 18:21:51:
Actually, het zou nog eenvoudiger zijn om de logica uit de HTML te trekken:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
if (whatever) {
    $class = 'een';
}
else {
    $class = 'twee';
}


// ... andere code ...

?>
<td class="<?php echo $class; ?>">...</td>


Enkel de naam van de CSS-klasse is het echte variabele deel (het onderdeel dat inhoudelijk kan variëren), dus dat class="..." hoef je ook niet in een variabele op te nemen.

Ook is het niet nodig om (eindeloos) lappen HTML te echo'en. Je kunt op elk moment een PHP-blok opschorten en weer starten door de openings- en sluitingshaken voor PHP te gebruiken.

Statische delen hoeven niet in PHP-code of in een PHP-variabele te staan.


Duidelijk, dat is ook een dilemma waar ik mee zit. Moet ik alles echo'n of de stukken php tussen de haken zetten. Misschien moet ik vanaf nu inderdaad de keuze maken voor het laatste.

Er staan nu allemaal zaken waar ik van leer en zeker zal proberen uit te voeren, maar ik zie nog niet waar het nu fout gaat met het gedeelte achter else, want dat zou volgens mij gewoon moeten werken.

Toevoeging op 18/01/2020 23:58:23:

Vanaf Curacao! Allemaal heel erg bedankt! Zal nog wel niet helemaal zijn zoals het hoort. Maar dit werkt zoals ik wil! Ik zal de variabelen nog van een duidelijke tekst voorzien. :-)

$query2 ="SELECT begin_vakantie, eind_vakantie FROM podo_thema";
$result = $conn->query($query2);
while ($row = $result->fetch(PDO::FETCH_ASSOC)) {
$begin_vakantie = $row["begin_vakantie"];
$eind_vakantie = $row["eind_vakantie"];

$begin_vakantie = strtotime($begin_vakantie);
$begin_vakantie = $begin_vakantie - 86400;
$eind_vakantie = strtotime($eind_vakantie);

if( ($a) > $begin_vakantie && ($a-86400) < $eind_vakantie ) {$v = 'achtergrond_vakantie';}
else {$v = 'achtergrond_weekend';}
}

echo '<td style=" text-align:center" width="140px" class="'.$v.'">';

echo '<p class="';
if( date("F", ($a)) == $maand_nu ) {echo 'podo_6';} else {echo 'podo_4';}
echo '"><a class="speciaal3" href="dag_kalender.php?id=' . $a . '">' . date("d",$a) . '</a></p>';

$a = $a+86400;

echo '</td>';
 
Thomas van den Heuvel

Thomas van den Heuvel

19/01/2020 00:35:16
Quote Anchor link
In alle redelijk moderne browsers kun je volgens mij de broncode van een webpagina ophoesten met de toetscombinatie Ctrl-U.

Zoals eerder aangegeven, indien de tabel niet syntactisch correct is, dus niet voldoet aan de spelregels voor de bouwstenen van een HTML-pagina of -tabel, dan is er geen enkele garantie dat alles correct visueel wordt weergegeven.

Indien er zaken visueel misgaan is het dus in eerste instantie belangrijk om na te gaan dat alle HTML correct is.
Inspecteer dus de broncode.

Ook krijgen dingen mogelijk de verkeerde CSS-classes omdat:
- je een while-loop gebruikt om de resultaten op te halen; mogelijk zijn er meerdere resultaatrijen? dan worden $begin_vakantie en $eind_vakantie (mogelijk meerdere keren) overschreven en wordt alleen de laatste waarde onthouden; ga dus na hoeveel resultaten de query oplevert
- de berekening naar timestamp mogelijk misgaat; doet ook de vraag rijzen waarom je begin_vakantie en eind_vakantie niet direct opslaat als timestamp, of wellicht beter, in het (standaard) yyyy-mm-dd hh:ii:ss formaat; daarmee kun je textuele vergelijkingen uitvoeren voor tijdsintervallen (en je kunt hier ook makkelijk verder meer rekenen door gebruik te maken van de DateTime-klasse.
Geef daarom, bij wijze van debug, de waarden van $begin_vakantie en $eind_vakantie eens weer.

Alle groen gedrukte delen dienen in principe alle hetzelfde doel: deze geven je inzicht in de "toestand" van je applicatie: waarden van variabelen, gemaakte keuzen in if-statements, aantal resultaatrijen. Deze helpen je allemaal om beter te begrijpen hoe de code keuzes maakt. En deze keuzes bepalen vervolgens hoe dingen er uitzien, dus als je ergens een keuzefout ontdekt, dan kun je deze repareren, zodat de code wel (of beter :p) doet wat jij wilt.

Debuggen is bij uitstek geschikt om beter te leren programmeren.
 



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.