Check levertijd systeem

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ventilatiesysteem Productontwikkelaar HBO WO Verwa

Samengevat: Zij bieden flexibele ventilatiematerialen, geluidsdempers, rookgasafvoer producten en industrieslangen. Ben jij een technisch productontwikkelaar? Heb jij ervaring met het ontwikkelen van nieuwe producten? Vaste baan: Technisch Productontwikkelaar HBO WO €3.000 - €4.000 Zij bieden een variëteit aan flexibele ventilatiematerialen, geluiddempers, rookgasafvoer producten, industrieslangen en ventilatieslangen voor de scheepsbouw. Met slimme en innovatieve materialen zorgen wij voor een gezonde en frisse leefomgeving. Deze werkgever is een organisatie die volop in ontwikkeling is met hardwerkende collega's. Dit geeft goede ontwikkelingsmogelijkheden. De branche van dit bedrijf is Techniek en Engineering. Functie: Voor de vacature als Technisch Productontwikkelaar Ede Gld HBO WO ga

Bekijk vacature »

-- R --

-- R --

29/09/2016 11:41:47
Quote Anchor link
Graag wil ik een online (check)levertijd systeem maken. We doen dit nu d.m.v. Excel. Hierin maken we elke week van iedere dag een aparte tab/sheet. Per tab (dus bijv. maandag 26 september) staan de volgende gegevens: Klantnaam, Ordernummer, Postcode, Woonplaats, Aflevertijdstip.
Momenteel kunnen klanten 1 dag voor levering bellen voor het aflevertijdstip.

Is het mogelijk om deze gegevens i.p.v. in Excel, in een database in te voeren? Vervolgens via de website d.m.v. PHP, klanten laten zoeken op postcode of ordernummer? kam iemand mij helpen met een begin of is er ergens een soort van handleiding?
Mijn engels is zeer goed en ik beschik over prima HTML en CSS kennis, redelijke SQL kennis en PHP echt alleen basics..
Gewijzigd op 29/09/2016 11:59:50 door -- R --
 
PHP hulp

PHP hulp

30/11/2024 11:13:30
 
Midas Aversteeg

Midas Aversteeg

30/09/2016 11:50:27
Quote Anchor link
Misschien kan je hier vinden wat je zoek?

https://www.phphulp.nl/php/forum/topic/zoeken-in-database-en-resultaten-tonen/42709/

lijkt me hetzelfde (heb niet het hele topic gelezen, maar is ongeveer dezelfde vraag)

of dit: https://www.phphulp.nl/php/tutorial/overig/zoeken-in-mysql-tabel/100/
Gewijzigd op 30/09/2016 11:54:23 door Midas Aversteeg
 
Michael -

Michael -

30/09/2016 14:17:51
Quote Anchor link
Natuurlijk is dit mogelijk en niet heel moeilijk te realiseren, maar er komen nog wel wat extra dingen bij kijken.
Je zou voor de klanten een afgeschermd gedeelte moeten hebben waarmee ze alleen kunnen zoeken op postcode en ordernummer (Ik zou beide doen zodat de kans van gokken of de order van een andere klant te zien krijgen kleiner wordt). Denk hierbij ook goed aan het voorkomen van SQL en XSS injecties. Veiligheid zou het belangrijkste punt zijn, want je wil nooit dat je klantgegevens op straat komen.
Als je nog niet heel veel bent met PHP zou ik aanraden om gelijk met PDO (voor de database) te beginnen ipv de mysqli functies.

Voor het invoeren van deze gegevens zou je dan moeten inloggen of je zou dit gedeelte lokaal moeten houden.
Nu wordt hopelijk de schijf elke avond geback-upt, maar vergeet dan straks ook niet je database te back-uppen. Zou zonde zijn als deze klant gegevens verloren gaan.
 
-- R --

-- R --

11/10/2016 16:20:11
Quote Anchor link
Michael - op 30/09/2016 14:17:51:
Natuurlijk is dit mogelijk en niet heel moeilijk te realiseren, maar er komen nog wel wat extra dingen bij kijken.
Je zou voor de klanten een afgeschermd gedeelte moeten hebben waarmee ze alleen kunnen zoeken op postcode en ordernummer (Ik zou beide doen zodat de kans van gokken of de order van een andere klant te zien krijgen kleiner wordt). Denk hierbij ook goed aan het voorkomen van SQL en XSS injecties. Veiligheid zou het belangrijkste punt zijn, want je wil nooit dat je klantgegevens op straat komen.
Als je nog niet heel veel bent met PHP zou ik aanraden om gelijk met PDO (voor de database) te beginnen ipv de mysqli functies.

Voor het invoeren van deze gegevens zou je dan moeten inloggen of je zou dit gedeelte lokaal moeten houden.
Nu wordt hopelijk de schijf elke avond geback-upt, maar vergeet dan straks ook niet je database te back-uppen. Zou zonde zijn als deze klant gegevens verloren gaan.


Bedankt voor je reactie. Ik ben er ondertussen mee aan de slag gegaan en ik maak gebruik van PDO. Wat ik wel vind is dat veel handleidingen en informatie verouderd is.

Momenteel heb ik een database met de gewenste kolommen. Ook is het me gelukt om connectie met de database te maken en vervolgens een bepaalde kolom vanuit de database al te laten weergeven. Zie onderstaand:
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
<?php
require_once 'db_config.php';

try
{
    $sQuery = "
        SELECT
            klantnaam
        FROM
            transport
    "
;
    
    $oStmt = $db->prepare($sQuery);
    $oStmt->execute();
    
    while($aRow = $oStmt->fetch(PDO::FETCH_ASSOC))
    {

        echo $aRow['klantnaam'].'<br />';
    }
}

catch(PDOException $e)
{

    $sMsg = '<p>
            Regelnummer: '
.$e->getLine().'<br />
            Bestand: '
.$e->getFile().'<br />
            Foutmelding: '
.$e->getMessage().'
        </p>'
;
    
    trigger_error($sMsg);
}

?>


Ik heb alleen geen idee hoe ik een zoekfunctie creëer om vervolgens op postcode of ordernummer te laten zoeken?
Ondertussen ga ik al aan de slag met een formulier voor de betreffende velden in HTML te maken en alles z.s.m. in een live omgeving te zetten zodat jullie kunnen mee kijken.
 
Michael -

Michael -

11/10/2016 16:40:24
Quote Anchor link
Met LIKE kun je zoeken in de database.
Je krijgt dan zoiets als
SELECT woord FROM database WHERE woord LIKE "%taart%"
De % geeft aan of je woorden mogen worden gezocht met iets ervoor (%woord), iets erachter (woord%) of allebei (%woord%).
De vorige query zou kunnen opleveren: appeltaart, taartmes
Er is hier genoeg over te vinden. Daarnaast heb je ook FULL TEXT search. Dit werkt met MATCH en AGAINST ipv LIKE. Allebei heeft zijn voor- en nadelen.

Toevoeging op 11/10/2016 16:44:31:

Wat voor velden heb je trouwens nu gemaakt? Het is mooi om alles gescheiden te houden zoals straatnaam, huisnummer, toevoeging. Let erop dat je de levertijd als DATETIME opslaat.
Het is ook nog mogelijk om de klantengegevens en orders in verschillende tabellen op te slaan, maar het is de vraag of dat nu een voordeel heeft.
 
-- R --

-- R --

11/10/2016 17:28:27
Quote Anchor link
Oke, dat is duidelijk! Maar ik begrijp niet hoe ik de HTML zoekvelden hier aan doe koppelen. Hier een live preview met de volgende code..
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
<?php
require_once 'db_config.php';

try
{
    $sQuery = "
        SELECT
            klantnaam
        FROM
            transport
    "
;
    
    $oStmt = $db->prepare($sQuery);
    $oStmt->execute();
    
    while($aRow = $oStmt->fetch(PDO::FETCH_ASSOC))
    {

        echo $aRow['klantnaam'].'<br />';
    }
}

catch(PDOException $e)
{

    $sMsg = '<p>
            Regelnummer: '
.$e->getLine().'<br />
            Bestand: '
.$e->getFile().'<br />
            Foutmelding: '
.$e->getMessage().'
        </p>'
;
    
    trigger_error($sMsg);
}

?>


<h2>Zoeken</h2>
<form>
<input type="search" placeholder="Postcode">
<input type="search" placeholder="Huisnummer">
<input type="submit" value="Zoeken!">
<p>Of</p>
<input type="search" placeholder="Ordernummer">
<input type="submit" value="Zoeken!">
</form>


Verder heb ik de volgende velden gemaakt:
Afbeelding
Afbeelding
DATETIME heb ik niet gebruikt omdat er een tijd tussen bijv. 10 uur en 13 uur uit komt. Geen exacte leverdatum dus.
 
