[OOP] Poll Zonder MySQL

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

(Junior) PHP Ontwikkelaar bij een retail bedrijf i

Bedrijfsomschrijving Ben jij een ervaren PHP ontwikkelaar met een passie voor retail en ICT? Wil jij werken in een team dat zich bezighoudt met het ontwikkelen van uitdagende applicaties voor een groot retailbedrijf in Delft? Dan zijn zij op zoek naar jou! Functieomschrijving Als PHP Ontwikkelaar werk je in een team aan de ontwikkeling van applicaties die door de gehele organisatie worden gebruikt. Je bent verantwoordelijk voor het ontwikkelen, testen en implementeren van deze applicaties. Je werkt hierbij nauw samen met andere ontwikkelaars, projectmanagers en stakeholders binnen de organisatie. Je taken bestaan onder andere uit: Ontwikkelen van nieuwe functionaliteiten en

Bekijk vacature »

No-Code Betty Blocks ontwikkelaar

Bedrijfsomschrijving Wil jij de bedrijfsprocessen van klanten revolutionair digitaliseren en optimaliseren zonder beperkt te worden door programmeertalen? Kom werken bij een snelgroeiende en professionele organisatie met een gezonde dosis humor en veel vrijheid om jezelf te ontwikkelen. Als No-Code Betty Blocks ontwikkelaar werk je vanuit ons kantoor in het hart van Nederland, je thuiswerkplek of op locatie bij de klant. We faciliteren de juiste trainingen en ondersteuning zodat je een echte Betty Blocks expert wordt. Naast het werk zijn er bij ons bijzondere events, zoals een jaarlijkse zeildag, een zomerse barbecue en een knus kerstdiner om de grillige maanden door

Bekijk vacature »

Lead Webdeveloper

Als Lead webdeveloper bij KUBUS ben je verantwoordelijk voor het implementatie design van requirements en de software architectuur van de webapplicatie en services van BIMcollab. In je rol als lead developer zoek je als vanzelf op een creatieve manier naar het optimum tussen benodigde implementatie-tijd, de performance van de applicatie en een snelle go-to-market van features, aansluitend bij onze geautomatiseerde test- en release train. Hierbij bewaak je in samenwerking met de andere senior ontwikkelaars in je team de architectuur van de applicatie en adviseer je de product owner over noodzakelijke refactoring om de onderhoudbaarheid van het platform te verbeteren. Ons

Bekijk vacature »

Senior Front-end developer (React)

Functie Met een ontwikkelafdeling van ruim 20 collega’s is dit zo ongeveer de helft van alle medewerkers. De software(ontwikkeling) is dan ook de drijvende kracht binnen de organisatie. Ze werken aan het verbeteren dan de bestaande, maar zeker ook nieuwe producten. De software bestaat uit verschillende (React) webapplicaties, maar ook een mobile (React native) app. Hierdoor kom je met verschillende uitdagingen in aanraking en is Mobile kennis natuurlijk mooi meegenomen. De software wordt door vele duizenden professionals dagelijks gebruikt en bevatten grote hoeveelheden data. Aan het team de uitdaging om hierin de best mogelijke gebruiksvriendelijkheid neer te zetten door gebruik

Bekijk vacature »

UX Writer (m/v/d)

UX Writer (m/v/d) Everything we do, starts with you. Together with you, we build the most human-centric fintech. We have the ambition to create the next. And - with Bertelsmann - a strong foundation to start from. Let’s make it new – for society and for yourself. Wij zijn op zoek naar een UX Writer (m/v/d) Fulltime - Op ons kantoor in Amsterdam of Heerenveen / deels vanuit huis Als UX Writer bij Riverty hou jij je bezig met onze strategie om daar te zijn waar onze gebruikers zijn en op de manier waarop zij ons nodig hebben, terwijl wij

Bekijk vacature »

E-Identity Developer met Projectleider Kwaliteiten

Functieomschrijving Voor de kamer van koophandel zijn we op zoek naar een E-Identity developer met projectleider kwaliteiten. Voor deze opdracht zoekt KVK een Informatieanalist met Technisch Projectleider en ICT developer kwaliteiten, met kennis van E-identity. We zoeken in de breedte en niet specifiek in de diepte qua skillset. Een Junior Projectmanager, een Junior Informatieanalist, een Junior Developer (full stack), een Junior Designer en een Junior ICT architect ineen, met een sterk gevoel van stakeholder management en planning vaardigheden. Door de internationale setting, én de realisatie van ontsluiting van en naar basisregisters toe zijn wij op zoek naar enige ervaring binnen

Bekijk vacature »

Laravel / PHP developer

