Avatar billede tobrukDk Novice
11. december 2013 - 12:32 Der er 6 kommentarer og
1 løsning

Gentage fejlen flere gange!

Hej

Er lige pt i gang med at udarbejde et spørgsmål side, og det er sådan at hvis nogle af dem er intet indhold i så skal komme frem og sige "Husk indhold ved" den her og den her, og ikke at den siger "Husk indhold ved" ved den "Husk indhold ved" ved den osv..

Du kan se hvad jeg mener her:
http://billedeupload.dk/?v=cjgKY.png

så den skal komme frem og sige Husk indhold ved - En pige - En ko osv, men det vil sige at den skal ikke komme og lave en - når det sidste ord er brugt eller taget :)

Du kan se hvad jeg mener her:


<?php
if(isset($_POST["send"]))
{
    if($_POST["opgave"][$id] == "")
    {
        echo "Husk indhold ved " . $rigtigsvar;
    }
    else
    {
        $alt = $_POST["opgave"][$id];
        if($rigtigsvar == $alt)
        {
            //ligger ind i databasen
        }
        else
        {
            echo "Din fejl var: " . $_POST["opgave"][$id];
        }
    }
}
?>
Avatar billede sstaunb Nybegynder
11. december 2013 - 15:21 #1
Hej,

Det ser ud som om du er ved at validere en FORM ift. rette indhold af formen, men best-practice omkring dette er at anvende javascript til at validere formen inden folk får lov til at trykke på "Send" / Submit knappen.

Det bedste er at lade klienten om at udfylde alle data før du indsender det til server. Du kan se nogle javascript eksempler her:

http://www.w3schools.com/js/js_form_validation.asp

Held og lykke.

Søren
Avatar billede tobrukDk Novice
11. december 2013 - 15:28 #2
Ååhh det var en god ide, Jeg tror bare det bliver jquery :)
Avatar billede sstaunb Nybegynder
11. december 2013 - 15:32 #3
Endnu bedre hvis du kender JQuery. Svært at vide hvor dygtige folk her er :)
Avatar billede tobrukDk Novice
11. december 2013 - 15:36 #4
jeg har arbejdet lidt med jquery men har ikke gjort det i stykke tid da jeg ikke rigtig skulle bruge det.
Avatar billede arne_v Ekspert
11. december 2013 - 17:05 #5
Det er ikke best practice at checke client side.

Det er best practice at checke baade client side og server side.

Checket client side er for at hjaelpe brugeren.

Checket server side er for sikre data integritet og sikkerhed.
Avatar billede tobrukDk Novice
11. december 2013 - 17:46 #6
Det ved jeg godt :)

#arne_v hvordan vil du løse den her


<?php
            if ($stmt = $this->mysqli->prepare('SELECT id, rigtigsvar FROM opgave WHERE getid = ? ORDER BY RAND() LIMIT 15'))
            {
                $stmt->bind_param('i', $id);
                $id = $_GET['id'];
                $stmt->execute();
                $stmt->bind_result($id, $rigtigsvar);
                while ($stmt->fetch()) {
                    if(isset($_POST["send"]))
                    {
                        $alt = $_POST["opgave"][$id];
                        if($rigtigsvar == $alt)
                        {
                            $godkendt = 1;
                        }
                    }
                ?>
                <tr>
                    <td><?php echo $rigtigsvar;?></td>
                    <td><input type="text" name="opgave[<?php echo $id;?>]" maxlength="190" class="tekst"></td>
                </tr>
                <?php
                }
                ?>
                <tr>
                    <td></td>
                    <td><input type="submit" name="send" value="Send" class="click updater"></td>
                </tr>
                <?php
                $stmt->close();
            }
            if($godkendt == 1)
            {
                if($stm = $this->mysqli->prepare(' UPDATE bruger SET point=point++10 WHERE id=?' ))
                {
                    $stm->bind_param('i', $id);
                    $id = $_SESSION["id"];
                    $stm->execute();
                   
                    ?>
                    <script language="javascript" type="text/javascript"> 
                        window.location.href = "/opgaver/"; 
                    </script>
                    <?php
                }   
            }
        ?>
Avatar billede arne_v Ekspert
13. december 2013 - 03:28 #7
Jeg ville totalt omstrukturere koden.

* korte funktioner
* ingen mix af HTML og logik
* ingen mix af logik og database
* og absolut ingen mix af HTML og database

Det er ikke saerligt realistisk at skriv den slags koden uden brug af framework i en enkelt PHP fil og jeg er slet ikke god til PHP.

Men til inspiration:


<?php
/*
Database setup:
CREATE TABLE quiz(
    id INTEGER NOT NULL,
    question VARCHAR(255) NOT NULL,
    answer VARCHAR(10) NOT NULL,
    PRIMARY KEY(id)
);
INSERT INTO quiz VALUES(1, 'What is 9*8', '72');
INSERT INTO quiz VALUES(2, 'What country has most citizens A) Denmark B) Sweden', 'B');
INSERT INTO quiz VALUES(3, 'Is a polar bear white yes or no', 'yes');
INSERT INTO quiz VALUES(4, 'What is the danish top level domain', '.dk');
INSERT INTO quiz VALUES(5, 'What brand is a Mondeo A) Ford B) Opel', 'A');
CREATE TABLE users (
    id INTEGER NOT NULL,
    name VARCHAR(32) NOT NULL,
    points INT NOT NULL,
    PRIMARY KEY(id)
);
INSERT INTO users VALUES(1, 'Arne', 0);
*/

