PHPとSQLでアクセスカウンタとリンクを作る方法

このQ&Aのポイント
  • mySQLとphpを使ってアクセスカウンタを作る方法を知りたい。
  • 自分で試したがうまくいかないため、模範回答が知りたい。
  • データベースにアクセスして特定のデータを抽出する方法がわからない。
回答を見る
  • ベストアンサー

phpとSQLでアクセスカウンタとリンクを作りたい

mySQLとphpで、アクセスカウンタの作成を練習しています。 データベース名:animal、テーブル名:pet、フィールド名が順にID:url:scoreで 1:neko.com:43 2:inu.com:24 3:bird.com:62 … というデータがあります。 たとえばhttp://test.com/test.php?id=2というリンクを踏んだ場合、inu.comへ転送させ、さらに24の数字は25になります。 自分でもhttp://ft-lab.ne.jp/cgi-bin/wiki.cgi?page=URL%B0%FA%BF%F4%A4%AB%A4%E9%A4%CE%A5%C7%A1%BC%A5%BF%A4%F2%C5%CF%A4%B9_PHP これを利用してidを得たあとmySQLにアクセスしてデータを探そうとしたのですが、手元の「よくわかるphpの教科書」には指定したデータの抽出方法は見つかりませんでした。 今日一日調べながらがんばってみましたが、いろいろ工夫してもどうもうまくできません。 どなたか、これらの処理を行うphpの模範回答をご教示いただけないでしょうか。 どうかよろしくお願いします。

  • PHP
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

