[OOP] Poll Zonder MySQL

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Mendix Ontwikkelaar - Vernieuwen van het applicati

Bedrijfsomschrijving De ontwikkelingen in de transportsector gaan razendsnel. Bij ons kun je een belangrijke rol spelen in deze sector. We streven ernaar om onze klanten te ontzorgen op het gebied van continuïteit en veiligheid met innovatieve producten en diensten. We willen dat onze klanten de veiligste vervoerders van Europa worden. Ons team werkt hard om deze ambitieuze doelstellingen te bereiken en we bieden een motiverende werkomgeving aan. We zijn op zoek naar zelfstarters met een focus op resultaat en beslissingsbevoegdheid. Functieomschrijving Als Mendix ontwikkelaar bij deze organisatie heb je een gevarieerde baan. Het applicatielandschap wordt vernieuwd en de “schade en

Bekijk vacature »

Senior java ontwikkelaar integratie

Functieomschrijving Voor de gemeente Rotterdam zijn wij op zoek naar een senior java ontwikkelaar integratie. Taken Binnen een zelfsturend Scrumteam voer je geheel zelfstanding je opdrachten uit en levert het eindresultaat op aan het Integratieteam. Jij voelt je net als alle teamleden verantwoordelijk voor alle aspecten, vanaf de vraag tot en met de oplevering in productie. Je bent kritisch, je helpt de klant om zijn wensen helder te krijgen, je schrijft zelfstandig clean code die van hoge kwaliteit is, met bijbehorende unit- en integratietesten, je ondersteunt zo nodig bij deployments naar productie. Het Integratieteam bouwt componenten (Endpoints) op de ESB.

Bekijk vacature »

Developer Front-end

Functie omschrijving Front-end Developer gezocht! Wij zijn op zoek naar een front-end developer voor een organisatie in de regio Veenendaal die de eindverantwoordelijkheid op zich neemt van alles wat met design te maken heeft. Je hebt in deze functie een adviserende rol hiervoor moet je beschikken over een grote dosis vakinhoudelijke kennis. Je creëert unieke concepten door samen met collega’s en klanten te overleggen over aangeleverde designs. Hiermee draag jij je steentje bij aan de groeiambities van de klant. Jij wordt het vaste aanspreekpunt voor klanten wanneer het gaat over planningen, hierin is het jouw taak om alle betrokkenen goed

Bekijk vacature »

Front-end Developer vue.js node.js SaaS

Dit ga je doen Het ontwikkelen van nieuwe features die bijdragen aan de groei van de klanten van de organisatie; Je denkt mee over nieuwe innovaties, features en verbeteringen in de applicatiearchitectuur; Je draagt bij aan de continue ontwikkeling van jouw team doordat je elke dag streeft naar het verbeteren van jouw eigen prestaties; Je neemt actief deel aan Scrum meetings en de Frontend Guild. Hier ga je werken Voor een snel groeiend bedrijf de regio Nieuw Vennep zijn wij opzoek naar een ervaren Front-end Developer. De organisatie is actief in de e-commercebranche en ontzorgt haar klanten middels een SaaS-platform.

Bekijk vacature »

C# .NET Software Ontwikkelaar

Functie omschrijving C# .NET Developer gezocht. Ben jij een full stack developer die op zoek is naar een nieuwe uitdaging binnen een leuk snel groeiend bedrijf? Lees dan snel verder! Wij zijn op zoek naar een Developer met ervaring op het gebied van .NET die een organisatie in de regio Arnhem gaat versterken. Jij gaat je binnen dit bedrijf vooral bezighouden met het verbeteren van de functionaliteiten van hun dataplatform. Samen met andere ontwikkelaars denk je mee in oplossingsrichtingen, architectuur en nieuwe technologieën. Als C# .NET Developer binnen dit bedrijf houd je je niet alleen bezig met het verbeteren van

Bekijk vacature »

.NET developer

Klaar voor een nieuwe uitdaging? Welke technologieën gaan schuil achter de dagelijkse energievoorziening? Als senior .NET developer bij Kenter maak jij samen met je team het verschil, zowel voor de interne organisatie als voor eindklanten. Samen bouwen jullie aan innovatieve dienstverlening met behulp van de nieuwste technologieën en tools. Het is een functie met veel vrijheid, goede arbeidsvoorwaarden én je draagt jouw steentje bij aan de energietransitie. Klinkt dit als iets voor jou? Lees dan verder of solliciteer direct! Wat ga je doen als senior .NET developer? Als senior .NET developer bij Kenter (onderdeel van Alliander) ben je van onschatbare

Bekijk vacature »

Back end developer Onderwijssoftware

Functie Als back end developer kom jij terecht in een klein, maar hecht team bestaande uit 5 andere developers (waarvan 2 senioren, 2 medior en 1 junior). Met de gezamenlijke missie om “ieder kind te helpen met onze software” wordt er dagelijks gepassioneerd en hard gewerkt aan ons in-house ontwikkeld platform. Deze software is gebaseerd is op AI, machine Learning en wetenschappelijke inzichten. Dagelijks zul jij werken met onze high traffic webapplicatie. We hebben ruim 300.00 gebruikers en meer dan 2 miljard records waar je te maken mee krijgt! Verder zul jij je bezighouden met: – Het ontwikkelen van hoogwaardige

Bekijk vacature »

Senior .NET Developer I goed salaris en deels thui

