[OOP] Poll Zonder MySQL

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Frontend Developer - Leeuwarden

Als Frontend Developer bouw jij mee aan het onderwijs van de toekomst! In een scrum team werken met jonge en enthousiaste collega’s, moderne technieken, ruimte voor eigen ontwikkeling en op een proactieve wijze kunnen meewerken aan innovatie binnen het onderwijs. Magister is het state-of-the-art softwarepakket dat scholen in het voortgezet onderwijs op alle fronten ontzorgt. Van leerlingenadministratie tot het ondersteunen van individuele leerlijnen, van toegang tot digitaal lesmateriaal tot het plannen van het lesrooster. In de Magister app bedient Magister ruim 2,5 miljoen gebruikers waarvan, dagelijks meer dan 600.000 unieke. Hiermee is Magister de absolute marktleider in onderwijsland. Wat vragen

Bekijk vacature »

Senior PHP developer/ Software Architect

Functie Momenteel zijn ze op zoek naar een ervaren PHP developer die zichzelf graag bezighoudt met zaken als architectuur en de algehele verbetering van structuren en standaarden. Het is eigenlijk meer operationeel als uitvoerend omdat je bezig gaat met zaken als het verder uitrollen en verbeteren van testautomatisering, codereviews, tickets en de doorloop hiervan en architectuurkeuzes. Mocht je hiernaast ook wat DevOps kennis meenemen is dit mooi meegenomen! Vanwege het kleine team maar de wereldwijde impact die zij leveren is er veel focus op kwaliteit. In deze functie werk je aan één van hun belangrijkste applicaties. Hierin werk je nauw

Bekijk vacature »

Junior .NET Developer

Dit ga je doen Ontwikkelprocessen verder optimaliseren en verder ontwikkelen met C#; CI/CD-pipelines automatiseren; Ontwikkelen van herbruikbare componenten; Front-end pagina's gebruiksvriendelijk maken. Hier ga je werken Als junior .NET Developer kom je terecht binnen een grote en internationale organisatie. Zij streven naar een positieve impact op de mens, milieu en maatschappij. Het bedrijf is oorspronkelijk een familiebedrijf en werkt aan de productie van hoogwaardige en technische systemen voor de gezondheidszorg. Momenteel willen zij betere ontwikkelprocessen creëren op internationaal gebied en staat kwaliteit en veiligheid voor hun op nummer 1! Als junior .NET Developer werk je aan het ontwikkelen van verbeterde

Bekijk vacature »

C# .NET Developer

Functie omschrijving Ben jij op zoek naar een nieuwe uitdaging binnen development waar je komt te werken binnen een flexibel, jong en ondernemend bedrijf. Lees dan snel verder! Voor deze functie zoeken wij een C# .NET Developer die enthousiast wordt van het aansluiten en begeleiden van (complexe) nieuwe klanten. Daarnaast begeleid je complexe projecten, wij zoeken iemand die altijd kansen ziet en waarbij het glas altijd half vol is. Voor deze functie zoeken wij een Developer met ervaring op het gebied van .NET die deze organisatie gaat versterken. Binnen de organisatie ga jij je vooral bezighouden met het verbeteren van

Bekijk vacature »

Senior Front-end Developer

Dit ga je doen Met behulp van diverse programmeertalen ontwikkelen van Front-end software; Het begeleiden van het front-end team; Het oplossen van incidenten; Het bijhouden van een backlog; Je hebt een actieve bijdrage in de wekelijkse overleggen met de omliggende teams; Je houdt trends bij en adviseert het management hierover waar nodig; Helder communiceren met de stakeholders om hen zo mee te nemen in projecten en laten inzien wat de duur en toegevoegde waarde van bepaalde projecten is. Hier ga je werken Deze organisatie heeft circa 40 miljoen bezoekers per maand en heeft innovatie hoog in het vaandel staan. Het

Bekijk vacature »

Lead developer (PHP, Symfony, DDD)

