'; 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にジャンプ。 ?>