User Tools

Site Tools


2019-07-09

Meeting Notes: Tue 9th July 2019

Welcome! This is the notes page for our third learn-to-code-from-scratch meeting in McPhabbs (downstairs). The plan is to run something like this every two weeks to get people up and running with basic web development and system admin.

Scratch Notes

Adding this to the top of your programs will force errors to be displayed (as opposed to hiding them from general users). It might help find the source of your problem if you get an 'Error 500'.

error_reporting(E_ALL);
ini_set("display_errors", 1);

Learn to Code: What we'll do

Just like last month, I'll spend some time taking anyone new through the basic set up steps. For those that are all set up and ready to go - we'll work on the following:

  1. Create a simple quiz page. When you visit it, it chooses a random question from a list you've supplied earlier and asks for the answer in a form then checks if it's correct or not.
  2. We'll build this using a simple array to begin with, then switch to getting the information from a database.

Getting Started: The basic steps

Skip through these if you're ready to start directly on the above, otherwise, these are the things we'll do, in order:

  1. Setting up an Amazon EC2 instance - once that is complete you now have your own server, and you can securely connect to it using Putty (or directly via Linux/macOS)
  2. Setting up your server with Apache and MySQL - the server doesn't have much software installed, just a basic terminal, these steps install Apache (the webserver) and MySQL (the database). At this step we also downloaded Adminer (a GUI to manage the database, similar to PHPMyAdmin). Then we went through the Amazon AWS interface, and set up Security Groups for the webserver (HTTP) - this is basically Amazon's equivalent of a firewall, we had to open a port to allow access to our IP in a web browser
  3. Writing your first hello world program - Now we started with our very first simple program.
  4. Editing files remotely on the server - Then we looked at ways to connect directly to the server and edit files using Notepad++ (or by mounting a remote directory in Linux/macOS)
  5. An example of a basic HTML form - We created a basic HTML form and showed how to access it's elements in PHP once it had been submitted
  6. Some example code in PHP to connect to your MySQL server - Some others went ahead and got the PHP code working that connects to a database and pulls data out, though we stopped there as we hadn't actually put data into the database yet - maybe next time!

Basic Quiz

This uses elements from the basic form that we've already seen. We'll start just using an array of questions, then move to populating an array from a database.

First, the questions. Create a file called questions.php and enter something like this:

<?php

$questions[0]['question'] = "What was originally considered to be the ninth planet from the Sun but after 1992 had its status as a large planet changed?";
$questions[0]['answer'] = "Pluto";

$questions[1]['question'] = "How many days are there in February in a leap year?";
$questions[1]['answer'] = "29";

$questions[2]['question'] = "Give the four initials of the organisation responsible for maintaining a database of drivers in Great Britain?";
$questions[2]['answer'] = "DVLA";

$questions[3]['question'] = "Which dance move, in which the dancer moves backwards, was made popular by Michael Jackson?";
$questions[3]['answer'] = "Moonwalk";

?>

Now, a basic page to choose a question at random, and wait for the answer, let's call it quiz.php:

<?php

require("questions.php");

$size_of_question_list = sizeof($questions);

// check if we are in the middle of answering a question (if we are, then
// the random_number will already be set), otherwise, choose a number

if(empty($_REQUEST['random_number'])) {
   $random_number = rand(0, $size_of_question_list);  // there is a bug here
} else {
   $random_number = $_REQUEST['random_number'];
}


?>

<h1>Quiz</h1>

<?php

if(!empty($_REQUEST['user_answer'])) {
   $user_answer = $_REQUEST['user_answer'];
   $question_id = $_REQUEST['random_number'];
   echo "<p>You answered '$user_answer' for Question #$question_id</p>";

   if($user_answer == $questions[$question_id]['answer']) {
      echo "Correct :)";
   } else {
      echo "Wrong :(";
   }

}

?>

<p><strong>Question: </strong><?= $questions[$random_number]['question']; ?></p>
<form method='post' action='quiz.php'>
<input type='hidden' name='random_number' value='<?= $random_number; ?>' />
<input type='text' name='user_answer' />
<input type='submit' name='answer_button' value='Answer'/>
</form>

<p><a href='quiz.php'>Another random question</a></p>

Getting the questions from a database

