';
echo '';
echo '
';
echo '';
echo '';
echo '';
echo '短縮URL - 生成';
echo '';
echo '';
echo '';
echo '短縮しました。
';
echo '短縮前:' . $url . '
';
echo ' [ポップアップして確認表示]
';
echo '短縮後:' . $newurl . '
';
echo ' [ポップアップして確認表示]
';
echo '
';
echo '短縮URL生成ページへ戻る
';
echo '';
echo '';
exit; // ここでおわり
}
// いらないかも。
mb_language("ja");
mb_internal_encoding("euc-jp");
//
// データベースオブジェクトの生成
//
$db = ADONewConnection('mysql'); // adodbでDBオブジェクト生成(mysql)
$rs = $db->Connect("DBサーバのホスト名", "ユーザ名", "パスワード", "DB名");
if (!$db || !$rs) {
jump(); // DB接続にへくったら、デフォルトURLに飛べ
}
//
// submitだけ先に探す
// submitがパラメータで渡されている場合は、登録ページから飛んできたとして
// 処理を行う。$_GETを使っているが、HTTP GETるのが嫌ならHTTP POSTってくれ。
// で、短縮URL登録時には、submitパラメータとurl(や、もしかしら他の)パラメータ
// も飛んでくる予定のはず。ここではsubmitをとにかく探して、見つけたら同時に
// urlパラメータも存在すると過程して処理をする。submitパラメータがなければ
// エラー扱い=デフォルトURLに飛ばしている。
//
foreach ($_GET as $k => $v) {
if (eregi("^submit$", $k)) { // submitパラメータ検出
if (!isset($_GET["url"])) { // urlもあるよね?
jump(); // ないなら、さよなら
}
$url = $_GET["url"]; // あるみたいだから、短縮前URLを取得
$md5 = md5($url); // URLをMD5化
//
// MD5を全部使うと長いから、その一部から$CMPURL_LENGTH文字
// だけ抽出して使用。当然、そんな使い方ではいつかかち合う
// 可能性があるので、かち合わなくなるキーになるまで生成を
// 繰り返す。ただし永久に繰り返すと悲しいので、最悪でも
// $CMPURL_MAKECOUNT回で終わらせる。その回数全部かちあったら
// 運が悪かったということで終了(だって、お遊びだから)。
//
for ($c=0; $c<$CMPURL_MAKECOUNT; $c++) {
//
// ほんとうはsrand(time());とかしておくと幸せ?
//
// MD5化した文字列から任意の場所を切り取るための、
// 切り取りスタート位置を乱数にゆだねる。
// 0文字目〜[文字列長-$CMPURL_LENGTH]文字目までが
// スタート位置としての候補位置になる。$CMPURL_LENGTH
// は短縮URLの変換テーブル用IDの文字長。この文字数分は
// 引いておかないと、末尾の切り取りで失敗することに
// なるから注意。
//
// ※意味がわからん人は、考えて。考えてもわからん人は
// センスがないのでプログラム組まなくてよし。
$p = rand(0, strlen($md5)-$CMPURL_LENGTH);
// 任意の位置から必要文字数を切り取る
$id = substr($md5, $p, $CMPURL_LENGTH);
// sqlアクセスして、既存IDかどうかを判定する。
$sql = "select url from id2url where id = '$id';";
$rs = $db->Execute($sql);
if ($rs && $rs->RecordCount() == 0) {
// 既存IDは存在しなかったので処理継続。
// $rs->RecordCount() == 0ってのは、
// 検索件数0ってことなので、バッティングが
// なかったって意味。
break;
}
}
// 途中でbreakしていたら処理を継続させる。breakしてなければ
// 指定回数分IDを生成しても全部かちあったということなので
// 諦めてデフォルトURLにジャンプすることになる。
//
// ※このif文の意味が理解できない人はプログラミングの
// センスがないので、今すぐお帰りください。
if ($c < $CMPURL_MAKECOUNT) {
$sql = "insert into id2url (id,url) values ('$id','$url');";
$rs = $db->Execute($sql);
if ($rs) {
// insertに成功していれば、finish()で
// 登録内容の表示をしておわる。
finish($id, $url);
}
}
jump(); // いろんなエラーの場合は、ここでさいなら。
}
}
//
// submitがなければ$CMPURL_LENGTH文字idを探す
// ここに来るのは、実際に短縮URLのアクセスをしてきたという意味。
// count()関数で$_GET(POSTがいい人は要変更)の個数を確認。
// 1個以上というのはおかしい。なぜなら、そのアクセスは
// http://短縮URLのベースアドレス/?xxxxx&yyyyy
// のようになっているから。
//
// あと、値もチェックしている。たとえば、
// http://短縮URLのベースアドレス/?xxxxx=99999
// のようになってたら、おかしい。
// ただしこの場合、以下のアドレスは正しいとして判断される(末尾に=がある場合)
// http://短縮URLのベースアドレス/?xxxxx=
//
//
//
if (count($_GET) == 1) {
foreach ($_GET as $k => $v) { // 連想配列のキーと値を取り出す
break; // 1個だけでいいので、ここで終わり
}
//
// 連想配列のキー=短縮URLのID。
// IDが指定文字数の英数字で構成されていて、なおかつ値が空であることを
// 確認している。
//
// ※if文中の正規表現の意味がわからん人は、プログラミングセンスが
// ないというか勉強不足。
//
if (ereg("^[0-9a-zA-Z]{".$CMPURL_LENGTH."}$", $k) && $v == "") {
// キーとして有効であれば、キーが存在するかどうかチェック
$sql = "select url from id2url where id = '$k';";
$rs = $db->Execute($sql); // キーチェック
if ($rs && $rs->RecordCount() == 1) { // 1つだけあった!!
$x = $rs->GetRows(); // 抽出
// 対応するURLを取り出して、すかさずジャンプする。
// ここでのjump()関数の呼び出しは引数がある、
// すなわち、デフォルトじゃないページにジャンプ
// させているということに注意する。
jump($x[0]["url"]);
}
}
}
jump(); // とにかく、ここにきたらおかしい。だからデフォルトURLにジャンプ。
?>