[OOP] Poll Zonder MySQL

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

3D BIM Add-on Developer

As a 3D BIM add- on developer at KUBUS, you will develop add-ons (called BCF- Managers) to the leading building information modeling (BIM) programs Revit, Navisworks, Archicad, AutoCAD and Tekla Structures. BCF Managers enable data transfer between BIM software and BIMcollab. You will work on both the front- and the back-end. As a software company, KUBUS is in a unique position. We build our own products that are used by tens of thousands of users worldwide. Our company is just the right size: big enough to make a real impact in the market, but small enough that as an individual

Bekijk vacature »

.NET Developer Shared Driving

Bedrijfsomschrijving Onze klant richt zich op het toegankelijker maken van steden, een fantastisch mooi streven. Hoe ze dat doen? Met eigen ontwikkelde software, waarmee vervoersmiddelen gedeeld kunnen worden. Deze inspirerende werkgever maakt een maatschappelijke impact en dat doen ze nu al zo'n 25 jaar! Het bedrijf is gevestigd in het centrum van Rotterdam en kent ongeveer zo'n 90 medewerkers. Het personeel is lekker gewoon gebleven! Iedereen kleedt zich zoals hij of zij dat zou willen en de sfeer is er erg fijn. Een leuke werkgever om voor te werken, en bovendien zijn er voor jou als Software Developer veel mooie

Bekijk vacature »

Java (Java EE) Developer

In het kort Werken als Java developer betekent werken aan complexe IT projecten bij onder meer een internationaal containeroverslag bedrijf. Zo sturen we apparaten en eindgebruikers aan d.m.v. onze custom-made software oplossing, die dagelijkse vele duizenden containers verwerkt. Denk aan systemen die volautomatische kranen aansturen en op afstand bedienen, de volledige afhandeling van containernummerherkenning bij het laden en lossen van zeeschepen of het tonen van instructies aan de chauffeurs van ruim 300 straddle carriers. En dat allemaal redundant, robuust en in een dynamische 24/7 omgeving! Jij versterkt ons ontwikkelteam en gaat aan de slag met oa. Java i.c.m. Spring (Boot),

Bekijk vacature »

Mendix Developer

Functie Wat ga je doen als Mendix Developer? We leven in een wereld die snel ontwikkelt en veranderd, ook nemen bedrijfsbelangen toe en blijken risico’s moeilijker in te schatten, daarom wij op zoek naar Junior, Medior en Senior Developers die bedrijven kunnen helpen met hun screeningproces en zorgen dat deze efficiënt en 100 procent AVG compliant is. Het concept achter Mendix is duidelijk. De klant heeft een vraag/probleem. Dit kunnen we door middel van slimme software oplossen. In plaats van te werken met de nieuwste technieken en tools, wordt er gekozen voor het implementeren en maken van software dat op

Bekijk vacature »

T-SQL Database developer

Functie omschrijving Ben jij een ETL database specialist? Houd jij ervan om te puzzelen met Databases, Query's & Stored procedures? Zoek jij uitdaging, vrijheid en verantwoordelijkheid? Zoek dan niet verder! Wij zijn per direct op zoek naar medior en senior database developers. Je gaat werken voor een relatief klein softwarebedrijf in omgeving Tilburg. Samen met 12 collega's (allemaal techneuten), ga jij je bezig houden met het bouwen en/of onderhouden van database software. Deze software wordt internationaal ingezet voor het automatiseren van logistieke processen. Jouw werkzaamheden gaan er als volgt uit zien: Je bent in een klein team met developers, verantwoordelijk

Bekijk vacature »

Medior .NET developer

Functie Jij gaat als Medior .NET ontwikkelaar aan de slag in ons scrumteam met 6 developers die gepassioneerd en actief bezig zijn om onze spelers kwalitatieve en mooie spelervaringen aan te bieden. Als medior .NET developer ga jij werken aan een technisch hoogwaardig platform welke bezoekerspieken verwerkt van tienduizenden tot honderdduizenden gebruikers per minuut! Ons scrumteam werkt in drie wekelijkse sprints en wij beginnen iedere ochtend met een stand-up. Jij werkt bij ons met C# .NET, .NET Core, React.JS, Xamarin, Azure, Docker en Kubernetes. Wij hechten enorm veel waarde aan het leveren van hoogwaardige en kwalitatieve code. Zodra jij de

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 »

Medior Java developer (fullstack)