// basic data structure
class Question {
    public $Id;
    public $Question;
    public $Answer;
    public $Guess;
    public function __construct($id, $question, $answer) {
        $this->Id = $id;
        $this->Question = $question;
        $this->Answer = $answer;
        $this->Guess = '';
    }
};

// HTML input and output
define('PAGE_TEMPLATE',
'<html>
<head>
<title>Quiz</title>
</head>
<body>
<h1>Quiz</h1>
User %s : %d points
<form method="POST">
%s
<input type="submit" value="Submit">
</form>
%s
</body>
</html>'
);
define('QUESTION_TEMPLATE',
'%s? <input type="text" name="q%d" value="%s">%s<br>'
);

function display_quiz($quiz, $user, $points, $noteempty, $footer) {
    $qtxt = '';
    for($i = 0; $i < count($quiz); $i++) {
        $qtxt = $qtxt . sprintf(QUESTION_TEMPLATE, $quiz[$i]->Question, $quiz[$i]->Id, $quiz[$i]->Guess, $noteempty && $quiz[$i]->Guess === '' ? '<---- Fill out' : '') . "\r\n";
    }
    $res = sprintf(PAGE_TEMPLATE, $user, $points, $qtxt, $footer);
    return $res;
}

function update_quiz($quiz) {
    foreach($quiz as $q) {
        if(isset($_POST['q' . $q->Id])) {
            $q->Guess = $_POST['q' . $q->Id];
        }
    }
}

// database definition
define('MYSQL_HOST', 'localhost');
define('MYSQL_USER', 'root');
define('MYSQL_PASSWORD', '');
define('MYSQL_DB', 'test');

// database access
function load_quiz($nquestions) {
    $con = new mysqli(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DB);
    if(mysqli_connect_errno()) die(mysqli_connect_error());
    if($stmt = $con->prepare('SELECT id, question, answer FROM quiz ORDER BY RAND() LIMIT ?')) {
        $stmt->bind_param('i', $nquestions);
        $stmt->execute();
        $stmt->bind_result($id, $question, $correctanswer);
        $res = array();
        while ($stmt->fetch()) {
            $res[] = new Question($id, $question, $correctanswer);
        }
        $stmt->close();
    } else {
        die($con->error);
    }
    $con->close();
    return $res;
}

function load_points($user) {
    $con = new mysqli(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DB);
    if(mysqli_connect_errno()) die(mysqli_connect_error());
    if($stmt = $con->prepare('SELECT points FROM users WHERE name = ?')) {
        $stmt->bind_param('s', $user);
        $stmt->execute();
        $stmt->bind_result($res);
        if(!$stmt->fetch()) {
            die("$user does not exist");
        }
        $stmt->close();
    } else {
        die($con->error);
    }
    $con->close();
    return $res;
}

function add_points($delta) {
    $con = new mysqli(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DB);
    if(mysqli_connect_errno()) die(mysqli_connect_error());
    if($stmt = $con->prepare('UPDATE users SET points = points + ?')) {
        $stmt->bind_param('d', $delta);
        $stmt->execute();
        $stmt->close();
    } else {
        die($con->error);
    }
    $con->close();
}

// business logic
function quiz_completed($quiz) {
    foreach($quiz as $q) {
        if($q->Guess === '') {
            return false;
        }
    }
    return true;
}

function quiz_passed($quiz) {
    $correct = 0;
    foreach($quiz as $q) {
        if($q->Guess === $q->Answer) {
            $correct++;
        }
    }
    return $correct >= CORRECT_ANSWERS_TO_SCORE;
}

// session handling
function save_quiz($quiz) {
    session_start();
    $_SESSION['quiz'] = $quiz;
}

function reload_quiz() {
    session_start();
    return $_SESSION['quiz'];
}

// quiz definition
define('QUESTIONS_TO_SHOW', 3);
define('CORRECT_ANSWERS_TO_SCORE', 2);

// main
$user = 'Arne'; // from somewhere - out of scope of demo
if($_SERVER['REQUEST_METHOD'] === 'GET') {
    $quiz = load_quiz(QUESTIONS_TO_SHOW);
    echo display_quiz($quiz, $user, load_points($user), false, '');
    save_quiz($quiz);
} else if($_SERVER['REQUEST_METHOD'] === 'POST') {
    $quiz = reload_quiz();
    update_quiz($quiz);
    if(quiz_completed($quiz)) {
        if(quiz_passed($quiz)) {
            add_points(1);
            echo display_quiz($quiz, $user, load_points($user), false, 'Passed');
        } else {
            echo display_quiz($quiz, $user, load_points($user), false, 'Failed');
        }
    } else {
        echo display_quiz($quiz, $user, load_points($user), true, '');
    }
} else {
    die('Unknown method');
}
?>
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester