Created
April 26, 2010 16:31
-
-
Save Burgestrand/379554 to your computer and use it in GitHub Desktop.
Namninsamlingsscript
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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