@nqounetです。
連載「URL短縮サポーターを作ってみよう」の第9回です。
前回の振り返り
第8回では、プレースホルダルーティングを使って、動的なURLパスから短縮コードを取得する方法を学びました。
前回学んだ内容を簡単に振り返ります。
- プレースホルダルーティング(
/:code形式)で動的なURLパスを処理できる $c->param('code')でプレースホルダの値を取得できる$c->app->log->info(...)でサーバーログに情報を出力できる- プレースホルダルーティングは他のルートより後に定義すべきである
今回は、取得した短縮コードを使って、データベースから元のURLを検索する方法を学びます。
今回のゴール
第9回では、以下を達成することを目標とします。
- SELECT文でデータベースからデータを取得する方法を理解する
fetchrow_hashrefで検索結果を扱う- 検索結果が見つからない場合の対処法を学ぶ
元のURLはどこにある?
タカシさんの疑問
短縮コードを取得できるようになったタカシさん。次の疑問が湧いてきました。
「abc123という短縮コードでアクセスされたのはわかった。でも、この短縮コードに対応する元のURLはどうやって調べるの?」
良い質問です。第7回でデータベースに保存したURLを、今度は取り出す必要があります。ここで登場するのがSELECT文です。
SELECT文とは
SELECT文は、データベースからデータを取得するためのSQL文です。基本的な構文は以下のとおりです。
| |
今回の場合、urlsテーブルからshort_codeが一致するレコードのoriginal_urlを取得したいので、以下のようなSQL文になります。
| |
しかし、ユーザー入力をそのままSQL文に埋め込むのは危険です。第7回で学んだとおり、プレースホルダを使って安全に実行しましょう。
SELECT文をPerlで実行する
prepareとexecute
INSERT文と同様に、SELECT文もprepareとexecuteを使って実行します。
| |
このコードでは、?がプレースホルダです。実際の短縮コードはexecuteで渡します。
| |
ここまではINSERT文と同じ流れです。違いは、SELECT文では実行後に「結果を取得する」ステップが必要な点です。
fetchrow_hashrefで結果を取得
SELECT文の実行結果を取得するには、fetchrow_hashrefメソッドを使います。
| |
fetchrow_hashrefは、検索結果の1行をハッシュリファレンスとして返します。カラム名がキーになるため、以下のようにアクセスできます。
| |
ハッシュリファレンスを使うと、カラム名で直接値を取得できるため、コードが読みやすくなります。
見つからない場合の対処
短縮コードがデータベースに存在しない場合、fetchrow_hashrefはundefを返します。この場合の対処も実装しましょう。
| |
この分岐により、存在しない短縮コードへのアクセスにも適切に対応できます。
実際のコードを見てみよう
完全なスクリプト
ここまでの内容を組み合わせた完全なスクリプトを見てみましょう。
| |
コードの流れを解説します。
SELECT文の準備と実行
| |
プレースホルダを使ってSQL文を準備し、executeで短縮コードを渡します。INSERT文と同じパターンです。
結果の取得と判定
| |
fetchrow_hashrefで結果を取得し、値が存在するかどうかで分岐します。
動作確認
スクリプトを実行する
上記のコードをlookup_url.plとして保存し、ターミナルで実行してください。
| |
第7回で登録した短縮コードを使用すれば、以下のような出力が表示されます。
| |
存在しない短縮コードを指定した場合は、以下のように表示されます。
| |
Mojoliciousアプリに組み込む
第8回で作成したプレースホルダルーティングに、今回のSELECT処理を組み込むと、以下のようになります。
| |
存在しない短縮コードへのアクセスには、HTTPステータスコード404(Not Found)を返すのが適切です。
まとめ
今回学んだこと
第9回では、以下のことを学びました。
- SELECT文とプレースホルダでデータベースからデータを安全に検索できる
$sth->fetchrow_hashrefで検索結果をハッシュリファレンスとして取得できる- 結果が見つからない場合は
undefが返されるため、if ($row)で分岐する - 見つからない場合は404エラーを返すのが適切である
次回予告
次回は「転送しよう! — リダイレクトの魔法」をテーマに、取得した元のURLへ自動的にリダイレクトする方法を学びます。いよいよURL短縮サービスの核心機能が完成します。お楽しみに。
