Skip to content

Instantly share code, notes, and snippets.

@Burgestrand
Created April 26, 2010 16:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Burgestrand/379554 to your computer and use it in GitHub Desktop.
Save Burgestrand/379554 to your computer and use it in GitHub Desktop.
Namninsamlingsscript
<?php
require './model.php';
$model = new Namninsamling;
/**
* Returnerar det givna indexet ur en array om det finns, annars $default
*
* @param array
* @param mixed $index
* @param mixed $default
* @return mixed
*/
function get(array $arr, $index, $default = NULL)
{
return array_key_exists($index, $arr) ? $arr[$index] : $default;
}
/**
* Returnerar en säker sträng att skickas ut på en HTML-sida
*
* @param string
* @return string
*/
function escape($string)
{
return htmlspecialchars($string, ENT_QUOTES);
}
// Försöker spara namnet/emailen i databasen
if ($_POST)
{
try
{
$model->add(get($_POST, 'name'), get($_POST, 'email'));
}
catch (Exception $e)
{
$error = $e->getMessage();
}
$query = empty($error) ? array('success' => 'Ditt namn har sparats!') : array('error' => rawurlencode($error));
$query = http_build_query($query);
header("Location: http://{$_SERVER['HTTP_HOST']}/?{$query}", TRUE, 303);
}
?><!DOCTYPE html>
<html>
<head>
<title>Namninsamling</title>
<link rel="stylesheet" href="http://www.w3.org/StyleSheets/Core/Steely" type="text/css" media="screen">
<style type="text/css" media="screen">
body
{
color: #333;
}
h1, h2
{
border-bottom: 1px solid;
}
.section.main
{
margin: 0 auto;
position: relative;
width: 32em;
}
form dt
{
margin: .5em 0 0;
}
form dd
{
color: #666;
margin: 0;
}
form input
{
box-sizing: border-box; /* CSS3 */
-moz-box-sizing: border-box; /* ff2 */
-ms-box-sizing: border-box; /* ie8 */
-webkit-box-sizing: border-box; /* safari3 */
-khtml-box-sizing: border-box; /* konqueror */
display: block;
font: inherit;
font-weight: normal;
width: 100%;
}
form input[type="text"]
{
margin: .2em 0 0;
padding: .2em;
}
.error, .success
{
border: .2em solid;
padding: .5em;
}
.error
{
background: #B60016;
border-color: #333;
color: white;
}
.success
{
background: #00F02D;
border-color: #333;
font-weight: bold;
color: black;
}
ol li
{
list-style-position: inside;
margin: 0;
}
</style>
</head>
<body>
<div class="section main">
<h1>Namninsamling</h1>
<p>
Skriv in ditt namn och mailadress så registreras den hos oss.
</p>
<form action="" method="post" accept-charset="utf-8">
<dl>
<dt><label>Namn <input type="text" name="name" value="<?php echo get($_POST, 'name') ?>"></label></dt>
<dd>
Ditt namn. Detta kommer att visas i listan nedan.
</dd>
<dt><label>E-mail <input type="text" name="email" value="<?php echo get($_POST, 'email') ?>"></label></dt>
<dd>
Din mailadress. Den kommer <strong>inte</strong> att synas för några andra
än oss som driver siten, som kommer använda den för att skicka utskick till dig.
</dd>
</dl>
<?php
if ($error = get($_GET, 'error'))
{
printf('<p class="error">%s</p>', escape(rawurldecode($error)));
}
elseif ($success = get($_GET, 'success'))
{
printf('<p class="success">%s</p>', escape(rawurldecode($success)));
}
?>
<p>
<input type="submit" value="Skriv upp mig">
</p>
</form>
<h2>Uppskrivna personer hittils</h2>
<?php $names = $model->names();
if ( ! empty($names)): ?>
<p>
Vi har <?php echo number_format(count($names), 0, ',', ' ') ?> personer som har skrivit upp sig.
Här är namnen på de 30 senaste.
</p>
<ol>
<?php foreach ($names as $name): ?>
<li><?php echo escape($name) ?></li>
<?php endforeach; ?>
</ol>
<?php else: ?>
<p>
Inga har skrivit upp sig hittils. Du får gärna bli den första.
</p>
<?php endif; ?>
</div>
</body>
</html>
<?php
if (version_compare(phpversion(), '5.3', '<'))
{
trigger_error('PHP är version ' . phpversion() . ' men minst PHP 5.3 krävs!');
}
class Namninsamling
{
protected $_db;
public function __construct($filename = './database.sqlite3')
{
$this->_db = new SQLite3($filename);
$this->_setup();
}
/**
* Lägger in de tabeller som behövs i databasen om de inte existerar.
*
* @return Namninsamling
*/
protected function _setup()
{
$queries = array(
"CREATE TABLE IF NOT EXISTS namninsamling (
id INTEGER PRIMARY KEY,
namn VARCHAR(255),
email VARCHAR(254)
)",
"CREATE UNIQUE INDEX IF NOT EXISTS unique_email ON namninsamling (email)"
);
foreach ($queries as $query)
{
if ( ! $this->_db->query($query))
{
throw new ErrorException($this->_db->lastErrorMsg());
}
}
return $this;
}
/**
* Returnera antalet uppskrivna.
*/
public function count()
{
return max(0, $this->_db->querySingle('SELECT id FROM namninsamling ORDER BY id DESC LIMIT 1'));
}
/**
* Returnerar posterna i databasen som en array
*
* @param int limit hur många namn som ska hämtas
* @param int offset vart den ska börja hämta namnen
* @return array
*/
public function as_array($limit = 30, $offset = 0)
{
$limit = max(1, (int) $limit);
$offset = max(0, (int) $offset);
// Find
$result = $this->_db->query("SELECT * FROM namninsamling ORDER BY id DESC LIMIT {$limit} OFFSET {$offset}");
// Extract
$rows = array();
while ($row = $result->fetchArray(SQLITE3_ASSOC))
{
$rows[] = $row;
}
// Return
return $rows;
}
/**
* Returnerar *bara* namn som har skrivits upp
*
* @param int limit hur många som ska hämtas
* @param int offset vart den ska börja hämta namnen
* @return array
*/
public function names($limit = 30, $offset = 0)
{
$rows = $this->as_array($limit, $offset);
return array_map(function ($arr) {
return $arr['namn'];
}, $rows);
}
/**
* Skriver in en ny person
*
* @param string name
* @param string email
* @return Namninsamling
*
* @throws InvalidArgumentException
*/
public function add($name, $email)
{
if (empty($name))
{
throw new InvalidArgumentException('Skriv in ett namn så är du bussig.');
}
elseif ( ! preg_match('#\A[^@]+@[^\.]+\..+\z#', $email))
{
throw new InvalidArgumentException('Var vänlig ange en giltig mailadress.');
}
// Kontrollera om mailen finns i databasen
$exists = $this->_db->querySingle(sprintf("SELECT COUNT(*) FROM namninsamling WHERE email = '%s'", $this->_db->escapeString($email)));
if ($exists > 0)
{
throw new ErrorException("Din mail är redan uppskriven, men tack ändå!");
}
$stmt = $this->_db->prepare('INSERT INTO namninsamling (namn, email) VALUES (:name, :email)');
$stmt->bindValue(':name', $name, SQLITE3_TEXT);
$stmt->bindValue(':email', $email, SQLITE3_TEXT);
$result = $stmt->execute();
if ( ! $result)
{
throw new ErrorException($this->_db->lastErrorMsg());
}
}
}
/* End of file model.php */
/* Location: ./app/model.php */
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment