[PHP] Hoe het beste mijn meldingen afhandelen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • josvane
  • Registratie: Oktober 2002
  • Laatst online: 20-09 08:23
Met het schrijven van een cms ben ik bezig. Bij het invoeren worden een aantal fout controles gedaan. Mijn vraag hoe kan ik nu het beste mijn meldingen verwerken.

Ik wil voorkomen dat bij iedere melding ik een stuk html (tabellen ed) moet gebruiken.
Daarom had ik zelf bedacht De message box te activeren en een message te defieneeren.
Als ik dit doe dan werkt alleen de laatste melding als er bij het invoeren meerdere fouten gemaakt.
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
52
if($_REQUEST['actie'] == "topmenu_atd"){
    if(empty($_POST['topmenu_name']))
        {
            $messagebox = 'on';
            $message = $lang_topmenu_no_name;
            
        }
    
    if($_POST['indetification'] && mysql_result
        (mysql_query
            ("SELECT COUNT(naam) 
                FROM $db_name 
                WHERE naam 
                LIKE '{$_POST['naam']}'"),0)) 
        {
            $messagebox = 'on';
            $message = $lang_topmenu_name_exists;
        }
    
    if($messagebox != 'on'){
        
        ## Selecting max order
            $result=mysql_query("SELECT MAX(menu_order) 
                            AS max_order 
                            FROM header_menu
                            ")or die (mysql_error());
            $row=mysql_fetch_object($result); 
            $max_ord = intval($row->max_order);
            $next_order = $max_ord + 10;
        
        ## Setting time
            $time =("".time()."");
        
        ## Data to database
            mysql_query("INSERT INTO header_menu (
                                            naam,
                                            menu_status,
                                            menu_order,
                                            datum
                                            )VALUES(
                                            '{$_POST['topmenu_name']}',
                                            '{$_POST['show_hide']}',
                                            '$next_order',
                                            '$time'
                                            )")or die(mysql_error());
        
        ## Show it, if succesful
            $messagebox = 'on';
            $message = $lang_topmenu_succesful_added;
        
        }
    }

Ik wil voorkomen dat je van laag in laag komt met de {} (ik weet niet hoe die heten)
Nou kan ik het zo afhandelen
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        if(empty($_POST['topmenu_name']))
        {
            $messagebox = 'on';
            $message = $lang_topmenu_no_name;
            
        }
        else
        {
            $result = 'ok';
        }
    if($result = 'ok'){
        if($_POST['indetification'] && mysql_result
            (mysql_query
                ("SELECT COUNT(naam) 
                    FROM $db_name 
                    WHERE naam 
                    LIKE '{$_POST['naam']}'"),0)) 
            {
                $messagebox = 'on';
                $message = $lang_topmenu_name_exists;
            }
        }


Door per controle een result ok af te geven maar ik heb het gevoel dat het ook anders.
Heeft iemand een idee welke kant ik uit moet denken

Is het ook mogelijk om op het moment dat je melding moet gaan geven je doorverwezen naar een andere pagina. Dan stopt je script toch ook.

Mijn melding afhandeling ziet er zo uit:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
if($messagebox = 'on'){
    echo("
            <table cellspacing=\"2\" cellpadding=\"2\" border=\"0\">
                <tr>
                    <td class=\"inputname\">
                    
                        $message
                    
                    </td>
                </tr>
            </table>
        ");
    }

Acties:
  • 0 Henk 'm!

  • JHS
  • Registratie: Augustus 2003
  • Laatst online: 16-09 16:02

JHS

Splitting the thaum.

Niet een string, maar een $message array aanmaken, en deze vullen door $message[] = "melding"; in te vullen. Vervolgens kan je dan bij je messagebox code door deze messages heen loopen met behulp van foreach, en zo de rijen invullen.

Overigens kan je met behulp van isset(); bekijken of er messages zijn, en heb je geen $messagebox = 'on' code nodig, zodat je die niet kan vergeten. Daarnaast doe je nu dingen als if($foo = 'bar') { }, waardoor de code ertussen altijd zal worden uitgevoerd, omdat = een waarde toewijst, en niet controleert.

Ik zou ook overwegen om een fatsoenlijk errorhandling systeem in elkaar te zetten met behulp van exceptions, dan wel trigger_error() en een custom errorhandler. Zo kan je ook de errors die PHP zelf genereerd opvangen, en ben je bovendien niet van de scope van $message afhankelijk.

Ook zou ik persoonlijk niet hele lappen HTML tussen m'n code zetten, maar als je dat doet gebruik maken van ?> HTML <? in plaats van echo. Dat levert een stuk leesbaardere code op :) .

DM!


Acties:
  • 0 Henk 'm!

  • TheRookie
  • Registratie: December 2001
  • Niet online

TheRookie

Nu met R1200RT

offtopic:
{} heten accolades

Verder ben ik het met JHS eens, wat hij met ?> html bedoeld is:
PHP:
1
2
3
4
5
6
7
8
9
10
11
if($messagebox = 'on'){
?>
            <table cellspacing="2" cellpadding="2" border="0">
                <tr>
                    <td class="inputname">
                        <?echo $message ?>
                    </td>
                </tr>
            </table>
<?
}

Acties:
  • 0 Henk 'm!

  • JHS
  • Registratie: Augustus 2003
  • Laatst online: 16-09 16:02

JHS

Splitting the thaum.

Overigens kan het nog iets korter, mits the short_open_tag aanstaat :) :

PHP:
1
2
3
<? echo $bla; ?>
/* Is hetzelfde als */
<?=$bla?>

[ Voor 61% gewijzigd door JHS op 23-04-2006 13:36 ]

DM!


Acties:
  • 0 Henk 'm!

  • Brons
  • Registratie: April 2002
  • Laatst online: 20-09 11:57

Brons

Fail!

JHS schreef op zondag 23 april 2006 @ 10:04:
Overigens kan het nog iets korter, mits the short_open_tagaanstaat :) :

PHP:
1
2
3
<? echo $bla; ?>
/* Is hetzelfde als */
<?=$bla?>
Kan ja. Maar erg onhandig als je het op meerdere verschillende webservers wil draaien. Als short tags uit staan en je hebt geen toegang tot de php.ini ben je het haasje.

Dus ik stel voor om die paar extra tekens gewoon te schrijven om een paar maanden later een search and replace te voorkomen.

Acties:
  • 0 Henk 'm!

  • JHS
  • Registratie: Augustus 2003
  • Laatst online: 16-09 16:02

JHS

Splitting the thaum.

Als je daar vanuit gaat moet je ook niet <? gebruiken, maar <?php ;) .

[ Voor 7% gewijzigd door JHS op 23-04-2006 13:38 ]

DM!


Acties:
  • 0 Henk 'm!

  • Brons
  • Registratie: April 2002
  • Laatst online: 20-09 11:57

Brons

Fail!

JHS schreef op zondag 23 april 2006 @ 13:37:
Als je daar vanuit gaat moet je ook niet <? gebruiken, maar <?php ;) .
Inderdaad. En dat is naar mijn mening ook de manier om te scripten. die extra 3 letters kunnen je veel zorgen besparen.

Acties:
  • 0 Henk 'm!

Verwijderd

En om te voorkomen dat je je straks helemaal de pleuris zoekt naar waarom het niet werkt als je straks (elders) $_POST['identification'] aanroept:
PHP:
1
if($_POST['indetification'] && mysql_result


;)

Acties:
  • 0 Henk 'm!

  • josvane
  • Registratie: Oktober 2002
  • Laatst online: 20-09 08:23
In ieder geval bedankt voor de reactie's het is mij duidelijk dat ik een andere kant uit moet met mijn scripts

Acties:
  • 0 Henk 'm!

  • josvane
  • Registratie: Oktober 2002
  • Laatst online: 20-09 08:23
Mijn script heb ik nu als volgt gemaakt.
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
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
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
<head>
    <title>Product pagina toevoegen</title><link rel="STYLESHEET" type="text/css" href="includes/cp.css">
</head>

<body leftmargin="15">
<script src="includes/cp_scripts.js" type="text/javascript"></script>

<?php 

## Verbinding maken met de DB
include("sql_connect.php");
## Config file
include("../config.php");
include("languages/lang_dutch/lang_topmenu.php");
$db_name = 'header_menu';
## Het beheer menu
include("top_menu.php");
if(isset($_REQUEST['topmenu_toevoegen'])){
?>
<form action="<?php echo("{$_SERVER['PHP_SELF']}?topmenu_atd"); ?>" method="post" enctype="multipart/form-data">
<table cellspacing="2" cellpadding="2" border="0">
<tr>
    <td class="inputname">
            <?php echo $lang_topmenu_name ?>
    </td>
    <td>
        <input type="text" name="topmenu_name" style="width:500" onFocus="setBgImageOverContact(this,'images/form/frmshadow_txtBox2-on.jpg')" onBlur="setBgImageContact(this,'images/form/frmshadow_txtBox2-off.jpg')" class="txtbox">
    </td>
</tr>
    <tr>
        <td class="inputname">
            <?php echo $lang_topmenu_show_hide?>:
        </td>
        <td class="inputname2">
            <input type="radio" name="show_hide" value="yes">ja
            <input type="radio" name="show_hide" value="no" checked>nee
        </td>
    </tr>
<tr>
    <td>
        &nbsp;
    </td>
            <td class="inputname2">
                <a href="#">[img]"images/form/btn_clear.jpg"[/img]</a>
                <input type="image" name="submit" alt="Send" src="images/form/btn_send.jpg" width="91" height="21" value="toevoegen">
            </td>
</tr>
</table>
<?php
}

if(isset($_REQUEST['topmenu_atd'])){
    if(empty($_POST['topmenu_name']))
        {
            $message[] = $lang_topmenu_no_name;
        }
    if($_POST['topmenu_name'] && mysql_result
            (mysql_query
                ("SELECT COUNT(naam) 
                    FROM $db_name 
                    WHERE naam 
                    LIKE '{$_POST['topmenu_name']}'"),0)) 
        {
            $message[] = $lang_topmenu_name_exists;
        }
    }
    if(!isset($message)){
        
        ## Selecting max order
            $result=mysql_query("SELECT MAX(menu_order) 
                            AS max_order 
                            FROM header_menu
                            ")or die (mysql_error());
            $row=mysql_fetch_object($result); 
            $max_ord = intval($row->max_order);
            $next_order = $max_ord + 10;
        
        ## Setting time
            $time =("".time()."");
        
        ## Data to database
            mysql_query("INSERT INTO header_menu (
                                            naam,
                                            menu_status,
                                            menu_order,
                                            datum
                                            )VALUES(
                                            '{$_POST['topmenu_name']}',
                                            '{$_POST['show_hide']}',
                                            '$next_order',
                                            '$time'
                                            )")or die(mysql_error());
        
        ## Show it, if succesful
            $message[] = $lang_topmenu_succesful_added;
        
        }

if (isset($message)) {
    ?>
            <table cellspacing="2" cellpadding="2" border="0">
                <tr>
                    <td class="inputname">
                    
                        <?php foreach($message as $n)
                        echo ("$n <br>");?>
                    
                    </td>
                </tr>
            </table>
        <?php
    }
?>


</body>
</html>


Nu snap ik alleen niet hoe ik er voor moet zorgen dat als je de pagina opvraagt hij niet gelijk komt met het bericht dat alles succesvol is toegevoegd.

Hij controleert natuurlijk of er geen meldingen staan. Die staan er op dat moment niet.
Kan iemand mij nogmaals op weg helpen.

Acties:
  • 0 Henk 'm!

Verwijderd

Tsja, je script zit gewoon niet handig in elkaar. Een CMS is meer een applicatie dan een simpel script. Dat vereist ook een andere aanpak. Je gebruikt nu vanalles door elkaar: Dataverwerking, output, communicatie met de database, foutmeldingen. Je script is kwetsbaar voor SQL injection. Je maakt gebruik van constructies als $lang_bla, waardoor ik meteen moet denken aan arrays. Vroeg of laat loop je tegen problemen die heel simpel voorkomen kunnen worden. Deel alles beter op. Maak desnoods een stroomschema.

Deze code is niet te onderhouden. Maar dat merk je over een tijdje vanzelf.
Pagina: 1