Michael -

Michael -

11/10/2016 19:26:03
Quote Anchor link
In de SELECT moet je dus de LIKE opnemen samen met de $_POST waarde van de input.
Het is wat lastiger omdat je meerdere input velden hebt. Je kan 1 input veld gebruiken en in de SELECT gebruik je OR.
Voorbeeldje: (niet getest)
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
<?php
if($_SERVER['REQUEST_METHOD'] == "POST") {
    
    if(trim($_POST['ordernummer']) != "") {
        $q = trim($_POST['ordernummer']);
    }
else if(trim($_POST['postcode']) != "" && trim($_POST['huisnummer']) != "") {
        $q = trim($_POST['postcode']) . ' ' . trim($_POST['huisnummer']);
    }


    try    {
        $stmt = $db->prepare("
        SELECT
            klantnaam
        FROM
            transport
        WHERE
            (CONCAT_WS(' ',
                    IF(LENGTH(postcode), postcode, NULL),
                    IF(LENGTH(huisnummer), huisnummer, NULL)
            ) LIKE :search
            OR ordernummer LIKE :search)
        "
);

        $stmt->bindValue(':search', "%{$q}%", PDO::PARAM_STR);

        $stmt->execute();
            
            if ($stmt->rowCount() > 0) {
                $stmt->setFetchMode(PDO::FETCH_ASSOC);
                $rows = new IteratorIterator($stmt);
                
                foreach($rows as $row) {
                    echo '<p>' . $row['klantnaam'] . '</p>';
                }
            }
                
    }

    catch(PDOException $e) {
        echo $e->getMessage();
    }
}

?>

<form method="POST">
<label>Postcode</label>
<input type="text" name="postcode"><br>
<label>Huisnummer</label>
<input type="text" name="huisnummer"><br>
<button>Zoeken</button>
<hr>
<label>Ordernummer</label>
<input type="text" name="ordernummer"><br>
<button>Zoeken</button>
</form>
 
-- R --

-- R --

13/10/2016 12:43:09
Quote Anchor link
Werkt perfect!
Nu heb ik de % bij {%$q%} weggehaald dus {$q} anders laat die bij geen input of halve input, alle resultaten zien of meerdere.

Ik probeer wel bij geen ordernummer ingevuld het volgende:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
if (empty($_POST["ordernummer"])) {
        $orderErr = "Vul aub een ordernummer in";
    }

Maar dit werkt niet..

En als ze zoeken naar een ordernummer dat niet bestaat/voorkomt in de database bijv. "Er zijn geen resultaten met dit ordernummer"
Bij postcode en huisnummer idem dito.

Is het mogelijk om de output:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
echo '<p>' . $row['klantnaam'] . '</p>';

Onder het formulier te plaatsen?
 
Michael -

Michael -

13/10/2016 13:04:39
Quote Anchor link
Of je de % wel of niet gebruikt ligt eraan welke resultaten je wilt. Met % hoef je niet de volledige klantnaam in te typen of het volledige Ordernummer.
Kijk bijvoorbeeld naar dit voorbeeldje en zoek bijv op Smit, Klaassen, Jansen of 2132GV (213 komt ook voor in een Ordernummer dus dit resultaat krijg je dan ook).

Controleren op lege input doe je t makkelijkst als volgt
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
if($_SERVER['REQUEST_METHOD'] == "POST") {
    
    if(isset($_POST['ordernummer']) && trim($_POST['ordernummer']) != "") {
        // waarde is gevuld
    } else {
        // waarde is leeg
    }
}

?>


De output kan ook onder t formulier. Dan moet je t formulier verplaatsen naar boven of de code naar onderen ;-)
 
-- R --

-- R --

13/10/2016 13:46:34
Quote Anchor link
Ohja xD

