Koodi sisältää kolme tiedostoa (kysely_admin.php, kysely.php, sekä install.php). Tämän lisäksi sinun pitää luoda tiedosto nimeltä mysql.php ja antaa sille oikeudet 777 (chmod).
Pakettina koodin saa ladattua osoitteesta http://tontsa.arkku.net/dl/koodivinkki-kysely.zip
Olen testannut koodia moneen kertaan, mutta kuten kaikki tietävät, on mahdollista että siinä on myös aukkoja/bugeja. Siksi toivonkin että näistä ilmoitettaisiin minulle kommentilla tai ircissä Tontsa-san@Quakenet.
Tämä on ensimmäinen koodini Ohjelmointiputkaan, Otan mielelläni vastaan kommentteja, palautetta ja kehitysehdotuksia koskien koodia.
kysely_admin.php
<?php $admin_salasana = "sanasala"; // Määrittää adminin salasanan. include("mysql.php"); // Sisällyttää mysql.php:n session_start(); // Aloittaa session. $do = $_GET["do"]; if ($do == login) { // Jos käyttäjä yrittää kirjautua. if ($_POST["salasana"] == $admin_salasana) { // Jos salasana on oikein. $_SESSION["admin"] = 1; // Lisää sessioniin tunnuksen "admin". } else { echo "<font color=\"red\"> <p> Väärä salasana </p> </font>"; } } if ($do == "logout") // Käyttäjä yrittää kirjautua ulos. unset($_SESSION["admin"]); // Poistetaan sessionista tunnus "admin". if (!$_SESSION["admin"]) { // Jos käyttäjä EI ole kirjautunut. echo "<p> Kirjaudu sisään: </p> // Kirjautumisformi. <form method=\"post\" action=\"kysely_admin.php?do=login\"> Salasana: <input type=\"password\" name=\"salasana\"> <br> <p> <input type=\"submit\" value=\"Kirjaudu\"> </p> </form>"; exit; } echo "<p> Admin: </p> <p> <a href=\"kysely_admin.php?do=logout\"> Kirjaudu ulos </a> <br> <a href=\"kysely_admin.php?do=ohje\"> Ohje </a> <br>"; if (!$mysql) echo "<b> <a href=\"kysely_admin.php?do=install\">Luo taulut tietokantaan </a> </b> <br>"; if ($mysql) { echo "<a href=\"kysely_admin.php?do=new\"> Luo uusi kysely </a> <br> <a href=\"kysely_admin.php?do=selaa\"> Selaa kyselyitä </a> <br> <a href=\"kysely_admin.php?do=kysely\"> Näytä tämänhetkinen kysely</a> </p>"; } if ($do == "install") { // Lisätään tietoturvaa. Varmistetaan, että // installia ei avata ellei kysely_admin.php ole auki. define('install', TRUE); include("install.php"); } if ($do == "kysely") { // Käyttäjä haluaa esikatsella kyselyä. $included = 1; include("kysely.php"); // Sisällytetään kysely. } if ($do == "selaa") { $poista = $_GET["poista"]; $varmistus = $_GET["varmistus"]; echo "<p>Listataan kaikki kyselyt uusimmasta vanhimpaan:</p> Toiminnot: <br> - <a href=\"kysely_admin.php?do=selaa&poista=all\">Poista kaikki</a><br> ( Poistaa kaikki paitsi nykyisen kyselyn )"; if ($poista == "all") { if ($varmistus == 1) { @mysql_query("DELETE from kyselyt where kaytossa = '0'", $mysql); echo "<p> Poistettiin kaikki kyselyt tietokannasta. </p>"; } else { echo "<p> Haluatko varmasti poistaa kyselyt? <br> - <a href=\"kysely_admin.php?do=selaa&poista=" . $poista . "&varmistus=1\">Kyllä</a> <br> - <a href=\"kysely_admin.php?do=selaa\">Ei</a>"; exit; } } else { if (!mysql_query("DELETE from vastaukset where kyselyn_id = '$poista'", $mysql)) echo "Kyselyn poistaminen epäonnistui"; @mysql_query("DELETE from kyselyt where id = '$poista'", $mysql); @mysql_query("DELETE from vastaukset where kyselyn_id = '$poista'", $mysql); } $haku = mysql_query("SELECT * from kyselyt ORDER BY id desc", $mysql); for ($i = 0; $i < mysql_num_rows($haku); $i++) { $id = mysql_result($haku, $i, "id"); $kysymys = mysql_result($haku, $i, "kysymys"); $aania = mysql_result($haku, $i, "vastauksia"); $kaytossa = mysql_result($haku, $i, "kaytossa"); if ($kaytossa) echo "<b>"; echo "<p>#" . $id . ": " . $kysymys . "</b> - <a href=\"kysely_admin.php?do=selaa&poista=" . $id . "\">poista</a>"; echo "</p>"; $query = mysql_query("SELECT * from vastaukset where kyselyn_id = '$id'", $mysql); for ($j = 0; $j < mysql_num_rows($query); $j++) { $vastaus = mysql_result($query, $j, "vastaus"); $vastauksia = mysql_result($query, $j, "vastauksia"); if ($vastauksia == "0") echo $vastaus . " - 0%<br>"; if ($vastauksia <> "0") echo $vastaus . " - " . round(100 * $vastauksia / $aania) . "% <br>"; } echo "<br> Ääniä yhteensä: " . $aania; } } if ($do == "new") { // Käyttäjä haluaa luoda uuden kyselyn. if ($_POST["kysymys"]) { $kysymys = $_POST["kysymys"]; mysql_query("UPDATE kyselyt set kaytossa = '0' where kaytossa = '1'", $mysql); if ($_POST["vastaus1"] && $_POST["vastaus2"]) { mysql_query("INSERT into kyselyt (kysymys, vastauksia, kaytossa) values ('$kysymys','0','1')", $mysql); $haku = mysql_query("SELECT * from kyselyt where kysymys = '$kysymys'", $mysql); while ($rivi = mysql_fetch_array($haku, MYSQL_ASSOC)) { $kyselyn_id = $rivi["id"]; } $vastaus1 = $_POST["vastaus1"]; $vastaus2 = $_POST["vastaus2"]; mysql_query("INSERT into vastaukset (kyselyn_id, vastauksia, vastaus) values ('$kyselyn_id','0','$vastaus1')", $mysql); mysql_query("INSERT into vastaukset (kyselyn_id, vastauksia, vastaus) values ('$kyselyn_id','0','$vastaus2')", $mysql); if ($_POST["vastaus3"]) { $vastaus3 = $_POST["vastaus3"]; mysql_query("INSERT into vastaukset (kyselyn_id, vastauksia, vastaus) values ('$kyselyn_id','0','$vastaus3')", $mysql); } if ($_POST["vastaus4"]) { $vastaus4 = $_POST["vastaus4"]; mysql_query("INSERT into vastaukset (kyselyn_id, vastauksia, vastaus) values ('$kyselyn_id','0','$vastaus4')", $mysql); } mysql_query("DELETE from kysely_ips", $mysql); echo "<p>Tekemäsi kysely:</p>"; @include("kysely.php"); exit; } } echo "<p><b>HUOM!</b> Uusi kysely nollaa vanhan kyselyn tilastot, <br> mutta tallentaa tämänhetkiset tiedot. Vähintään kaksi vastausvaihtoehtoa,<br> jos haluat alle neljä, voit jättää muut vaihtoehdot tyhjäksi.</p> <form method=\"post\" action=\"kysely_admin.php?do=new\"> Kysymys: <input type=\"text\" name=\"kysymys\"><br><br> Vastaukset: <OL> <LI><input type=\"text\" name=\"vastaus1\"> <LI><input type=\"text\" name=\"vastaus2\"> <LI><input type=\"text\" name=\"vastaus3\"> <LI><input type=\"text\" name=\"vastaus4\"> </OL> <input type=\"submit\" value=\"Luo kysely\"> </form> "; } if ($do == "ohje") { // Käyttäjä haluaa tarkastella ohjeita. echo "Kysely-adminpaneelin ohjeet: <ol> <li> Jos sinulla on ongelmia kyselyn asennuksessa tarkista seuraavat asiat: <ol class=\"a\"> <li> Olet luonut mysql.php tiedoston. <li> Olet antanut sille oikeudet (chmod) 777 <li> Tarkista antamasi mysql-tiedot <li> Jos mikään ei auta, niin kysy ohjeita minulta Quakenetissä /msg Tontsa-san </ol> <br> <li> Ongelmia uuden kyselyn teossa: <ol class=\"b\"> <li> Tarkista että olet täyttänyt tarvittavat kentät <li> Muussa tapauksessa kysy apua minulta Quakenetissä /msg Tontsa-san </ol> </ol> <br><br> Jos sinulla on muuta kysyttävää scriptistä, tee se Quakenetissä<br> lähettämällä minulle viestiä: /msg Tontsa-san. Ja jos mahdollista, lisää<br> jonnekin Copyright merkintä, tai linkki ohjelmointiputkan koodivinkkiin."; } ?>
kysely.php
<?php @include("mysql.php"); // Sisällytetään mysql.php $user_ip = $_SERVER["REMOTE_ADDR"]; // Haetaan käyttäjän IP muuttujaan. $v = $_GET["v"]; $haku = mysql_query("SELECT * from kyselyt where kaytossa = '1'", $mysql); while ($rivi = mysql_fetch_array($haku, MYSQL_ASSOC)) { $kyselyn_id = $rivi["id"]; $kysymys = $rivi["kysymys"]; $aania = $rivi["vastauksia"]; } $haku = mysql_query("SELECT * from kysely_ips where ip = '$user_ip'", $mysql); while ($rivi = mysql_fetch_array($haku, MYSQL_ASSOC)) $check_ip = $rivi["ip"]; if ($v && !$check_ip) { // Käyttäjä vastaa kyselyyn // Tallennetaan tiedot tietokantaan. mysql_query("INSERT into kysely_ips (ip) values ('$user_ip')", $mysql); @mysql_query("UPDATE kyselyt set vastauksia = vastauksia + 1 where id = '$kyselyn_id'", $mysql); @mysql_query("UPDATE vastaukset set vastauksia = vastauksia + 1 where vastaus_id = '$v'", $mysql); $aania = $aania + 1; } if (!$kysymys) die("Ei kyselyä"); // Jos kyselyä ei ole, "die: Ei kyselyä" echo "<p>" . $kysymys . "</p>"; $query = mysql_query("SELECT * from vastaukset where kyselyn_id = '$kyselyn_id'", $mysql); for ($i = 0; $i < mysql_num_rows($query); $i++) { $vastaus = mysql_result($query, $i, "vastaus"); $vastauksia = mysql_result($query, $i, "vastauksia"); $vastaus_id = mysql_result($query, $i, "vastaus_id"); if ($check_ip || $_SESSION["admin"] || $v) { if ($vastaus_id == $v) $vastauksia == $vastauksia + 1; if ($vastauksia == "0") echo $vastaus . " - 0%<br>"; if ($vastauksia <> "0") echo $vastaus . " - " . round(100 * $vastauksia / $aania) . "%<br>"; } else { if ($vastauksia == "0") echo "<a href=\"kysely.php?v=" . $vastaus_id . "\">" . $vastaus . "</a> - 0%<br>"; if ($vastauksia <> "0") echo "<a href=\"kysely.php?v=" . $vastaus_id . "\">" . $vastaus . "</a> - " . round($vastauksia / $aania * 100) . "%<br>"; } } echo "<br>Ääniä yhteensä: " . $aania; if (!$_SESSION["admin"]) // Jos admin ei ole kirjautuneena echo "<p> <a href=\"kysely_admin.php\">Admin</a>"; ?>
install.php
<?php defined('install') or header('Location: kysely_admin.php'); if ($mysql) { echo "<p><b>Tarvittava asennus on jo tehty.</b></p>"; exit; } $mysql_osoite = $_POST["mysql_osoite"]; // Haetaan postin tiedot muuttujiin. (osoite) $mysql_tunnus = $_POST["mysql_tunnus"]; // mysql-tunnus $mysql_passwd = $_POST["mysql_passwd"]; // mysql:n salasana. $mysql_db = $_POST["mysql_db"]; // Valittava tietokanta. if ($mysql_osoite) { $mysql = @mysql_connect($mysql_osoite, $mysql_tunnus, $mysql_passwd) or die("<p>Yhdistäminen ei onnistunut!<br> <a href=\"kysely_admin.php?do=install\"> Takaisin </a>"); mysql_select_db($mysql_db, $mysql) or die("<p>Tietokantaa ei löytynyt!<br> <a href=\"kysely_admin.php?do=install\"> Takaisin </a>"); if ($mysql) echo "<p><b>Yhdistäminen tietokantaan onnistui!<br>"; // Käyttäjä antoi oikeat tiedot. // Yritetään luoda taulut tietokantaan // Sekä tallennetaan tiedot mysql.php:hen mysql_query("CREATE TABLE if not exists kyselyt ( id INT(11) default NULL auto_increment, PRIMARY KEY(id), kysymys text, vastauksia INT(11) default NULL, kaytossa INT(1) default NULL)") or die("Virhe luodessa taulua 'kyselyt'<br> <a href=\"kysely_admin.php?do=install\"> Takaisin </a>"); mysql_query("CREATE TABLE if not exists vastaukset ( vastaus_id INT(11) NULL auto_increment, PRIMARY KEY(vastaus_id), kyselyn_id INT(11) default NULL, vastauksia INT(11) default NULL, vastaus text)") or die("Virhe luodessa taulua 'vastaukset'<br> <a href=\"kysely_admin.php?do=install\"> Takaisin </a>"); mysql_query("CREATE TABLE if not exists kysely_ips ( ip text)") or die("Virhe luodessa taulua 'kysely_ips'<br> <a href=\"kysely_admin.php?do=install\"> Takaisin </a>"); $tiedosto = 'mysql.php'; $tiedot = "<?php\n \$mysql = mysql_connect(" . $mysql_osoite . "," . $mysql_tunnus . "," . $mysql_passwd . ");\n mysql_select_db(" . $mysql_db . ", \$mysql); \n ?>"; if (is_writable($tiedosto)) { $avattu = fopen($tiedosto, "w"); fwrite($avattu, $tiedot); fclose($avattu); } else { echo "Tiedostoon mysql.php ei voi kirjoittaa, oletko muistanut tehdä ja chmodata sen? (777)"; exit; } echo "Taulut luotu onnistuneesti - Tiedot tallennettu.</b><br> // Kyselyn asennus onnistui. <a href=\"kysely_admin.php\">Adminoinnin etusivulle</a>"; exit; } echo "<p> Luo taulut tietokantaan </p> <p> Tämä scripti luo tietokantaasi taulut, joita tarvitset käyttääksesi kyselyä,<br> sekä ottaa muistiin mysql:ään tarvittavat tiedot.</p> Tietokantojen luonti: <p><form method=\"post\" action=\"kysely_admin.php?do=install\"> Tietokannan osoite: <input type=\"text\" name=\"mysql_osoite\" value=\"localhost\"><br> Tietokannan tunnus: <input type=\"text\" name=\"mysql_tunnus\"> <br> Tietokannan salasana: <input type=\"password\" name=\"mysql_passwd\"> <br><br> Tietokannan nimi: <input type=\"text\" name=\"mysql_db\"> <br><br> <input type=\"submit\" value=\"Tee taulut\"> </p>"; ?>
Tuollaisenaan ei lisää uusia kyselyitä, sillä uuden kyselyn lisäyksessä yritetään jättää kyselyn ID tyhjäksi, vaikka on auto_increment käytössä. Koodi rupeaa toimimaan korvaamalla kysely_admin.php:ssä:
mysql_query("INSERT into kyselyt (id, kysymys, vastauksia, kaytossa) values ('','$kysymys','0','1')", $mysql);
koodilla
mysql_query("INSERT INTO kyselyt (kysymys, vastauksia, kaytossa) values ('$kysymys','0','1')", $mysql);
Eli tuo id kentästä tyhjä arvo pois ( '' )
Kiitos kommentista, homma korjattu.
Sekä koodiin lisätty sisennykset.
Myös esimerkkiversion kyselystä laitoin näkyville:
http://tontsa.arkku.net/kysely.php
Missä on koodin kommentointi? ;)
Pitänee lisätä kommentointia nyt kun sain sen tänne näkyviin. :D
edit. nyt pitäisi olla kommentteja, onko tarpeeksi? :)
heiheiheii apua. lisäsin ton mun sivuille, mikä on salasana ?? annoin 777 oikeudet ja tein kaiken niinku piti, ja ne toimii sillei mut en tiiä salasanaa :(
salanasa on sanasala. Se määriteltiin alussa.
$admin_salasana = "sanasala"; // Määrittää adminin salasanan.
Edit: voit muokata sen sellaiseksi kuin haluat.
Aihe on jo aika vanha, joten et voi enää vastata siihen.