リンクデータベース
学校のコンピュータ室のコンピュータってのは、なんとかシステム(名前がよくわからない。。Windowsはからきしダメなので。。)というのがついていて、電源を切るとなんでもかんでもその時間の作業が全部消えてしまうようです。これはIEのブックマーク(お気に入り)も例外ではなく、子供がちょっといいページを発見しても、あの面倒なURLをメモするか(無理ですね)、Yahooやgoogleの検索に使った語と、何ページ目にでてきたか覚えておくしかないようです。それはあまりに不便なので、みんなで使えるブックマーク集を作りたかったんですが、ちょっと方向がおかしくなってきて、なんとも中途半端なデータベースが出来てしまいました(笑) 本当は、ブックマークを作るときにIEのURL欄からドラッグアンドドロップでいきたかったんですが、どうもそれはPHPでは無理らしいということが分かり、それいらい放ってあります。ですからこれも未完成ですね。
CAUTION!注意
このスクリプトは、PHP初心者である管理者casterがPHPとMySQLの自習のために作ったもので、その内容は不完全きわまりないものです。XSS対策など、セキュリティ対策は何一つ無く、たとえあなたのPC上でこのスクリプトが動いたとしても、それは単なる偶然にすぎません。したがって、次のような注意をお願いします。
(1)セキュリティが確保され、かつ、悪意のあるユーザーのいないLAN内で使うこと。 (2)内容がいかに不完全でも、決して罵倒のメールなどを送りつけないこと。 (3)使った感想や、修正したスクリプトを作ってくださった方(そんな奇特な人はいないか。。)はメールをください。
用意するもの
あらかじめ、次のファイルを入手して、スクリプトと同じディレクトリに入れておいてください。TOMOさんのサイトhttp://www.spencernetwork.orgから入手できます。
jcode.phps jcode_wrapper.php jcode_wrapper.php code_table.ucs2jis code_table.jis2ucs
データベースを作る
- あらかじめMySQLにデータベースを作っておく。phpMyAdminで次のようになっていればよい。なお、table名は"link2db"とする。
PHPスクリプト
ちょっと面倒ですが、PHPファイル4つとHTMLファイル3つを使います。
- titleget.php
URLを開いてタイトルだけをデータベースに入れる。<?php header("Content-type: text/html; charset=euc-jp"); ?> <html> <HEAD> <META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=EUC-JP"> <TITLE>titleget.php</TITLE> </HEAD> <body> <?php //コード変換スクリプトのインクルード include("./jcode.phps"); //変数の取り出し $daytime = date("Y/m/d H:i:s"); $linkurl = $HTTP_POST_VARS["linkurl"]; $linkcmt = $HTTP_POST_VARS["linkcmt"]; //fopenでURLを開く(エラー処理つき) if (!($handle = fopen($linkurl, 'r'))) { print "URLが存在しないか接続ができませんでした。"; die; } //URLからHTMLタグを取り除きながら1行ずつ読み込む $pos2 = "no title"; while (!feof ($handle)) { $buffer = fgetss($handle, 1024,'<title>'); $zenbu = $zenbu . $buffer; //<title>行だけを抜き出す(<title>が含まれていれば$posに代入) $pos = stristr($buffer,'<title>'); //HTMLタグを取り除く $pos2 = strip_tags($pos); if($pos2 != "") { $linktitle = $pos2; } } fclose ($handle); $zenbu2 = mb_strcut($zenbu, 1, 1024); //echo "<br>"; //print $zenbu2; //各データをEUCに統一する。 $linkcmt= JcodeConvert($linkcmt, 0, 1); $linktitle= JcodeConvert($linktitle, 0, 1); $linkcont= JcodeConvert($zenbu2, 0, 1); // $linkcont= preg_replace('/[[:punct:]]/',"",$linkcont); $linkcont= preg_replace('/[[:blank:]]/',"",$linkcont); $linkcont= preg_replace('/[[:cntrl:]]/',"",$linkcont); $linkcont= $daytime . $linkurl . $linktitle . $linkcmt . $linkcont; //データベースに接続(MySQLのユーザーmysql userのパス:mysql pass word) if(!$con=mysql_connect("localhost","mysql user","mysql pass word")) { echo "データベースに接続を失敗しました。"; exit; } //データベースdatabase nameを選択 if(!mysql_select_db("database name",$con)) { echo "データベースを選択できませんでした。"; exit; } //echo "mysql_select_db('school',$con)"; //フォームで送られてきた内容でINSERT文を作成 $sql = "insert into link2db(daytime,linkurl,linktitle,linkcmt,linkcont) values('$daytime','$linkurl','$linktitle','$linkcmt','$linkcont')"; //echo $sql; if(!$res=mysql_query($sql)){ echo "インサートSQL実行時にエラーが発生しました。"; exit; } //データベースから切断しました。 mysql_close($con); //echo "mysql_close($con)"; ?> <BR> <BR> <BR> <CENTER> <A href="link2dbfind.html">入力完了:ここをクリックしてもどります</A><BR><BR> </CENTER> </body> </html>
- link2dbfind.php
データベースを検索して、5件ずつ表示する。<html> <HEAD> <META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=euc-jp"> <TITLE>リンクをさがしました</TITLE> </HEAD> <BODY> <TABLE BORDER="0"> <TR> <TD><IMG SRC="title.JPG"></TD> <TD><BIG><p>リンク検索結果 </p></BIG></TD> <TD><a href=link2dbfind.html>リンクをさがす</a></TD> </TR> </TABLE> <?php //変数の取り出し if($page==0) { $linkcont = $HTTP_GET_VARS["linkcont"]; $linkurl = $HTTP_GET_VARS["linkurl"]; $page=$HTTP_GET_VARS["page"]; } if($page<>0) { $linkcont = $HTTP_GET_VARS["linkcont"]; $linkurl = $HTTP_GET_VARS["linkurl"]; $page=$HTTP_GET_VARS["page"]; $cnt=$HTTP_GET_VARS["cnt"]; } //データベースに接続(MySQLのユーザーmysql userのパス:mysql pass word) if(!$con=mysql_connect("localhost","mysql user","mysql pass word")) { echo "データベースに接続を失敗しました。"; exit; } //データベースdatabase nameを選択 if(!mysql_select_db("database name",$con)) { echo "データベースを選択できませんでした。"; exit; } //検索条件の取り出し $jouken="id >0"; if($linkurl!="") { $jouken.=" AND linkurl like '%$linkurl%'"; } if($linkcont!="") { $jouken.=" AND linkcont like '%$linkcont%'"; } $jouken.=" order by id "; //ページ番号が0の場合の処理 if($page==0) { //条件にマッチするレコードを数えるためのSQL文を作成 $sql=" select count(*) from link2db "; $sql.="where ".$jouken; //print $sql; //条件にマッチするレコードを数えるためのセレクト文を実行 if(!$res=mysql_query($sql)) { echo "セレクト時にSQL失敗しました。"; exit; } $row= mysql_fetch_array($res); $cnt=$row[0]; //条件にマッチするレコードは$cnt if($cnt==0) { print "検索結果 0件"; die; } $hajime=$page*5+1; $owari=$page*5+5; if($owari>=$cnt) $owari=$cnt; print "検索結果 ".$cnt."件"; print "のうち ".$hajime."-".$owari."件を表示しています"; //SQL文を作成 $sql=" select daytime,linkurl,linktitle,linkcont,linkcmt from link2db "; $sql.="where ".$jouken; $sql.="limit "."0".",5"; //print $sql; //セレクト文を実行 if(!$res=mysql_query($sql)) { echo "セレクト時にSQL失敗しました。"; exit; } } //ページ番号が0でない場合の処理 elseif($page<>0) { //echo "1とすると。。"; $kaisi=$page*5; //SQL文を作成 $sql=" select daytime,linkurl,linktitle,linkcont,linkcmt from link2db "; $sql.="where ".$jouken; $sql.="limit ".$kaisi.",5"; //print $sql; $hajime=$page*5+1; $owari=$page*5+5; if($owari>=$cnt) $owari=$cnt; print "検索結果 ".$cnt."件"; print "のうち ".$hajime."-".$owari."件を表示しています"; //セレクト文を実行 if(!$res=mysql_query($sql)) { echo "セレクト時にSQL失敗しました。"; exit; } } //検索結果の表示 echo "<HR>"; echo "<br>"; while($row=mysql_fetch_array($res)) { echo "<a href='".$row["linkurl"]."'>".$row["linktitle"]."</a>"; echo "<br>"; echo "<small><FONT COLOR='black'>"; echo $row["linkurl"]; echo "</FONT></small>"; echo "<small><FONT COLOR='green'>"; echo " "; echo $row["daytime"]; echo "</FONT></small>"; echo "<small><FONT COLOR='red'>"; echo " "; echo $row["linkcmt"]; echo "</FONT></small>"; echo "<br>"; echo "<small><FONT COLOR='gray'>"; echo $row["linkcont"]; echo "</FONT></small>"; echo "<br>"; echo "<br>"; } echo "<HR>"; echo "<center>"; //前の5件の表示 if($page<>0) { $gen=$page-1; print "<a href=link2dbfind.php? page=".$gen."&cnt=".$cnt."&linkurl=".$linkurl."&linkcont=".$linkcont."><<前の5件</a>"; } //次の5件の表示 if($page<floor($cnt/5)) { $zou=$page+1; print "<a href=link2dbfind.php? page=".$zou."&cnt=".$cnt."&linkurl=".$linkurl."&linkcont=".$linkcont."> 次の5件>></a>"; } //結果セットの解放 mysql_free_result($res); //データベースから切断しました。 mysql_close($con); //echo "mysql_close($con)"; echo "</center>"; ?> </body> </html>
- link2dbdel.php
登録したリンク先のデータを削除するためのスクリプト、link2dbdel2.phpと対になって動きます。<html> <HEAD> <META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=euc-jp"> <TITLE>リンクを削除する</TITLE> </HEAD> <BODY> <? //変数の取り出し $linkcont = $HTTP_POST_VARS["linkcont"]; //echo "$linkcont"; //データベースに接続(MySQLのユーザーmysql userのパス:mysql pass word) if(!$con=mysql_connect("localhost","mysql user","mysql pass word")) { echo "データベースに接続を失敗しました。"; exit; } //データベースdatabase nameを選択 if(!mysql_select_db("database name",$con)) { echo "データベースを選択できませんでした。"; exit; } //検索条件の取り出し $jouken="id >0"; if($linkcont!="") { $jouken.=" AND linkcont like '%$linkcont%'"; } $jouken.=" order by id "; //SQL文を作成 $sql=" select id,daytime,linkurl,linktitle from link2db "; $sql.="where ".$jouken; //echo $sql; //セレクト文を実行 if(!$res=mysql_query($sql)) { echo "セレクト時にSQL失敗しました。"; exit; } //検索結果の表示 echo "<TABLE BORDER='0'>"; echo "<TR><TD><IMG SRC='title.JPG'></TD><TD><BIG><p>リンクデータベース 削除 </p></BIG></TD><TD><a href=link2dbfind.html>リンクをさがす</a></TD></TR>"; echo "</TABLE>"; echo "<BR>"; echo "<small>"; echo "削除したいURLを選んでDELボタンを押してください。"; echo "<br>"; echo "</small>"; echo "<hr>"; //echo "検索条件".$jouken; echo "<table border=1>"; echo "<tr><td>id</td><td>URL</td><td>説明</td><td>削除</td></tr>"; while($row=mysql_fetch_array($res)){ echo "<tr>"; echo "<td>".$row["id"]."</td>"; echo "<td>".$row["linkurl"]."</td>"; echo "<td>".$row["linktitle"]."</td>"; echo "<form action='link2dbdel2.php' method='post'>"; echo "<input type='hidden' name='id' value=".$row["id"].">"; echo "<td><input type='submit' name='exec' value='del'></td>"; echo "</form>" ; echo "</tr>"; } echo "</table>"; //結果セットの解放 mysql_free_result($res); //データベースから切断しました。 mysql_close($con); ?> <hr> <small> Powerd by Linux+Apache+MySQL+PHP (LAMP!) Copyright Caster softwear works 2004. <br> </small> </body> </html>
- link2dbdel2.php
<html> <HEAD> <META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=euc-jp"> <TITLE>削除</TITLE> </HEAD> <BODY> <? //変数の取り出し $id=$HTTP_POST_VARS["id"]; echo "$id"; //データベースに接続(MySQLのユーザーmysql userのパス:mysql pass word) if(!$con=mysql_connect("localhost","mysql user","mysql pass word")) { echo "データベースに接続を失敗しました。"; exit; } //データベースdatabase nameを選択 if(!mysql_select_db("database name",$con)) { echo "データベースを選択できませんでした。"; exit; } //SQL文を作成 $sql="delete from link2db where id=$id"; //Delete文を実行 if(!$res=mysql_query($sql)) { echo "Delete時にSQL失敗しました。"; exit; } //データベースから切断しました。 mysql_close($con); //echo "mysql_close($con)"; ?> <BR><BR><BR> <CENTER> <A href="link2dbdel.html">削除完了:ここをクリックしてもどります</A><BR><BR> </CENTER> </body> </html>
- titleget.html
<html> <HEAD> <META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=euc-jp"> <TITLE>リンクデータベース</TITLE> </HEAD> <body> <BODY> <TABLE> <TR><TD><IMG SRC="title.JPG"></TD> <TD><BIG><p>リンクを入力する </p></BIG></TD> <TD><a href=link2dbfind.html>リンクをさがす</a></TD></TR> </TABLE> <HR> <BR> <form action="titleget.php" method="post"> リンクを記録したいURLと説明を入力します。説明はなくてもかまいません。<br> URL:<input type="TEXT" name="linkurl" size=80 maxlength=200 ><BR> 説明:<input type="TEXT" name="linkcmt" size=80 maxlength=200 > <HR> <input type="submit" name="exec" value="入力データをおくる"> <BR> <input type="reset" name="exec" value="やりなおし"> </form> <HR> <small> Powerd by Linux+Apache+MySQL+PHP (LAMP!) Copyright Caster softwear works 2004. </small> </body> </html>
- link2dbfind.html
<html> <HEAD> <META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=euc-jp"> <TITLE>リンクデータベース</TITLE> </HEAD> <body> <BODY> <TABLE BORDER="0"> <TR><TD><IMG SRC="title.JPG"></TD> <TD><BIG><p>リンクをさがす </p></BIG></TD> <TD><a href=titleget.html>リンク入力へ</a></TD></TR> </TABLE> <HR> <form action="link2dbfind.php" method="get"> さがすことば:<input type="TEXT" name="linkcont" size=50 maxlength=200 > <HR> <small> URLまたは説明の一部分を入力してリンクをさがします。<BR> くうらんのままさがすと、記録されたすべてのリンクが表示されます。<BR> </small> <HR> <input type="submit" name="exec" value="リンクをさがす"><br> <input type="reset" name="exec" value="やりなおし"> </form> <HR> <small> Powerd by Linux+Apache+MySQL+PHP (LAMP!) Copyright Caster softwear works 2004. <br> <a href=link2dbdel.html>削除画面</a> </small> <br> </body> </html>
- link2dbdel.html
<html> <HEAD> <META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=euc-jp"> <TITLE>リンクデータベース</TITLE> </HEAD> <body> <BODY> <BR> <TABLE> <TR> <TD><IMG SRC="title.JPG"></TD> <TD><BIG><p>リンクを削除する </p></BIG></TD> <TD><a href=link2dbfind.html>リンクをさがす</a></TD> </TR> </TABLE> <HR> <form action="link2dbdel.php" method="post"> 検索語を入力してリンクを選択<BR> <HR> 検索語:<input type="TEXT" name="linkcont" size=50 maxlength=200 ><BR> <input type="submit" name="exec" value="リンク削除"> <BR> <input type="reset" name="exec" value="やりなおし"> </form> <HR> <small> Powerd by Linux+Apache+MySQL+PHP (LAMP!) Copyright Caster softwear works 2004. </small> </body> </html>