Hoe voeg ik deze dan hier aan toe?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
if($_SERVER['REQUEST_METHOD'] == "POST") {
    
    if(trim($_POST['ordernummer']) != "") {
        $q = trim($_POST['ordernummer']);
    }
else if(trim($_POST['postcode']) != "" && trim($_POST['huisnummer']) != "") {
        $q = trim($_POST['postcode']) . ' ' . trim($_POST['huisnummer']);
    }

?>


Moeten ordernummer en postcode dan apart?

Onderstaand gaat namelijk mis
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php
if($_SERVER['REQUEST_METHOD'] == "POST") {
    
    if(isset($_POST['ordernummer']) && trim($_POST['ordernummer']) != "") {
        $q = trim($_POST['ordernummer']);
        }
else {
        // waarde is leeg
    }
    }
else if(trim($_POST['postcode']) != "" && trim($_POST['huisnummer']) != "") {
        $q = trim($_POST['postcode']) . ' ' . trim($_POST['huisnummer']);
    }

?>
Gewijzigd op 13/10/2016 13:48:09 door -- R --
 
Michael -

Michael -

13/10/2016 18:17:31
Quote Anchor link
Ik zal even het eerder gegeven voorbeeld gebruiken.
De foutmelding plaats je in $orderErr dus ik gebruik deze weer om te controleren of het script door moet gaan. Wil je perse 2 inputvelden houden dan? Je kunt er namelijk net zo gemakkelijk 1 doen zoals in mn eerder gegeven voorbeeld link.
Om nog even terug te komen op het gebruik van %. Als je deze helemaal niet wilt gebruiken kun je ook LIKE vervangen door =. Je wilt tenslotte geen resultaten meer die er op lijken, maar je wilt een precieze match.
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
<?php
if($_SERVER['REQUEST_METHOD'] == "POST") {
    
    if(trim($_POST['ordernummer']) != "") {
        $q = trim($_POST['ordernummer']);
    }
else if(trim($_POST['postcode']) != "" && trim($_POST['huisnummer']) != "") {
        $q = trim($_POST['postcode']) . ' ' . trim($_POST['huisnummer']);
    }
else {
        $orderErr = "Er zijn geen velden ingevuld";
    }

    
    if(!isset($orderErr)) { // Geen error.
    //if(isset($q)) { // Zou je ook nog kunnen gebruiken.


        try {
            $stmt = $db->prepare("
            SELECT
                klantnaam
            FROM
                transport
            WHERE
                (CONCAT_WS(' ',
                        IF(LENGTH(postcode), postcode, NULL),
                        IF(LENGTH(huisnummer), huisnummer, NULL)
                ) LIKE :search
                OR ordernummer LIKE :search)
            "
);

            $stmt->bindValue(':search', "%{$q}%", PDO::PARAM_STR);

            $stmt->execute();
                
                if ($stmt->rowCount() > 0) { // Er zijn meer dan 0 resultaten
                    $stmt->setFetchMode(PDO::FETCH_ASSOC);
                    $rows = new IteratorIterator($stmt);
                    
                    foreach($rows as $row) {
                        echo '<p>' . $row['klantnaam'] . '</p>';
                    }
                }
else {
                    echo 'Er zijn geen resultaten gevonden!';
                }
                    
        }

        catch(PDOException $e) {
            echo $e->getMessage();
        }
    }
}

?>
Gewijzigd op 14/10/2016 02:13:14 door Michael -
 
-- R --

-- R --

15/10/2016 10:41:37
Quote Anchor link
Oke, weer wat geleerd :)
Het werkt prima! Alleen als ik gewoon op zoeken klik dan gebeurt er niks.. Bij beide velden. Er komt dus niet "Er zijn geen velden ingevuld". ?
"Er zijn geen resultaten gevonden!" werkt toppie! :D
Inderdaad wil ik toch 2 velden omdat ik niet wil dat klanten van andere klanten, levertijden kunnen inzien. Zonder de % werkt perfect!
 
Michael -

Michael -

15/10/2016 10:55:35
Quote Anchor link
Ah dit is het klanten gedeelte. Dan zou je inderdaad beter LIKE kunnen vervangen door = en ik zou, zoals ik eerder zei, controleren op postcode EN Ordernummer ipv OF. Zo wordt het lastiger voor anderen om te gokken.