<?php if(!isset($_GET['id']) || !preg_match('/^[0-9]+$/', $_GET['id'])){ //GETパラメータにIDがないか、 //数字以外のものが入ってるので終了 exit(); } //DB設定 define('MY_DB_DSN', 'mysql:dbname=your_db_name;host=your-host-name'); define('MY_DB_USER', 'username'); define('MY_DB_PASS', 'password'); $id = $_GET['id']; try{ $pdo = new PDO(MY_DB_DSN, MY_DB_USER, MY_DB_PASS); //PDOでデータベースアクセス //PDOを設定 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //IDを探す //プリペアドステートメントの作成 $stmt = $pdo->prepare("SELECT * FROM animal WHERE id=?"); if(!$stmt->execute(array($id))){ //失敗したので終了 exit(); } $row = $stmt->fetch(PDO::FETCH_ASSOC); if(!empty($row)){ //遷移先URLを取得して $url = $row['url']; //カウンタを回す $stmt = $pdo->prepare("UPDATE animal SET score=score+1 WHERE id=?"); $stmt->execute(array($id)); //準備終わったのでリダイレクト header("Location: {$url}"); exit(); } }catch(Exception $e){ //例外エラーが出てきたので終了 //エラー内容みたかったら //echo $e; //上をコメントアウト exit(); } ?> こんな感じですかね。

spinia0120
質問者

お礼

大変ご丁寧なご回答、本当にありがとうございます。 まだ学習途中ですが、このプログラムをもとにより一層の昇進を続けたいと思います。 ありがとうございました。参考にさせていただきます。

関連するQ&A

  • PHPとSQLによるaタグ(リンク)の貼り付け方

    PHP・SQL初心者です。 MySQLとPHPでサイトを構築しています。 データベースへの接続・テーブル内容の表示等はできるのですが、リンクをどのようにすれば貼り付けることができるのかわからなかったため質問させていただきました。 ID 名前 友達1 友達2 ・・・ 1 田中 佐藤 前田 2 山田 XXX XXX 3 佐藤 XXX XXX 4 前田 XXX XXX ・ ・ このようなデータベースを用意し、 名前が「田中」さん(ID が 1)のページに ------------------------------------------- 田中さんの友達 友達1:佐藤 友達2:前田 ------------------------------------------- このように表示し、 「佐藤」「前田」の箇所にデータベースの「ID」を利用してリンクを貼り付けたいと考えております。 データの抽出・画面への表示は、 $quryset = mysql_query("SELECT ID,名前,友達1,友達2 FROM テーブル名 WHERE ID= '1' "); while ($data = mysql_fetch_array($quryset)){} このような関数で行っております。 表示は問題なくできているのですが、 表示の「佐藤」「前田」の箇所にリンクを設定するの方法がわかりません。 「ID」 = 1 の情報を表示しているため「山田」と表示している箇所に <a href="http://XXXX.com/$data[ID].php">山田</a> と設定してリンクをつけることはできます。 友達の欄の「佐藤」「前田」の箇所にリンクをつけることができません。 データベースの「ID」欄、を利用して ------------------------------------------- 田中さんの友達 友達1:<a href="http://XXXX.com/ID名.php">佐藤</a>    ID名=佐藤さんのID欄にある2 友達2:<a href="http://XXXX.com/ID名.php">前田</a>    ID名=前田さんのID欄にある4 ------------------------------------------- ↓↓↓ IDが抽出されて ------------------------------------------- 田中さんの友達 友達1:<a href="http://XXXX.com/2.php">佐藤</a> 友達2:<a href="http://XXXX.com/4.php">前田</a> ------------------------------------------- このような形で表示できれば理想なのですが、 使用する関数やSQLの構文がわかりません。 初心者のため、考え方が根本的に間違っているのかもしません。 お詳しい方、まったく別の方法でも構いませんので解決する方法をご教授頂ければ幸いです。

    • ベストアンサー
    • PHP
  • データベースのページング出力を行うPHPのコード

    現在、phpとmySQLを勉強しています。 データベース名:animal、テーブル名:pet、フィールド名が順にID:title:url:scoreで 1:ねこ:neko.com:43 2:いぬ:空白:24 3:空白:空白:空白 4:とり:bird.com:62 : というデータがあります。 このとき、 1<a href="neko.com">ねこ</a>43<br> 2<a href=" ">いぬ</a>24<br> 3<a href=" "></a><br> 4<a href="bird.com">とり</a>62<br> : のように10行ずつhtmlに出力するPHPを書こうと思っています。 10行ずつですので、上の例だとURLの最後の書き換えによってpage=2、page=3、…とアクセスできます。 自分でもmysqlを呼び出し、要素を変数に格納して、foreachを使って最後まで順繰りに出力するように作成して、ページングするように作ってみたのですが、どうも正常に出力されません。 考えましたがどうにも原因が不明なので、どなたかこのような動作を示すPHPの模範コードを書いていただけないでしょうか。 PHPは未だ勉強中ですが、教えていただいたコードと自分のコードを比較して、より精進したいと思います。 どうかよろしくお願いします。

    • ベストアンサー
    • PHP
  • PHP+MYSQLからACCESSのデータにリンク

    MYSQL+PHP からaccessのデータベースを見たいのですが やり方がわかりません。 MYSQL+PHPでページができていまして、これをあんまり変更せずに accessのデータを利用したいと思っているのですが。 MYSQLを介してaccessのデータベースを見ることは可能でしょうか? ODBCを介してMYSQLのデータをアクセスで見る方法はホームページで 発見できたのですが・・・ ご存知でしたらお願いします

  • PHPでクッキーを使用して

    たとえば http://test.com/index.php?id=a01 でアクセスした場合a01という引数をクッキーに保存し、 その引数を画像ファイル名やインクルードファイル名に使用し、 a01専用のデザイン、要素に変えるということをしています。 わかりにくいかもしれませんが、つまり、 お客さんによってヘッダーやフッターだけはお客さん用に、 変えて共通で使える部分は共通で使っているということです。 そこで、問題なのですが、 http://test.com/index.php?id=a01でアクセスした場合、 以降、どのページ移動しようが、クッキーに保存しているので、 ヘッダーやバナーは引き継がれたままなのですが、 http://www.test.com/index.php?id=a01(ホスト名が付いている) でアクセスするとまた別のクッキーとして新たに登録されていまい、 困っています。どちらからアクセスしてもひとつのクッキーとして 保存したいのですが、何か良い方法はないでしょうか。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • AccessのSQL URL|大文字|小文字判別

    URLのパターンを見て、URLがマッチしたらカテゴリ情報を出力するクエリをAccessで作っています。 ・URL_M(URLのパターンを格納するマスタ) RULE_ID | URLパターン | カテゴリ | 階層 1 | test/area | cate1 | 詳細 2 | test/A | cate2 | Top ・DATA(いろいろなURLを格納するデータ) URL_ID | URL 1001 | test/a 1002 | test/area12/index.htm 1003 | test/A/index.htm ・出力したいVIEW URL_ID | RULE_ID | URL | URLパターン | カテゴリ | 階層 1001 | 空 | test/a | 空 | 空 | 空 | 1002 | 1 |test/area12/index.htm | test/area | cate1 | 詳細 | 1003 | 2 |test/A/index.htm | test/A | cate2 | Top | これを出力するAccess2013のクエリで作りたいです。 SELECT D.URL_ID, RULE_ID,D.URL, U.URLパターン, U.カテゴリ, U.階層 FROM DATA AS D LEFT JOIN URL_M AS U ON ( (D.URL Like U.URLパターン+"*") and (U.URLパターン = select max( U2.URLパターン) from DATA as D2 LEFT JOIN URL_M as U2 on D2.URL Like U2.URLパターン+"*" ) ) こんな感じで組んでみたのですが、構文エラーが出て、うまくいきません。 また大文字小文字の区別をつける方法も知りたいです。 URL_ID:1001は、RULE_ID:2にマッチせず、空で出力したいです。 バイナリで比較しなければできないということまでは調べたのですが・・・・ http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q109179500 http://www.lasical.com/2010/12/27/370/ http://www.f3.dion.ne.jp/~element/msaccess/AcTipsBinaryField.html SQLがわかる方、教えていただければ幸いです。 よろしくお願い致します。

  • accessとphpとsql

    現在、WEBからphpでSQLを使い、access(2002)にデータ入力とデータ参照するシステムを作成しています。 とりあえず両方できていますが、データ入力は複数人数で同時に更新(異なるレコード。テーブルは同一)することが想定されます。 排他制御はやりかたがわからずに組み込んでおりません。 ですが、入力者には個別のページに飛んでそこからデータを更新するようなWEBになっており、注意して作業してもらえば排他制御しなくてもいいかなと思っています。 ネットでaccessではデータの破損が起きやすいとありましたが、このような使用状況では起こりえるでしょうか? また、accessからmysqlなどに変更するメリットなどはありますでしょうか? よろしくお願いします。

  • PHP+MySQLで権限につきまして

    初心者で困っています。 PHP+MySQLのサーバーにアクセスしましたところ、 arning: Access denied for user: 'root@test.com' (Using password: YES) in /home/paul/WWW/test.php on line 11 で、接続が拒否されます。 それで、質問ですが 1)$user = "root"; にしているのですが、後ろに@test.comが付くのはサーバーのURLとしてどれにでも付くものなのですか? 2)MySQL データベースの USER テーブルの ユーザー’root’も ’root@test.com'も作ってパスワードも入れていますが、パスワードの誤りで拒否されているのでしょうか? どうか教えてください。

  • Apache使ってphpでMySQLへアクセスが…

    Macを使っているものです. 最近phpでMySQLにアクセスしようということに取り組んでいます. しかし,apacheがよくないのかmysqlがよくないのか適切に動作してくれません. よくわからないので,手順を書いて問題を言及してみました... 何がいけないのでしょうか... --------- Apacheはデフォルトで入ってるはず・・・ apacheの設定ファイルhttpd.confのポートを8080に設定(これで競合はないはず・・・) ↓ [1]URLにhttp://localhost:8080/とうつと,Apacheのテストページではなく,It works!と出る ↓ とりあえず,Siteフォルダにphpファイルを置き,hello worldを表示.できた(じゃあ,動いてるのかな?) ↓ コマンドラインから「apachectl start」を実行「Already loaded」 じゃあ,動いてるっぽい ↓ じゃあ,DBアクセス用のphpを動作させよう!MySQL導入 ↓ 設定ファイルphp.iniのパスがおかしかったので,mysql.default_socket=/tmp/mysql.sockに変更 実際にcdで移動し,ファイルがmysql.sockがあることを確認 ↓ よーし,実行だ!http://localhost:8080/db_access.php→Not Found あるぇ?なんでだ? ↓ http://(ip直打ち):8080/db_access.php→表示! でも,ソースコード内に以下の記述をしている(簡略化して書きます) ********** $url="localhost" $link = mysql_connect($url,$user,$pass) or die("MySQLへの接続に失敗しました。"); <html>接続ID:<?=$link ?></html> ********** なのに,結果は :::::::::: 接続ID: :::::::::: という風になにも表示されない(・ω・` 結果が「MySQLへの接続に失敗しました。」なら,そもそもMySQLに接続できてないんだろうけど,結果だけがかえってこないのはなんでだろう. ちなみに,$urlをip直打ちにしたらブラウザに怒られた.そりゃそうだよな. --------- という流れで今に至ります. おそらく[1]の時点が問題かと自分では思うのですが,原因がわかりません. ご助言おねがいいたします.

    • 締切済み
    • PHP
  • MySQLのSQLについて

    テーブル名:table ------------------------------------ 初回アクセス,日付,名前,顧客ID,URL Y,2017/01/01,Aさん,001,http://aaa.jp NULL,2017/01/01,Aさん,001,http://aaa.jp/test.php NULL,2017/01/01,Aさん,001,http://aaa.jp/blog/ Y,2017/01/02,Bさん,002,http://aaa.jp NULL,2017/01/02,Bさん,002,http://aaa.jp/test.php NULL,2017/01/02,Bさん,002,http://aaa.jp NULL,2017/01/02,Bさん,002,http://aaa.jp/blog/ Y,2017/01/03,Cさん,003,http://aaa.jp/test.php NULL,2017/01/03,Cさん,003,http://aaa.jp ------------------------------------ 上記の様なテーブルを作りアクセスデータを蓄積しています。 これらを1ページ目のランキング、2ページ目のランキング、3ページ目のランキングとつくりたいです。 例えば、 ------------------------------------ SQL ------------------------------------ SELECT `table`.`URL`, COUNT( `table`.`URL`) AS `count` FROM `table` WHERE `table`.`初回アクセス` = 'Y' GROUP BY `table`.`URL`; ------------------------------------ 結果 ------------------------------------ URL,count http://aaa.jp,2 http://aaa.jp/test.php,1 1ページ目のランキングは上記SQLで作れるのですが、2ページ目以降のランキングの作り方が分かりません。 何か良い方法等ありませんか?

    • ベストアンサー
    • MySQL
  • PHPからMySQL5にアクセスできない

    phpからMySQL5にアクセスできません。 以下のソースを実行すると、エラーが表示されます。 ■=== phpのソース=========================================== <html> <?php if( !$mysql = mysql_connect("localhost","test_user","test_password") ){ print "接続失敗<br>"; exit(); } ?> </html> ============================================== ■=== エラー ================================= Fatal error: Call to undefined function mysql_connect() in d:\HTTPRoot\temp\test.php on line 3 ============================================== ■環境 ・PHP 5.1.6 ( Windows Binaries(PHP 5.1.6 zip package )をダウンロードし、c:\PHPへ解凍 ) ・AnHTTPd1.42k ・Windows2000Professional sp4 ・MySQL 5.0.19 ■状況 ・PHPとAnHTTPdは動作しています。 以下、<? phpinfo(); ?> の結果で、MySQLの部分です。  Client API library version 5.0.22  Client API header version 5.0.22  MYSQLI_SOCKET /tmp/mysql.sock ・MySQLにはログインでき、DBやテーブルの作成もできます。 コマンドラインから、以下のコマンドでログインできます。 c:\>mysql -utest_user -ptest_password ・このサイトを参考に、php.iniなど設定しています。 http://homepage1.nifty.com/yito/anhttpd/faq/php5.html   php.iniのこの行もコメントアウトを外しています。    extension=php_mysql.dll 以上、宜しくお願いします。

    • ベストアンサー
    • PHP