Bedrijfsomschrijving Mijn opdrachtgever is al ruim 20 jaar een gevestigde naam in de wereld van software ontwikkeling, met drie kantoren in de Randstad, waaronder Alphen aan den Rijn. Zij richten zich op het bouwen van IT-oplossingen die ervoor zorgen dat de productiviteit van klanten te allen tijden optimaal is. Hiervoor neemt jouw nieuwe werkgever het volledige ontwikkelproces tot haar rekening; van het eerste gesprek om de klantwensen in kaart te brengen, tot aan het uiteindelijke onderhoud van de opgeleverde oplossing. In totaal werken er inmiddels bijna 200 gemotiveerde IT-ers binnen deze organisatie. De gemiddelde leeftijd ligt rond de 35. Het

Bekijk vacature »

.NET software developer

Functie omschrijving Voor een gewilde werkgever in omgeving Roosendaal zijn wij op zoek naar een back-end software developer met een aantal jaar werkervaring. Je krijgt een plekje in het workflow team en je zal betrokken worden bij het bouwen van nieuwe software, en het optimaliseren van bestaande code. Je werkt bij dit bedrijf in een Scrum team waarin je soms klantcontact hebt. Jouw werkzaamheden zullen er als volgt uit zien: Je krijgt een plekje op de in-house IT afdeling. Deze afdeling bestaat uit zo'n 12 collega's, verdeeld over verschillende specialisaties (BI, Beheer, Business software & workflow). De vacature staat open

Bekijk vacature »

Node.js developer

Functie Onder begeleiding van 3 accountmanagers waarvan er 1 binnen jouw expertise je aanspreekpunt zal zijn ga je aan de slag bij diverse opdrachtgevers. Hij of zij helpt je bij het vinden van een passende en uitdagende opdracht. Hierin houden ze uiteraard rekening met jouw situatie, ervaring en (technische) ambities. De opdrachten duren gemiddeld één tot 2 jaar. Hierdoor kun je je ook echt vastbijten in een project en als consultant impact maken. Naast de opdracht ben je regelmatig met je collega’s van de IT-afdeling om bijvoorbeeld onderlinge kennis te delen, of nieuwe trends te bespreken. Ook worden er regelmatig

Bekijk vacature »

.NET Developer

Dit ga je doen Programmeren in .NET, Javascript & C# en ontwikkelen in Web Services, Windows Services en MS SQL Server; Zelfstandig verbanden maken Analyseren, testen, bugs fixen, reviewen en rapporteren; Juiste prioriteiten stellen en verantwoordelijkheid nemen; Op architectuur niveau meedenken; Af en toe klanten bezoeken. Hier ga je werken Voor onze relatie zijn wij opzoek naar een .NET ontwikkelaar met minimaal 3 jaar werkervaring. Je komt te werken in een groeiend bedrijf met betrokken collega's die zorgen voor een familiaire sfeer op de werkvloer. Als .NET ontwikkelaar word jij vanaf de eerste werkdag betrokken bij het gehele ontwikkelproces. De

Bekijk vacature »

Back-end Software Developer

Functie omschrijving Ben jij op zoek naar een uitdagende development functie bij een klein gespecialiseerd softwarebedrijf? Wil jij graag hybride werken (combi tussen thuis + kantoor), loop jij warm voor maatwerk software en voel jij je prettig in een informele cultuur? Zoek dan niet verder! Reageer direct! Voor een gewilde werkgever in omgeving Tilburg zoeken wij een back-end software developer met een aantal jaar werkervaring. Je gaat werken voor een klein softwarebedrijf dat gespecialiseerd is in de ontwikkeling van integratiesoftware. Jouw werkzaamheden zien er als volgt uit: In een klein team met 4 ontwikkelaars houd jij je bezig met afwisselende

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 »

Functioneel applicatiebeheerder - SOP-SYS-SAM

TenneT is hard groeiend om de onze ambities waar te kunnen maken. Zo nemen wij een leidende rol in het aanjagen van de energietransitie. Het werven van nieuw talent speelt daarin een cruciale rol. Wij zijn op zoek naar een gedreven Functioneel Applicatiebeheerder op onze locatie Arnhem die hieraan wil bijdragen en misschien ben jij dat wel? Jouw bijdrage aan TenneT Je gaat samenwerken in een team van circa 15 functioneel applicatiebeheerders en gaat onderdeel uitmaken van een DevOps team. Met dit team ga je applicaties (laten) ontwikkelen en beheren. Hierbij concentreer je je vooral op de functionele aspecten, zodat

Bekijk vacature »

Belastingdienst - Freelance Applicatieontwikkelaar

Startdatum: 01.06.2023 Richttarief: €65,00 - €75,00 Duur van de opdracht: 6 maanden Uren per week: 36 Taal: Nederlands vereist! Gelieve in het Nederlands te solliciteren. Hybride. Kantoordagen in Utrecht, incidenteel in Apeldoorn Functieomschrijving: De afdeling IV – Generieke Voorzieningen – Interactie Online is onderdeel van de keten Interactie. De missie van de keten is: “het faciliteren van de interactie met alle burgers, bedrijven en hun vertegenwoordigers om hen in staat te stellen aan hun fiscale verplichtingen te voldoen en aanspraak te maken op hun rechten.” De afdeling Interactie Online heeft een belangrijke bijdrage binnen deze keten. Dit door het ontwikkelen

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

29/04/2024 13:57: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.