De foutmelding staat in $orderErr. Deze moet je dan nog wel ergens weergeven.

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
<?php
if($_SERVER['REQUEST_METHOD'] == "POST") {
    
    if(trim($_POST['ordernummer']) != "") {
        $q = trim($_POST['ordernummer']);
    }
else if(trim($_POST['postcode']) != "" && trim($_POST['huisnummer']) != "") {
        $q = trim($_POST['postcode']) . ' ' . trim($_POST['huisnummer']);
    }
else {
        $orderErr = "Er zijn geen velden ingevuld";
    }

    
    if(!isset($orderErr)) { // Geen error.

        try {
            $stmt = $db->prepare("
            SELECT
                klantnaam
            FROM
                transport
            WHERE
                (CONCAT_WS(' ',
                        IF(LENGTH(postcode), postcode, NULL),
                        IF(LENGTH(huisnummer), huisnummer, NULL)
                ) LIKE :search
                OR ordernummer LIKE :search)
            "
);

            $stmt->bindValue(':search', "%{$q}%", PDO::PARAM_STR);

            $stmt->execute();
                
                if ($stmt->rowCount() > 0) { // Er zijn meer dan 0 resultaten
                    $stmt->setFetchMode(PDO::FETCH_ASSOC);
                    $rows = new IteratorIterator($stmt);
                    
                    foreach($rows as $row) {
                        echo '<p>' . $row['klantnaam'] . '</p>';
                    }
                }
else {
                    echo 'Er zijn geen resultaten gevonden!';
                }
                    
        }

        catch(PDOException $e) {
            echo $e->getMessage();
        }
    }
else if(isset($orderErr)) {
        echo $orderErr;
    }
}

?>
 
-- R --

-- R --

15/10/2016 11:12:06
Quote Anchor link
Ahjaa klopt haha, niet zo slim van mij!
Nu is die af :D Dat was wat ik nodig had!
Enige wat ik nu nog hoef uit te zoeken is hoe ik via een simpel (secure) systeempje de gegevens daadwerkelijk in de database te krijgen. Ik heb dit nu via SQL import gedaan maar dat kunnen mijn collega's van de planning natuurlijk niet xD. Misschien hier nog tips voor?

Ik heb trouwens beide LIKE 's door = vervangen. Toppie
 
Michael -

Michael -

15/10/2016 11:31:52
Quote Anchor link
Inprincipe het zelfde alleen ipv SELECT gebruik je dan INSERT.
tutorial
 
-- R --

-- R --

15/10/2016 12:43:34
Quote Anchor link
Super! Ik ga me er eens in verdiepen..

Nog een vraagje. Als ik nu zoek verschijnt alleen de [klantnaam]
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
echo '<p>' . $row['klantnaam'] . '</p>';

Is het mogelijk om gegevens uit meerdere kolommen toe te voegen? Dus als output verschijnt dan bijvoorbeeld:
De bestelling met ordernummer [ordernummer] van [klantnaam] in [woonplaats] zal worden geleverd tussen [aflevertijdstip]
 
Michael -

Michael -

15/10/2016 14:11:42
Quote Anchor link
Je ziet nu in de code SELECT klantnaam FROM transport
Deze select kun je uitbreiden met je andere velden in de database.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
SELECT
    klantnaam,
    ordernummer,
    postcode,
    huisnummer,
    woonplaats,
    aflevertijdstip
FROM
    transport

Deze velden kun je nu weergeven
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
foreach($rows as $row) {
    $row = array_map("htmlspecialchars", $row); // dit voorkomt dat er code kan worden uitgevoerd of de data onjuist wordt weergegeven
    echo '<p>De bestelling met ordernummer ' . $row['ordernummer'] . ' van ' . $row['klantnaam'] . ' in ' . $row['woonplaats'] . ' zal worden geleverd tussen  ' . $row['aflevertijdstip'] . '</p>';
                }
 
-- R --

-- R --

15/10/2016 14:23:33
Quote Anchor link
Werkt helemaal top :D
Je bent hartelijk bedankt voor je hulp, en ik heb er wat van opgestoken!!
 
Michael -

Michael -

15/10/2016 15:58:58
Quote Anchor link
Graag gedaan. Daar is dit forum voor.
 
-- R --

-- R --

04/11/2016 16:00:22
Quote Anchor link
Michael - op 15/10/2016 15:58:58:
Graag gedaan. Daar is dit forum voor.


Goedemiddag Michael,

Ik heb ondertussen het systeem uitgewerkt na hoe ik hem wil hebben :)
Hartelijk dank nog!

Gr.
Gewijzigd op 04/11/2016 16:02:01 door -- R --
 
Thomas van den Heuvel

Thomas van den Heuvel

04/11/2016 16:35:16
Quote Anchor link
Michael - op 30/09/2016 14:17:51:
Als je nog niet heel veel bent met PHP zou ik aanraden om gelijk met PDO (voor de database) te beginnen ipv de mysqli functies.


offtopic: motivatie ontbreekt
 



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.