First, lets design a very simple database that can hold both the questions and answers. We'd normally have a table for questions and a table for answers (especially if some questions had multiple answers) but for now we'll stick to one table.

We need:

  1. A question ID (so we can match questions to answers) this'll be a number so we can use numbered arrays
  2. A question (a text field to record the question in) lets say 2000 characters long at most
  3. An answer (so we know if the user got it right) lets say 500 characters long at most
  4. A time/date of when the question was last asked

Why the time and date? This'll let the 'random experience' be a bit less repetitive. More on that later.

You can create this manually using the mysql client, or in Adminer (instructions on installing it are here).

A quick way to create the table in Adminer is to copy and paste this SQL into the SQL Command section:

CREATE TABLE `quiz_questions` (
  `question_id` int NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `question` varchar(2000) NOT NULL,
  `answer` varchar(500) NOT NULL,
  `last_asked` datetime NOT NULL
);

That'll create the table for you.

And now, this SQL will add some test questions to it (or you can enter some yourself by clicking on the newly created “quiz_questions” table and clicking 'New Item'):

INSERT INTO `quiz_questions` (`question`, `answer`, `last_asked`)
VALUES ('What was originally considered to be the ninth planet from the Sun but after 1992 had its status as a large planet changed?', 'Pluto', now());
INSERT INTO `quiz_questions` (`question`, `answer`, `last_asked`)
VALUES ('How many days are there in February in a leap year?', '29', now());
INSERT INTO `quiz_questions` (`question`, `answer`, `last_asked`)
VALUES ('Give the four initials of the organisation responsible for maintaining a database of drivers in Great Britain?', 'DVLA', now());
INSERT INTO `quiz_questions` (`question`, `answer`, `last_asked`)
VALUES ('Which dance move, in which the dancer moves backwards, was made popular by Michael Jackson?', 'Moonwalk', now());

Let's create a new file, this one called questions_from_db.php - we'll be using some code from the connecting to your DB sample:

<?php 

$host = "localhost";
$username = "coding_user";
$password = "cheese";
$db_name = "coding"; 

$mysql_string = "mysql:host=$host;dbname=$db_name";

$db_connection = new PDO($mysql_string, $username, $password);

$sql = "select * from quiz_questions";
$rs = $db_connection->query($sql);
$rows = $rs->fetchAll(PDO::FETCH_ASSOC);

foreach($rows as $row) {
  $questions[$row['question_id']]['question'] = $row['question'];
  $questions[$row['question_id']]['answer'] = $row['answer'];

}

?>

Putting it all together

Now, if everything has went to plan, you can replace the:

require("questions.php")

line from your quiz.php file with:

require("questions_from_db.php")

and now, when you enter new questions to the database, they'll be available in your quiz.

We finished?

This might be too much for one session, but the great thing about the web is how easy it is for us to connect with each other.

You can make your questions, in your database, available to anyone else's quiz program with this bit of code, call it export.php:

<?php
header("Content-Type: application/json");
require("questions_from_db.php");
echo json_encode($questions);
?>

Now, you can share your quiz URL with others. The full URL will be http://YOUR_IP_ADDRESS/export.php

So, back to the quiz.php file (actually anyone else's quiz.php) instead of the line that reads

require("questions.php")

This code will connect to a fellow coder's IP address, download their quiz questions and format them in a way your program can understand them:

$json_data = file_get_contents("http://YOUR_IP_ADDRESS/export.php");
$questions = json_decode($json_data, true);

Attendees

  1. Abdullah Khan
  2. Aidan Rooney
  3. Aileen McKenzie
  4. Alan Kennedy
  5. Allan Mullen
  6. Angel
  7. Ashir (Organiser)
  8. Ben Davidson
  9. Ben Ross
  10. Benami Ark
  11. Callum Tennant
  12. Cesar Del Villar
  13. Connor Bell
  14. Erika Anderson
  15. Jack Hood
  16. John Mason
  17. Karola Jehodek
  18. Kathryn M
  19. MaryF
  20. meenakshi
  21. Mike Nelson
  22. Mohamed Ali
  23. Nasir Hussain
  24. Neil McKillop (Event Organiser)
  25. Neil Wylie
  26. Pavlo
  27. Rameez
  28. Stephen Taylor
  29. Victoria B
2019-07-09.txt · Last modified: 2019/07/21 17:24 by ed