Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: Kysely & Adminpaneeli (mysql)

Tontsa-san [23.07.2006 14:56:53]

#

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>";
?>

Tinqe [31.07.2006 00:22:01]

#

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 ( '' )

Tontsa-san [31.07.2006 11:36:19]

#

Kiitos kommentista, homma korjattu.
Sekä koodiin lisätty sisennykset.

Myös esimerkkiversion kyselystä laitoin näkyville:
http://tontsa.arkku.net/kysely.php

Draiz [01.08.2006 12:01:49]

#

Missä on koodin kommentointi? ;)

Tontsa-san [01.08.2006 13:42:16]

#

Pitänee lisätä kommentointia nyt kun sain sen tänne näkyviin. :D

edit. nyt pitäisi olla kommentteja, onko tarpeeksi? :)

Clacier [15.08.2008 19:34:17]

#

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 :(

Horny The Horrible [13.01.2010 08:34:04]

#

salanasa on sanasala. Se määriteltiin alussa.

$admin_salasana = "sanasala";                       // Määrittää adminin salasanan.

Edit: voit muokata sen sellaiseksi kuin haluat.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta