Script review

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Aad B

Aad B

22/10/2016 12:15:09
Quote Anchor link
Omdat ik php gebruik voor mijn hobby (ik ben wel ICT'er maar niet in php) zou ik graag wat commentaar krijgen over de opbouw van mijn script. Ik lees wel vaak over php en html scheiden maar het loopt bij mij toch wel door elkaar. Voor het gemak heb ik ook inline css die ik er later uit wil halen. Het script haal gegevens op uit één tabel en toont dit op een web pagina. Het wordt voor mijzelf een vervanging van teletekst 722 `die vaak fout/onvolledig is. Het is wat copy-paste werk uit tutorials.

Kortom gaarne wat opmerkingen tips over de opbouw:
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
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
<?php

error_reporting(E_ALL);
ini_set('display_errors', '1');

$host = 'localhost';
$databaseUsername = 'xxxx';
$databasePassword = 'xxxx';
$database = 'vaarweginfo';
$connection = new mysqli($host, $databaseUsername, $databasePassword, $database);

if ($connection->connect_errno > 0) {
    die ('Unable to connect to database [' . $connection->connect_error . ']');
}


$sql = "SELECT DATE_FORMAT(datetime, '%d-%m-%Y') AS datetime
          FROM vaarweginfo
         LIMIT 1"
;

if (!$result = $connection->query($sql)) {
    die ('There was an error running query[' . $connection->error . ']');
}

$row = $result->fetch_array();
$datetime = $row['datetime'];

$sql = "SELECT  notice
               ,vaarweg
               ,trajectbeperking
               ,beperking
               ,onderwerp
               ,reden
               ,DATE_FORMAT(periode_van, '%d-%m-%Y') AS periode_chr
               ,extra_informatie
               ,datetime
          FROM vaarweginfo
          WHERE gebied = 'Nord-Est'
          ORDER by land, periode_van, vaarweg"
;

if (!$result = $connection->query($sql)) {
    die ('There was an error running query[' . $connection->error . ']');
}


?>


<style type="text/css">

p.sansserif {
    font-family: Arial, Helvetica, sans-serif;
    font-size:80%;
}

p.vfont   {
    font-family: verdana,arial,sans-serif ;
    font-size:75%;
}

    table.table-style-one {
        font-family: verdana,arial,sans-serif;
        font-size:11px;
        color:#333333;
        border-width: 1px;
        border-color: #3A3A3A;
        border-collapse: collapse;
    }
    table.table-style-one th {
        border-width: 1px;
        padding: 8px;
        border-style: solid;
        border-color: #3A3A3A;
        background-color: #B3B3B3;
    }
    table.table-style-one td {
        border-width: 1px;
        padding: 8px;
        border-style: solid;
        border-color: #3A3A3A;
        background-color: #ffffff;
    }
</style>


<!-- Table goes in the document BODY -->

<br>
<p class="vfont">Je ziet nu Frankrijk, VNF district: <b>Nord-Est </b> (d.d. <?php echo $datetime; ?>)</p>
<br>
<br>

<table class="table-style-one">
    <thead>
    <tr>
        <th>Bericht</th>
                <th>Vaarweg</th>
                <th>Trajectbeperking</th>
                <th>Beperking</th>
                <th>Onderwerp</th>
                <th>Startdatum</th>
                <th>Reden</th>
                <th>Extra Informatie</th>
    </tr>
    </thead>
    <tbody>

<?php
    while ($row = $result->fetch_array()) {

       echo "<tr>";
       echo "<td>" . $row['notice'] . "</td>";
       echo "<td>" . $row['vaarweg'] . "</td>";
       echo "<td>" . $row['trajectbeperking'] . "</td>";
       echo "<td>" . $row['beperking'] . "</td>";
       echo "<td>" . $row['onderwerp'] . "</td>";
       echo "<td>" . $row['reden'] . "</td>";
       echo "<td>" . $row['periode_chr'] . "</td>";
       echo "<td>" . $row['extra_informatie'] . "</td>";
       echo "</tr>";
    }


?>

    
</tbody>
</table>
 
PHP hulp

PHP hulp

26/04/2024 12:18:36
 
Pg Vincent

Pg Vincent

22/10/2016 16:30:41
Quote Anchor link
- gebruik nooit "or die()" in je script, en zeker niet als een query faalt. Als een query faalt wil je daar een nettemelding van zodat je weet dat er iets is mis gegaan, en je wilt de gebruiker laten weten wat hij nu moet doen.
lees over exceptions en ga ze gebruiken, want dat maakt het leven een stuk makkelijker.

- Ga een template-eningine gebruiken, om de HTML te scheiden van het script. Als je de logica (de code) los houdt van de presentatie dan wordt het een stuk makkelijker om te beheren. Je kunt in principe ook aparte PHP scripts gebruiken in plaats van templates, maar dan moet je wel sterk zijn in discipline om niet ook code in de templates te gaan zetten.

- zaken als display-error en error-reporting mogen wel aan staan tijdens het ontwikkelen, maar moeten echt uit als het scipt ergens online komt te staan. In die meldingen staat veel gevoelige informatie die hackers kunnen gebruiken.

Je kunt ook meteen alvast beginnen met functies te maken die taken kunnen bevatten die je waarschijnlijk meerdere keren nodig gaat hebben, zodat je een bibliotheek van veelgebruikte routines kunt aanleggen. Idealiter zet je dat in classes, maar dat gaat weer een stap verder.
 
Ivo P

Ivo P

22/10/2016 21:51:57
Quote Anchor link
ik mis wat aan de query's:

op regel 16 haal je 1 datum op uit de tabel. Welke is een verrassing. Waarschijnlijk de eerst ingevoerde?
wil je daar niet een order by bij hebben? Bijvoorbeeld om de laatste datum op te halen?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
$sql
= "SELECT DATE_FORMAT(datetime, '%d-%m-%Y') AS mijndatum
          FROM vaarweginfo
        ORDER BY datetime DESC
         LIMIT 1"
;
?>


NB: zie dat ik voor de alias niet weer datetime heb gekozen, maar mijndatum

verderop op regel 24 dus ook $row['mijndatum'] gebruiken.

NB2: "datetime" is niet de handigste naam voor een kolom, aangezien die term ook in SQL al een betekenis heeft


Vervolgens doe je nog een query op dezelfde tabel
Hier haal je alle records op voor alle datums.
Is dat wel je bedoeling? Wil je niet een bepaalde datum hebben?
 
Aad B

Aad B

22/10/2016 23:16:32
Quote Anchor link
Dank voor het commentaar,
@Vincent: Ik ga aan de slag met het vermijden van die(). Een template engine?? Geen idee wat je hiermee precies bedoelt. Hoe kan mij dat helpen?
@Ivo: Wellicht vaag maar "datetime" is voor alle records hetzelfde, het gaat hier om de verversingsdatum. Elke nacht om om 00:15 wordt de gehele tabel opnieuw gevuld. Het gaat hier om +/- 2000 records. Wordt middels een linux shell script opgehaald en met IMPORT LOAD DATA INFILE in de tabel geladen.
Ik heb voor de periode_van alias inderdaad niet weer periode_van gekozen omdat anders bij de ORDER BY verkeerd ge-orderd wordt (op deze dan zijnde een ascii gevormde alias).

Het ophalen van een kleine set van +/- 100 records vindt plaats op: WHERE gebied= (momenteel voor test nog hard gecodeerd). Hiermee worden alle records voor een bepaald gebied getoond. Misschien bouw ik nog een filter op vaarweg, naast gebied.
Gewijzigd op 22/10/2016 23:21:00 door Aad B
 
- Ariën  -
Beheerder

- Ariën -

22/10/2016 23:24:44
Quote Anchor link
Met een template-systeem kan je de view scheiden van de businesslayer in je site. Dus je clientside opmaaktaal (HTML/CSS/JS) is dan gescheiden van je PHP-code. Op Google is er een hoop over te vinden, en een hele goede library hiervoor is Twig of Smarty.
Gewijzigd op 22/10/2016 23:25:10 door - Ariën -
 
Pg Vincent

Pg Vincent

23/10/2016 10:34:01
Quote Anchor link
Quote:
Hoe kan mij dat helpen?


Met een template engine krijg je feitelijk twee bestanden; een PHP bestant dat zich alleen bezig houdt met welke data er van de browser binnenkwam en welke data er weer terug moet naar de browser, en een template die niets anders doet dan de data die terug moet naar de brower in een HTML vorm gieten.

Het script dat je postte is vanaf regel 44 feitelijk een template. Alles tot regel 44 verwerkt inkomende data en bereidt data voor om terug te worden gestuurd naar de browser, en vanaf regel 44 wordt die data in HTML vorm gegoten.

Met een template systeem kun b.v. ook alles tussen regels 44 - 80, en vanaf 122 (ik neem aan dat er nog meer HTML onder staa) in een aparte template zetten zodat je de layout van je pagina kunt hergebruiken op alle pagina's. Je krijgt dan sub-templates vor het tonen van deze tabel, en voor alle andere taken die je op je website doet. Wil je dan de vormgeving van je site iets aanpassen, dan hoef je alleen de hoof template aan te passen, in plaats van elk script afzonderlijk.

En doordat je de data verwerking niet meer in je template hebt staan kun je die ook hergebruiken voor andere pagina's, door botweg de juiste functie aan te roepen en de uitkomst door te geven aan een andere template.

Maar dit is best tricky dus als je het niet direct "ziet" dan is er niets mis met jou, je moet er gewoon even mee spelen.
 
Aad B

Aad B

23/10/2016 10:56:26
Quote Anchor link
Vincent, dank. Ik ga me erin verdiepen. Zal inderdaad niet meteen makkelijk zijn. Ariën bedankt voor de namen van de tools waarnaar ik zoeken.
Gewijzigd op 23/10/2016 10:57:57 door Aad B
 



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.