Functie omschrijving Wij zijn op zoek naar een Medior PHP / Laravel Developer voor een IT-consultancy in de omgeving van Hoofddorp! Ben jij op zoek naar een leuke nieuwe uitdaging binnen een veelzijdige werkomgeving? Lees dan snel verder! Binnen dit bedrijf werk je in een ontwikkelteam, waarin je zeer betrokken bent en meedenkt over softwareoplossingen. Binnen dit Team hou je je bezig met het aanpassen, verbeteren en vernieuwen van de logistieke oplossingen. Je zult je bezig houden met de volgende werkzaamheden: Je gaat aan de hand van de wensen van klanten software ontwikkelen; Je bent bij het gehele proces betrokken;

Bekijk vacature »

Als Lead PHP developer bijdragen aan het onderwijs

Functie Als Lead PHP developer zet je samen met het team en de andere lead developers de technische lijnen uit als het gaat om het ontwikkelen van de applicaties en bepaal je samen met de PO waar elke sprint aan gewerkt zal worden. Je kunt op basis van een user story een goede aanpak formuleren en een planning opstellen, en andere hierin meenemen. Wanneer je team code schrijft verwacht je degelijke oplossingen, bij voorkeur gebruik makend van Domain Driven Design. Je ziet toegevoegde waarde in het beoordelen van het werk van collega’s om zo samen te streven naar hoge kwaliteit

Bekijk vacature »

PHP Developer

Als PHP Developer bij Coolblue zorg je ervoor dat onze webshops elke dag een beetje beter zijn. Wat doe je als PHP Developer bij Coolblue? Als PHP Developer werk je met andere development teams samen om onze webshop zo optimaal mogelijk te laten werken en onze klanten blij te maken. Hoewel je een PHP Developer bent, sta je open om C# of Typescript in te zetten of te leren. Ook PHP Developer worden bij Coolblue? Lees hieronder of het bij je past. Dit vind je leuk om te doen pure PHP code schrijven. Samenwerken met de klantreiziger om onze klanten

Bekijk vacature »

.NET developer

Functie Als senior .NET ontwikkelaar en aankomend lead developer ben jij in één van de drie development teams verantwoordelijk voor het volgende: • Jij hebt een oogpunt op modernisering en bent verantwoordelijk voor de technische staat en architectuur van de applicatie; • Jij bent verantwoordelijk voor het reviewen van de technische haalbaarheid van verschillende onderwerpen; • Jij bent verantwoordelijk voor een goede aansluiting binnen het multidisciplinaire team en de bijbehorende taken; • Jij bent verantwoordelijk voor het aandragen van verbetervoorstellen en ontwikkelstandaarden in zowel de techniek als architectuur; • Jij bent meewerkend voorman en ondersteunt en coacht jouw team op

Bekijk vacature »

Junior full stack developer

Functie Als full stack developer binnen onze organisatie ga jij je bezig houden met het bouwen van de user experience van de webapplicaties. Je bent verantwoordelijk voor het vertalen van concepten, briefings en designs naar werkende functionaliteit. Hierbij zorg je ervoor dat applicaties betrouwbaar, veilig en toekomstbestendig zijn en een goede architectuur hebben en behouden. Verder denk je actief na- en mee over nieuwe ontwikkelingen en functionaliteiten om zo elke dag de klantervaring weer te verbeteren. Dit doe je natuurlijk niet alleen maar in een development team. Het team bedraagt momenteel 4 man bestaande uit 2 devops engineers en 2

Bekijk vacature »

Front-end Developer Angular

Dit ga je doen Jouw taken als Front End Developer bestaan uit: Het ontwikkelen van maatwerkoplossingen voor klanten; Het meedenken over nieuwe tools en technieken; Het begeleiden van junioren; Het meewerken aan diverse projecten; Het meedenken in UX/UI design. Hier ga je werken Als Front-End Developer ga je in een Scrum team aan de slag met de nieuwste digitale technologieën om klanten en overheden over de hele wereld te ondersteunen met het ondersteunen van hun software, veelal op het gebied van watermanagement en infra. Door middel van real-time data in combinatie met voorspellende analyses, AI, Deep Learning en Machine Learning

Bekijk vacature »

SAP ABAP Developer

Dit ga je doen Software ontwikkeling met behulp van o.a. ABAP, Sapscript en Smartforms Maatwerk development op SAP ECC 6.0, in de toekomst S/4 HANA Samenwerken met Business Analisten die functioneel en technisch ontwerpen aanleveren Testen van opgeleverde software Bugfixing Ondersteuning van eindgebruikers Hier ga je werken Onze klant, een internationaal gevestigd productiebedrijf dat mensen blij maakt, is ter versterking op zoek naar een ABAP Developer voor hun SAP team. Het team van 4 mensen verzorgt de ontwikkeling van maatwerk voor de SAP omgeving waar wordt gewerkt met modules SD, FI/CO, PM en MM. Momenteel draait het bedrijf op SAP