Wat je gaat doen: Of beter nog, wat wil jij doen? Binnen DPA GEOS zijn we dan ook op zoek naar enthousiaste Java developers om ons development team te versterken. Als Java developer werk je in Agile/Scrum teams bij onze klanten en daarbij kun je eventueel ook andere ontwikkelaars begeleiden in het softwareontwikkelproces. Verder draag je positief bij aan de teamgeest binnen een projectteam en je kijkt verder dan je eigen rol. Je gaat software maken voor verschillende opdrachtgevers in jouw regio. Je bent een professional die het IT-vak serieus neemt en kwaliteit levert. Je leert snel vanwege je diepgaande

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 »

Front-end Developer

Functie omschrijving Gezocht front-end developer! Voor een toffe organisatie in de regio Rhenen zij wij op zoek naar een front-end developer die de eindverantwoordelijkheid op zich neemt van alles wat met design te maken heeft. In deze functie heb je een adviserende rol en beschik je over een grote dosis vakinhoudelijke kennis. Samen met collega’s en klanten overleg je om aangeleverde designs om te zetten naar unieke concepten. Zo draag jij je steentje bij aan de groeiambities van de klant. Voor klanten wordt jij het vaste aanspreekpunt als het gaat over planningen hierin houdt je alle betrokkenen goed op de

Bekijk vacature »

PHP Back-end Developer

Vacature details Vakgebied: Software/IT Opleiding: Starter Werklocatie: Nijmegen Vacature ID: 13633 Introductie OUr client develop websites, webshops, and digital environments that are used by many visitors daily. They are seeking an experienced PHP-Developer Back-end to join the team. If you're looking for a position where you can tackle challenging, innovative, and multidisciplinary ICT projects and make a difference, this vacancy might be for you! Functieomschrijving As a PHP developer, you'll develop websites and digital environments used by many visitors daily. You'll work as a back-end developer and want to continuously develop in this field. You can work independently and efficiently,

Bekijk vacature »

PHP developer

Functie Voor een opdrachtgever in omgeving Leiden zijn wij op zoek naar een PHP developer die affiniteit heeft met C++. Ben jij reeds afgestudeerd of heb je al een paar jaar ervaring? Lees snel verder en kijk of dit iets voor jou is! Hoe kan jouw dag er straks uitzien? Je gaat software en webapplicaties ontwikkelen met behulp van de talen C / C++ / PHP. Je gaat technische klussen uitvoeren op locatie bij klanten. Je onderhoudt contact met de projectleider om er zeker van te zijn dat een projecten goed verlopen. Je gaat klanten ondersteunen op het gebied van

Bekijk vacature »

Front-end Developer

Gezellige team, passie en een groene toekomst! Lees hier de vacature van Front-end Developer bij All in Power! All in power heeft zich tot doel gesteld écht bij te dragen aan de energietransitie. Dit doen wij door de markt voor energie volledig op zijn kop te zetten. Producenten van schone (wind- of zonne-)energie verkopen via ons platform hun energie rechtstreeks aan gebruikers. Of dit nu huishoudens, bedrijven of bijvoorbeeld laadpalen zijn ons platform maakt het uitwisselen van energie mogelijk. Zo maken we de business case van onze klanten veel sterker en loont het om (meer) te investeren in vergroening voor

Bekijk vacature »

Medior/Senior Software Developers gezocht in de Ra

Functie Op dit moment staan er posities open voor de volgende functies: Front-end, Back-End & Fullstack software developer. Als Front-End software developer werk je met JavaScript en de bijbehorende technologieën zoals TypeScript, Angular, React, Vue en Svelte. Als Back-End software developer ben je bezig in NodeJS en doe je dit met behulp van AWS, NoSQL, REST en GraphQL. Je krijgt leuke en uitdagende opdrachten met een gemiddelde duur van anderhalf jaar. Hier werk je in een team met andere IT’ers aan het ontwikkelen en verbeteren van software. Je wordt begeleid door een accountmanager die fungeert als jouw aanspreekpunt. Het team

Bekijk vacature »

Developer

Functie omschrijving In deze functie ga je werken als C# Developer. Jij gaat aan de slag met de volgende taken: Maatwerk software bouwen; Huidige softwareprojecten verder uitbouwen en optimaliseren; Ideeën van de klant omzetten naar handige oplossingen en tools; Bovenstaande doe je middels de Microsoft- stack: C#, ASP.NET en MVC/ Entity Framework. Ben je net afgestudeerd aan een HBO opleiding Informatica, aarzel dan niet om te solliciteren. Dit is namelijk de ideale startersfunctie! Bedrijfsprofiel Deze organisatie is gevestigd in de regio van Boxtel. Het is van oorsprong een familiebedrijf, die gestart zijn met het bouwen van websites. Dit is door

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 14:58:08
 
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.