Skip to content

Commit 40885de

Browse files
committed
added sqlite support using PDO, removed twitter redirect, and removed config.php
1 parent aad8415 commit 40885de

File tree

3 files changed

+104
-32
lines changed

3 files changed

+104
-32
lines changed

config.php

-11
This file was deleted.

index.php

+40-9
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,51 @@ function redirect($url) {
99

1010
if (isset($_GET['slug'])) {
1111
$slug = rtrim($_GET['slug'], '!"#$%&\'()*+,-./@:;<=>[\\]^_`{|}~');
12-
if (is_numeric($slug) && strlen($slug) > 3) {
13-
redirect('http://twitter.com/' . TWITTER_USERNAME . '/status' . $_SERVER['REQUEST_URI']);
12+
13+
switch(DB_FLAVOR) {
14+
case "mysql":
15+
$dsn = DB_FLAVOR . ":dbname=" . DB_DATABASE . ";host=" . DB_HOST;
16+
break;
17+
case "sqlite":
18+
$dsn = DB_FLAVOR . ":" . DB_DATABASE;
19+
break;
20+
default:
21+
exit("Unsupported database.");
22+
break;
23+
}
24+
25+
try {
26+
$db = new PDO($dsn, DB_USER, DB_PASSWORD);
27+
} catch (PDOException $e) {
28+
exit("Database connection error: " . $e->getMessage(). "\n");
1429
}
15-
$db = new mysqli(MYSQLI_HOST, MYSQLI_USER, MYSQLI_PASSWORD, MYSQLI_DATABASE);
16-
$db->query('SET NAMES "utf8"');
17-
$slug = $db->real_escape_string($slug);
18-
$result = $db->query('SELECT `url` FROM `redirect` WHERE `slug` = "' . $db->real_escape_string($slug) . '"');
19-
if ($result && $result->num_rows > 0 && $db->query('UPDATE `redirect` SET `hits` = `hits` + 1 WHERE `slug` = "' . $db->real_escape_string($slug) . '"')) {
20-
redirect($result->fetch_object()->url);
30+
31+
if (DB_FLAVOR == "sqlite") {
32+
$row = $db->query("select name from sqlite_master where type = 'table' and name = 'redirect'")->fetch();
33+
34+
if ( ! $row) {
35+
exit("Url not found.");
36+
}
37+
}
38+
39+
if (DB_FLAVOR == "mysql") $db->query('SET NAMES "utf8"');
40+
41+
$lookup_stmt = $db->prepare('SELECT `url` FROM `redirect` WHERE `slug` = :slug');
42+
$lookup_stmt->bindParam(':slug', $slug);
43+
$lookup_stmt->execute();
44+
$result = $lookup_stmt->fetch();
45+
46+
if ($result) {
47+
$update_stmt = $db->prepare('UPDATE `redirect` SET `hits` = `hits` + 1 WHERE `slug` = :slug');
48+
$update_stmt->bindParam(':slug', $slug);
49+
$update_stmt->execute();
50+
51+
redirect($result['url']);
2152
} else {
2253
redirect(DEFAULT_URL . $_SERVER['REQUEST_URI']);
2354
}
2455
} else {
2556
redirect(DEFAULT_URL . '/');
2657
}
2758

28-
?>
59+
?>

shorten.php

+64-12
Original file line numberDiff line numberDiff line change
@@ -27,24 +27,76 @@ function getNextShortURL($s) {
2727
return implode($a);
2828
}
2929

30-
$db = new mysqli(MYSQLI_HOST, MYSQLI_USER, MYSQLI_PASSWORD, MYSQLI_DATABASE);
31-
$db->query('SET NAMES "utf8"');
30+
switch(DB_FLAVOR) {
31+
case "mysql":
32+
$dsn = DB_FLAVOR . ":dbname=" . DB_DATABASE . ";host=" . DB_HOST;
33+
break;
34+
case "sqlite":
35+
$dsn = DB_FLAVOR . ":" . DB_DATABASE;
36+
break;
37+
default:
38+
exit("Unsupported database.");
39+
break;
40+
}
3241

33-
$url = $db->real_escape_string($url);
42+
try {
43+
$db = new PDO($dsn, DB_USER, DB_PASSWORD);
44+
} catch (PDOException $e) {
45+
exit("Database connection error: " . $e->getMessage(). "\n");
46+
}
3447

35-
$result = $db->query('SELECT `slug` FROM `redirect` WHERE `url` = "' . $url . '" LIMIT 1');
36-
if ($result && $result->num_rows > 0) { // If there’s already a short URL for this URL
37-
die(SHORT_URL . $result->fetch_object()->slug);
48+
if (DB_FLAVOR == "sqlite") {
49+
$row = $db->query("select name from sqlite_master where type = 'table' and name = 'something'")->fetch();
50+
51+
if ( ! $row) {
52+
$create_table = "CREATE TABLE 'redirect' ("
53+
. "'slug' varchar(14) NOT NULL, "
54+
. "'url' varchar(620) NOT NULL, "
55+
. "'date' datetime NOT NULL, "
56+
. "'hits' bigint(20) NOT NULL default '0', "
57+
. "PRIMARY KEY ('slug') "
58+
. ");";
59+
$first_entry = "INSERT INTO 'redirect' VALUES ('a', 'http://www.example.com', datetime('now', '-1 minute'), 1);";
60+
$db->query($create_table);
61+
$db->query($first_entry);
62+
}
63+
}
64+
65+
if (DB_FLAVOR == "mysql") $db->query('SET NAMES "utf8"');
66+
67+
$lookup_stmt = $db->prepare('SELECT `slug` FROM `redirect` WHERE `url` = :url LIMIT 1');
68+
$lookup_stmt->bindParam(':url', $url);
69+
$lookup_stmt->execute();
70+
$result = $lookup_stmt->fetch();
71+
72+
if ($result) { // If there’s already a short URL for this URL
73+
exit(SHORT_URL . $result['slug']);
3874
} else {
39-
$result = $db->query('SELECT `slug`, `url` FROM `redirect` ORDER BY `date` DESC LIMIT 1');
40-
if ($result && $result->num_rows > 0) {
41-
$slug = getNextShortURL($result->fetch_object()->slug);
42-
if ($db->query('INSERT INTO `redirect` (`slug`, `url`, `date`, `hits`) VALUES ("' . $slug . '", "' . $url . '", NOW(), 0)')) {
75+
$result = $db->query('SELECT `slug`, `url` FROM `redirect` ORDER BY `date` DESC LIMIT 1')->fetch();
76+
if ($result) {
77+
$slug = getNextShortURL($result['slug']);
78+
79+
switch (DB_FLAVOR) {
80+
case "mysql":
81+
$insert_stmt = $db->prepare("INSERT INTO redirect(slug, url, date, hits) VALUES (:slug, :url, NOW(), 0)");
82+
break;
83+
case "sqlite":
84+
$insert_stmt = $db->prepare("INSERT INTO redirect(slug, url, date, hits) VALUES (:slug, :url, datetime('now', 'localtime'), 0)");
85+
break;
86+
default:
87+
break;
88+
}
89+
$insert_stmt->bindParam(':slug', $slug);
90+
$insert_stmt->bindParam(':url', $url);
91+
$r = $insert_stmt->execute();
92+
93+
if ($r) {
4394
header('HTTP/1.1 201 Created');
4495
echo SHORT_URL . $slug;
45-
$db->query('OPTIMIZE TABLE `redirect`');
96+
97+
if (DB_FLAVOR == "mysql") $db->query('OPTIMIZE TABLE `redirect`');
4698
}
4799
}
48100
}
49101

50-
?>
102+
?>

0 commit comments

Comments
 (0)