Bekijk vacature »

PHP Developer

Zie jij mogelijkheden om onze tooling technisch te verbeteren en uit te bouwen? Over Jobmatix Jobmatix is een innovatieve en internationale speler op het gebied van jobmarketing. Onze jobmarketing automation tool helpt organisaties bij het aantrekken van nieuw talent door vacatures digitaal, geautomatiseerd en op een efficiënte manier te adverteren en onder de aandacht te brengen bij de doelgroep op 25+ jobboards. Volledig performance-based, waarbij organisaties betalen op basis van cost per click of cost per applicant. Maandelijks wordt onze jobmarketing automation tool al gebruikt door vele directe werkgevers, intermediairs en mediabureaus, waaronder Picnic, Rijkswaterstaat, AdverOnline, Schiphol, DPA, Teleperformance en

Bekijk vacature »

Junior/medior Back end developer PHP, Laravel

Functie Jij als ontwikkelaar komt te werken in een team bestaande uit 4 back end programmeurs, 2 vormgevers/ Front end developers en een online marketeer. Qua persoonlijkheden is het team erg gevarieerd van sportfanaten tot gameliefhebbers en Golfers. Een ding heeft iedereen hier gemeen; Passie voor goede code. In jouw rol zul je voor veel van je tijd je bezig houden met het ontwikkelen van maatwerk features en applicaties. Daarnaast hebben wij op aanvraag ook wel eens een website of onderhoudsklusje, die opgepakt moet worden en hier ben jij ook niet vies van. Jij als full stack developer zult dus

Bekijk vacature »
Tim

Tim

29/01/2009 20:26:00
Quote Anchor link
Heey allemaal,


Voordat ik mijn versie van een Poll zonder MySQL in de scriptlib post, hoor ik graag jullie opmerkingen erover.

Opbouwende kritiek is altijd welkom, maar op grove antwoorden zal ik niet reageren.

'class.php' kan je includen / kopieren, en in 'index.php' staat een voorbeeld van het gebruik. 'poll_votes.php' is een leeg bestand (aanmaken voor gebruik!) voor het checken van het IP en de gegeven antwoorden:

Een voorbeeld is te vinden op http://www.agenebbes.nl/under_construction/Poll/


class.php
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
<?php

class Poll {
    var
$question = '';
    var
$answers = array();
    var
$name = '';
    var
$poll_votes = array();
    