Functie Als Lead developer zorg je ervoor dat het team (bestaande uit zowel junior als ervaren developers) in staat is om de kwaliteit van de software (en code) verder te verhogen. In samenwerking met het team, de product owner en de andere lead developers zet je technische lijnen uit en bepaal je de prioriteiten per sprint. Lijkt het jou interessant om complexe problemen op te lossen en bijvoorbeeld een nieuwe applicatiestructuur in Symfony op te zetten? Dan komen wij graag met je in contact. Eisen • HBO werk- en denkniveau (ze kijken niet naar papieren, maar naar denkniveau, motivatie en

Bekijk vacature »

Medior/senior Back-end developer wanted!

Functie Because of the growth within the company, we are looking for reinforcement in the devlopmenttean. As a back-end developer you build the company software that helps us with the primary processes. A fun (internal) project in which you continuously develop the software! You will work in a small team, we have daily stand-ups and a scrum session every fortnight, led by our Scrum Master. During these sessions, you get the opportunity to present your ideas and discuss them with your fellow developers and the Product Owner. Within the development teams, we use Trello, Gitlab, Jiira, Confluence and Boockstack. They

Bekijk vacature »

PHP developer

Functie omschrijving Voor een klein bedrijf in de buurt van Nieuwegein zijn wij per direct op zoek naar een talentvolle PHP developer. Er wordt veel ruimte geboden voor eigen initiateven, waardoor je een mooie stempel kan drukken op jouw eigen werkzaamheden (zowel operationeel als strategisch). Het bedrijf heeft middels externe programmeurs een multimedia platform ontwikkeld, maar willen geleidelijk de ontwikkeling naar binnen halen. Om die reden zoeken zij een communicatieve interne PHP developer die graag meebouwt aan het succesvolle product. Je gaat de volgende werkzaamheden verrichten: Platform beheren en programmeren (PHP, MySQL, JQuery, Javascript, XML & HTML); Communicatie en aansturing

Bekijk vacature »

Frontend Developer Vue Nuxt HBO Javascript

Samengevat: Deze werkgever levert elke dag betere digitale gebruikerservaringen. Ben jij geschikt als frontend Developer? Heb je ervaring met Vue en Nuxt? Vaste baan: Front-End Developer HBO €3.100 - €4.600 Zij bieden opdrachtgevers een complete dienstverlening op gebied van ontwerpen en ontwikkelen van websites, zoekmachine optimalisatie, online adverteren, content marketing en conversie verbetering. Zij werken met een eigen ontwikkeld CMS. Bij bij hun werk je aan onze eigen bedrijfsapplicaties. Je ontwikkelt met ons de meest nieuwe software. Wij blinken uit als het gaat om de inzet van technologie. Deze werkgever staat open voor elke nieuwe trend. Onze systemen zijn groot

Bekijk vacature »

Back-end Developer

Functieomschrijving Heb jij kort geleden jouw HBO ICT diploma in ontvangst mogen nemen? Of ben je toe aan een nieuwe stap? Voor een softwarebedrijf in regio Oosterhout zijn wij op zoek naar een back-end developer met kennis of ervaring met C# en SQL. Je draagt bij aan de implementatie van aanpassingen, verbeteringen en aanvullingen in de C# based applicaties; Je test de software en ontwikkelt deze door; Je brengt de aanpassingssuggesties van klanten in kaart, om ze vervolgens te analyseren en daarna te concluderen of de aanpassing een verbetering is; Je houdt je bezig met het ontwikkelen van nieuwe functionaliteiten;

Bekijk vacature »

Traineeship Full Stack Java developer

Dit ga je doen Start jij op 7 augustus bij de Experis Academy dan kickstart jij jouw IT-carrière! We leiden je op tot een gewilde Full Stack Java Developer met alle kennis en vaardigheden die nodig zijn om de arbeidsmarkt te betreden. Wat kun je verwachten, hoe zit een dag in het leven van een Trainee eruit? Periode 1 Als Full Stack Java Developer Trainee volg je vanuit huis een op maat gemaakte onlinetraining die in het Engels wordt gegeven. De tijd die je kwijt bent aan het volgen van de training kun je vergelijken met een fulltime werkweek. In

Bekijk vacature »

Lead developer

Functie Als lead developer wordt jij verantwoordelijk voor een van onze development teams. Samen met de Software Architect bewaak jij de kwaliteit en uitvoering van onze complexe vraagstukken. Daarnaast ben jij verantwoordelijk voor het inschatten, designen en ontwikkelen van middelgrote tot grote veranderingen in de software. Ook coördineer jij het proces rondom complexe technische vraagstukken. Verder bestaat jouw takenpakket uit het volgende: – Het aansturen van jouw development team; – Het begeleiden van Junior Software Engineers; – Het maken van technische analyses m.b.t. nieuwe aanvragen en het tijdsbestek inschatten voor de uitvoering hiervan; – Het uitvoeren van de ontwikkeling van

Bekijk vacature »

Front end developer React Sportgames

Functie Als Front end developer ga jij aan de slag bij een gave en bekende organisatie op het gebied van sportgames. Jij gaat aan de slag in een scrumteam met 6 developers die gepassioneerd en actief bezig zijn om spelers kwalitatieve en mooie spelervaringen aan te bieden. Als scrumteam werken ze in drie wekelijkse sprints en begin je iedere ochtend met een stand-up. Als Front end developer werk jij bij deze organisatie voornamelijk met Javascript, html, css en React. Er wordt veel gebruikt gemaakt ook van C#, Docker en Kubernetes. Het team hecht veel waarde aan het leveren van hoogwaardige

Bekijk vacature »

Senior Product Developer

Functieomschrijving Als senior Product Developer ben je verantwoordelijk voor bestaande mobiliteitsproducten en de ontwikkeling van nieuwe mobiliteitsconcepten. Met behulp van diverse klantonderzoeken, klantsessies en salesmeetings zorg je ervoor dat je de veranderende mobiliteitsbehoeften in de markt kent. Hier speel je op in door innovatieve, flexibele, efficiënte en duurzame vervoersoplossingen te bedenken, te ontwikkelen, te implementeren en uiteindelijk samen met Sales en Marketing collega’s in de markt te zetten. Je initieert en neemt deel aan (internationale en afdeling overschrijdende) projecten, vaak in de rol van projectleider. In die rol bewaak je de voortgang, coördineer je de activiteiten en zorg je voor

Bekijk vacature »

Robot Programmeur

In het kort Drie redenen waarom deze vacature uniek is! Modern, innovatief en Informeel bedrijf waar veel mogelijk is Werken met diverse robot merken Meehelpen met inbedrijfstellingen bij de klant De organisatie Hier ga je aan de slag Dit groeiende bedrijf van totaaloplossingen in de automatisering van productieprocessen, is hoofdzakelijk actief in de Benelux. Vanuit het kantoor in regio Amersfoort worden veel oplossingen geboden in de vorm van robotica. Geen project is hetzelfde wat garant staat voor bijzonder veel afwisseling. De bedrijfsgrootte is ongeveer 80 man. Van gerobotiseerde machinebeladingen tot aan assemblage automatiseringen wordt vanuit krachtige engineering maatwerk equipment geleverd.

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

26/05/2026 14:33:07
 
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.