    function
__construct() {
        $this->setPollVotes();
    }

    
    protected function setPollVotes() {
        $poll_votes = array();
        
        include('poll_votes.php');
        
        $this->poll_votes = $poll_votes;
    }

    
    protected function getPollVotes() {
        return $this->poll_votes;
    }

    
    public function setPollName($name) {
        $this->name = $name;
    }

    
    public function getPollName() {
        return $this->name;
    }

    
    public function resetPollName() {
        $this->name = '';
    }

    
    public function setQuestion($question) {
        $this->question = $question;
    }

    
    public function getQuestion() {
        return $this->question;
    }

    
    public function resetQuestion() {
        $this->question = '';
    }

    
    public function addAnswer($answer) {
        if(is_array($answer)){
            foreach($answer as $key => $value){
                $this->answers[] = $value;
            }
        }
else{
            $this->answers[] = $answer;
        }
    }

    
    public function getAnswers() {
        return $this->answers;
    }

    
    public function resetAnswers() {
        $this->answers = array();
    }

    
    public function checkIp($ip) {
        $poll_votes = $this->getPollVotes();
        
        $pollName = $this->getPollName();
        
        foreach($poll_votes as $key => $value){
            if((!empty($pollName) && $poll_votes[$key]['pollName'] == $pollName && $poll_votes[$key]['ip'] == md5($ip)) ||
                (
empty($pollName) && $poll_votes[$key]['ip'] == md5($ip)) ||
                (
$poll_votes[$key]['pollName'] == 'BAN' && $poll_votes[$key]['ip'] == md5($ip))){
                return false;
            }
        }

        
        return true;
    }

    
    protected function addIp($ip) {
        if(!is_writable('poll_votes.php')){
            return false;
        }

        
        $file = fopen('poll_votes.php', 'rb');
        $content = str_replace('<?php ', '', fgets($file));
        $content = str_replace(' ?>', '', $content);
        fclose($file);
        
        $file = fopen('poll_votes.php', 'w+b');
        
        $new_content = '$poll_votes[] = array(\'pollName\' => \'' . $this->getPollName() . '\', \'ip\' => \'' . md5($ip) . '\');';
        
        if(!fwrite($file, '<?php ' . $content . $new_content . ' ?>')){
            fclose($file);
            
            return false;
        }

        
        fclose($file);
        
        return true;
    }

    
    public function banIp($ip) {
        if(!is_writable('poll_votes.php')){
            return false;
        }

        
        $file = fopen('poll_votes.php', 'rb');
        $content = str_replace('<?php ', '', fgets($file));
        $content = str_replace(' ?>', '', $content);
        fclose($file);
        
        $file = fopen('poll_votes.php', 'w+b');
        
        $new_content = '$poll_votes[] = array(\'pollName\' => \'BAN\', \'ip\' => \'' . md5($ip) . '\');';
        
        if(!fwrite($file, '<?php ' . $content . $new_content . ' ?>')){
            fclose($file);
            
            return false;
        }

        
        fclose($file);
        
        return true;
    }

    
    public function addVote($answer) {
        if(!$this->checkIp($_SERVER['REMOTE_ADDR'])){
            return false;
        }

        
        if(!is_numeric($answer)){
            return false;
        }

        
        if(!is_writable('poll_votes.php')){
            return false;
        }

        
        $file = fopen('poll_votes.php', 'rb');
        $content = str_replace('<?php ', '', fgets($file));
        $content = str_replace(' ?>', '', $content);
        fclose($file);
        
        $file = fopen('poll_votes.php', 'w+b');
        
        $new_content = ' $poll_votes[] = array(\'pollName\' => \'' . $this->getPollName() . '\', \'ip\' => \'' . md5($_SERVER['REMOTE_ADDR']) . '\', \'answer\' => \'' . $answer . '\');';
        
        if(!fwrite($file, '<?php ' . $content . $new_content . ' ?>')){
            fclose($file);
            
            return false;
        }

        
        fclose($file);
        
        return true;
    }

    
    public function getVotes() {
        $answers = $this->getAnswers();
        $total = 0;
        
        foreach($answers as $key => $value){
            $votes[$key]['count'] = 0;
            $votes[$key]['answer'] = $value;
        }

        
        $this->setPollVotes();
        
        $poll_votes = $this->getPollVotes();
        
        foreach($poll_votes as $key => $value){
            if($poll_votes[$key]['pollName'] == $this->getPollName()){
                $votes[$poll_votes[$key]['answer']]['count']++;
                $total++;
            }
        }

        
        foreach($answers as $key => $value){
            if($total == 0){
                $votes[$key]['percentage'] = '0';
            }
else{
                $votes[$key]['percentage'] = round($votes[$key]['count'] / $total * 100, 1);
            }
        }

        
        return $votes;
    }
}


?>


index.php
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

require_once('class.php');

$fPoll = new Poll;

$fPoll->setPollName('Testpoll');
$fPoll->setQuestion('Wat vind je van deze poll?');
$fPoll->addAnswer('Zeer goed');
$fPoll->addAnswer('Goed');
$fPoll->addAnswer('Matig');
$fPoll->addAnswer('Slecht');
$fPoll->addAnswer('Zeer Slecht');

if($fPoll->checkIp($_SERVER['REMOTE_ADDR'])){
    if($_SERVER['REQUEST_METHOD'] == 'POST'){
        if(!$fPoll->addVote($_POST[$fPoll->getPollName()])){
            echo 'Uw antwoord kon niet worden toegevoegd.';
        }
else{
            echo 'Uw antwoord is succesvol toegevoegd.<br><br>';
            
            $votes = $fPoll->getVotes();
            
            foreach($votes as $key => $key){
                echo $votes[$key]['answer'] . ' - ' . $votes[$key]['count'] . ' (' . $votes[$key]['percentage'] . ' %)<br>';
            }
        }
    }
else{
        echo $fPoll->getQuestion() . '<br><br>';
        
        echo '<FORM ACTION="" METHOD="POST">';
        
         $answers = $fPoll->getAnswers();
        
         foreach($answers as $key => $value){
             echo '<INPUT TYPE="radio" NAME="' . $fPoll->getPollName() . '" VALUE="' . $key . '"> ' . $value . '<br>';
         }

        
         echo '<br><INPUT TYPE="submit" VALUE="Vote!" NAME="submit">';
        
        echo '</FORM>';
    }
}
else{
    $votes = $fPoll->getVotes();
    
    foreach($votes as $key => $value){
        echo $votes[$key]['answer'] . ' - ' . $votes[$key]['count'] . ' (' . $votes[$key]['percentage'] . ' %)<br>';
    }
}


?>


Met vriendelijke groet,
Tim
Gewijzigd op 01/01/1970 01:00:00 door Tim
 
PHP hulp

PHP hulp

05/11/2024 20:38:35
 
Jelmer -

Jelmer -

29/01/2009 20:42:00
Quote Anchor link
Ik zou zelf serialize gebruiken om de inhoud van het bestand te maken, maar dit zal ook wel goed werken op zich. Het voordeel van serialize is dat je ook hele complexe structuren kan opslaan, en ze zo weer terug kan halen naar PHP data zonder het relatief onveilige include() te gebruiken. Er zijn ook PHP installaties waar PHP geen beschrijfbare bestanden kan includen/uitvoeren, jouw script werkt dan niet meer.

Is het trouwens niet een beter idee om toch even die $poll_votes variabelen ergens in een property op te slaan wanneer deze al geladen is? Nu include je het bestand meerdere malen, en met meer votes gaat dat langzamer worden.

Je zou nog kunnen overwegen de awnsers en votes aparte objecten te maken zodat je die (lelijke) multidimensionale arrays kan wegwerken.
 
Tim

Tim

29/01/2009 20:58:00
Quote Anchor link
@ Jelmer

Ik heb eens even zitten kijken naar serialize, en daar ga ik me zeker nog wat meer in verdiepen.

Het opslaan van die $poll_votes heb ik aangepast, maar aangezien deze ook weer ingeladen moet worden na een stem, levert dit (denk ik) niet zoveel tijdswinst op.

Het gebruik van multidimensionale arrays is een persoonlijke keuze. Jij vindt ze lelijk, ik zie het als een mooie mogelijkheid om ingewikkelde modellen te maken ;-).
Gewijzigd op 01/01/1970 01:00:00 door Tim
 
PHP Newbie

PHP Newbie

29/01/2009 21:01:00
Quote Anchor link
Waarom in godsnaam een poll zonder SQL? Eigenlijk zijn de enige die dat gebruiken beginners omdat ze nog niet weten hoe het werkt en/of ze nog niet hebben uitgevonden hoe handig dat het is.

Oop daarentegen is juist niet voor de beginners, zij zullen moeite hebben met het doorgronden van de logica in/van een class en zien het voordeel er (nog) niet van in.
 
Tim

Tim

29/01/2009 21:04:00
Quote Anchor link
@ PHP Newbie

Uiteraard gebruik ik vor 99% van mijn applicaties wel SQL. Toch zou het om de een of andere vage reden voor kunnen komen dat er een keer geen SQL-database voorhanden is. Daarom dit scriptje / deze class, waarmee makkelijk een poll te integreren is in iedere willekeurige website.
 
Jelmer -

Jelmer -

29/01/2009 22:38:00
Quote Anchor link
Dan zou je ook nog gebruik kunnen maken van SQLite, wat meestal (of default inmiddels al?) wel beschikbaar is. Enige wat je nodig hebt is een beschrijfbaar mapje waar je je database in kan zetten (en de database z'n bestand heen en weer kan schuiven)

Oeh, over beschrijfbare bestanden gesproken, misschien is het wel handig om wat escape functies toe te voegen, of checks, om te voorkomen dat quotes in de pollname problemen op gaan leveren.

Je zou ook de pollname variabele achterwege kunnen laten, en het pad naar het bestand waarin de gegevens worden opgeslagen variabel kunnen maken (wat op zichzelf ook al een goed idee is, want nu is de locatie afhankelijk van in welke map je script dat deze klasse aanroept staat, en wat zijn cwd is) Het voordeel van verschillende losse bestandjes is dat het makkelijk te backuppen is, minder foutgevoelig (of liever gezegd, minder destructief in het geval van een fout) en lichter om in te laden.
Gewijzigd op 01/01/1970 01:00:00 door Jelmer -
 
Tim

Tim

30/01/2009 17:49:00
Quote Anchor link
@ Jelmer

Het punt is nu niet of er wel of niet altijd een database aanwezig (kan) zijn, maar of het script zo goed is / werkt.

De escapefunctie zal ik binnenkort toevoegen, daar heb je helemaal gelijk in!

Bij verschillende losse bestanden houd je hetzelfde probleem als met één groot bestand, behalve het 'foutgevoeligheidspunt'. Zit het systeem echter goed in elkaar, dan kan dit niet (echt) fout gaan. Bovendien is één bestand (naar mijn idee) beter te back-uppen dan voor iedere poll één.
 



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.