【MENU】
【htmlからjavascriptを介してphpを起動し、その結果(テキスト・画像)をhtmlに書き込む】
◆概要
※例えばphpのアクセスカウンターをindex.htmlに組み込みたい。index.htmlにphpスクリプトを記述してファイル名をindex.phpに変えるのが一番簡単なのだが、できればファイル名を変えたくない(SEO対策等)。
※phpをcgiとして起動することも試したが、javascriptを介して直接phpを起動し、その結果をhtmlに書き込むことができる方法があった。
◆javascript tips
//アクセスカウンター(acclog.php)の例
[XHTML]--テキスト出力も画像出力も同じ
Access counter:
<script type="text/javascript" src="
http://www.〜/acclog.php">
</script>
【肝】phpをjavascriptから起動する!!
[PHP](acclog.php)---テキスト出力
//$Count:アクセス数(MySQL等とのアクセスも可能)
<?php
...($Countを取得)
//結果をテキスト出力
header("Content-type: application/x-javascript");
print "document.write('['+'".$Count."+']')";
?>
[PHP](acclog.php)---gif画像出力(6桁ゼロ付で出力)
//$Count:アクセス数
//GifPath:gif画像を保存しているフォルダ(http://から)
//画像は、0.gif、1.gif、2.gif、3.gif....
<?php
...($Countを取得)
$imgStr=""; //html出力
$Count3=substr(($Count+1000000),1,6); //6桁の文字に変換
for($s=0;$s<=5;$s++){
$ss=$GifPath."/".substr($Count3,$s,1).".gif";
$imgStr.="<img src='".$ss."' border='0' hspace='0' />";
}
header("Content-type: application/x-javascript");
print 'document.write("'.$imgStr.'");'; //(注)
?>
(注)シングルコーテーションとダブルコーテーションの位置に注意
◆メモ
※この場合、単純に「print $Count;」と記述してもhtmlファイル上に結果が反映されない。print文に先立ってjavascriptとしてのheaderを送りその後、javascriptを書き出す。
※print文の中味が、javascriptになっていることに注意。(例示ではあえて[ ]と+で結合している。)
※任意の桁数に変換するには、本サイトで「PHP 数値を任意の桁のゼロ付文字に変換する」を参照されたい。
◆メモ2
※imgタグを使う方法が雑誌等で紹介されている。
<img src="http;//〜〜/acclog.php" width="0" height="0" />
のような方法だ。しかしhtmlから起動したとき、headerの返し方がよく判らないので、現在は、上記のようにjavascriptを介在させている次第。どなたか、判っている方がいれば教えて頂ければ幸いです。
(DataID:000041 Date:2008/03/14)
【JPEG(GIF)画像のファイルサイズを取得し、サイズ変更して保存する】
◆概要
※サーバー上のフォルダに保存されているJPEG(GIF)画像のファイルサイズ(幅・高さ)を取得する。
※設定値より画像幅が大きい場合は、ファイル名にsのついた縮小ファイルを同じフォルダに作る。
◆PHP tips
//元ファイルのパス(/で閉じる)
$strPath="../sample/";
//元ファイル名
$strFName="file.JPG";
//ファイルの指定幅(px)
$strSw=300;
//ファイルパス+ファイル名
$file_s=$strPath.$strFName;
//作成する縮小ファイル(元ファイルの前にs付)
$file_s=$strPath."s".$strFName;
//拡張子の取得
$gg=strrev($strFName); //ファイル名を逆順に並べ換え
$ff=substr($gg,0,3); //$gg先頭から3文字(拡張子分)切り出す
$strExt=strrev($ff); //拡張子(文字列順を元に戻す)
//ファイルの種類(拡張子)による元画像作成
if(($strExt=="gif")||($strExt=="GIF")){
$dat=ImageCreateFromGIF($file);
}else if(($strExt=="jpg")||($strExt=="JPG")){
$dat=ImageCreateFromJPEG($file);
}
//ファイルサイズ取得
$strPw=ImageSX($dat);
$strPh=ImageSY($dat);
$strSh=ceil(($strPh*$strSw)/$strPw); //縮小ファイル高さ計算
//指定幅より大きい場合、縮小ファイルを作成
if($strPw>$strS2w){
$src = ImageCreateTrueColor($strSw, $strSh);
imagecopyresized($src, $dat, 0, 0, 0, 0, $strSw, $strS2h, $strPw, $strPh);
//画像保存
if(($strExt=="gif")||($strExt=="GIF")){
ImageGIF($src, $file_s);
}else if(($strExt=="jpg")||($strExt=="JPG")){
ImageJPEG($src, $file_s);
}
imagedestroy($src); //メモリ破棄
imagedestroy($dat);
}
(DataID:000039 Date:2008/03/11)
【XHTMLのxml宣言がPHPコードタグとかぶるエラーを回避する】
◆概要
※XHTMLでは最初に下記のxml宣言をする
<?xml version="1.0" encoding="shift_jis" ?>
が、その前にPHPコードタグがあると、<?php とかぶってエラーとなる。
◆回避方法
<?php echo '<?xml version="1.0" encoding="shift_jis" ?>'; ?>
※早い話がPHPで書き出せばよい。---納得しました。
(DataID:000065 Date:2008/03/27)
【xrea.com+PHPでフォルダを自動的に作成したときの所有者問題(1)】
◆概要
※PHPでスクリプト上からフォルダやファイルを作成した場合--mkdir等---所有者がapasheになってしまい、それ以降、PHPによるそのフォルダ操作ができなくなる。
※PHPによるフォルダ所有者の変更 chown関数の使用はできない。
※レンタルサーバー[xrea.com]セキュリティによる独自の問題
(解決方法)
※PHPファイルをcgiとして実行すれば、ユーザー権限で実行され、作成したフォルダの所有者はユーザー名になる。
http://sb.xrea.com/showthread.php?t=10744
※しかし、話はそれほど単純ではないのである。
※以下、フォルダ・ファイル構成例によって考え方を記述する。
◆フォルダ構成例(以下[]はフォルダ名)
─┬index.php
│
├[folder_php]
│
└[folder_cgi]
├login.php(ログイン用)
├mkfol.php(フォルダ作成用)
└.htaccess(問題解決のため追加するファイル)
※login.phpでパスワードを入力してmkfol.phpにアクセスする。
※login.phpでsession_start()し、そのセッションデータをmkfol.phpで使用。もし直接mlfol.phpにアクセスしても強制的にlogin.phpに遷移されるようにしている。
◆問題発生(1)
※[folder_cgi]に(解決方法)の記述により.htaccessを置き、mkfol.phpがcgiとして実行されるようにした。
※login.phpからmkfol.phpにアクセスすると、session_start()のラインでエラーが発生し実行不能となる。
[PHP Error!!]
Warning: session_start() [function.session-start]: open(/tmp/〜〜) failed: Permission denied (13)
※これはlogin.phpとmkfol.phpでsessionが異なることによる「権限」のエラーかと思われる(専門的な用語はよく判らないのでご勘弁)。
※そのため、login.phpも同様にcgiとして実行する必要がある。
◆.htaccessの設置
※[folder_cgi]に以下のような.htaccessを置く。
[.htaccess]
<Files login.php>
AddHandler application/x-httpd-phpcgi .php
</Files>
<Files mkfol.php.php>
AddHandler application/x-httpd-phpcgi .php
</Files>
◆問題解決
※これによって、mkfol.phpでmkdir()により作成したフォルダの所有者はユーザー名となり、その後、そのフォルダへのアクセス制限はない。問題解決。
◆新たな問題発生
※まだ、これで問題はすべて解決せず。新たな問題が発生した。
※その2に続く
(DataID:000068 Date:2008/03/30)
【xrea.com+PHPでフォルダを自動的に作成したときの所有者問題(1)】
◆概要
※PHPでスクリプト上からフォルダやファイルを作成した場合--mkdir等---所有者がapasheになってしまい、それ以降、PHPによるそのフォルダ操作ができなくなる。
※PHPによるフォルダ所有者の変更 chown関数の使用はできない。
※レンタルサーバー[xrea.com]セキュリティによる独自の問題
※その1の解説のようにmkfol.phpでmkdir()により作成したフォルダの所有者はユーザー名となり、その後、そのフォルダへのアクセス制限はない。問題解決。
◆フォルダ構成例(以下[]はフォルダ名)
─┬index.php---
│
├[folder_php]---ファイル省略(一部でsession使用)
│
└[folder_cgi]
├login.php(ログイン用)
├mkfol.php(フォルダ作成用)
└.htaccess(問題解決のため追加するファイル)
◆新たな問題発生
※[folder_php]でsessionを使用した後、index.phpに戻り、login.phpにアクスすると、sessionの権限のエラーが発生して実行不能に。逆に、login.php でログアウトした後、index.phpに戻り、[folder_php]のsession使用ファイルにアクセスすると、同じエラーとなる。
◆問題への対処【重要】
※複数のファイルでsession管理し、そこからsessionを抜けるときに、必ずセッションの廃棄・セッション破壊しておかなければならない。セキュリティ上からも当たり前の話なのだが。
※sessionを抜けるときに、javascript等で別のファイルに遷移したらsessionを抜けたことにならない。一度、submitしてサーバーにアクセスし、以下を実行した上で、別のファイルに遷移すること。
[PHP--submit]の例
session_start();
$Sousa= $_POST['txtSousa'];
//submit前にフォームtxtSousaに「他ページに遷移」を記述
if($Sousa=="他ページに遷移"){
//セッション破壊
$_SESSION=array(); //セッション変数破棄
session_destroy(); //セッション破棄
//他ページに遷移
$strPage="
http://www.〜〜〜";
header("HTTP/1.1 401 Moved Permanently");
header("Location:$strPage");
}
◆すべてのsessionのページで上記をチェックしました。
(DataID:000069 Date:2008/03/30)
【セレクトフィールド(複数選択可能)で選択したデータをサーバーに送る】
◆複数選択可能なセレクトフィールド(コンボボックス)で選択した複数のデータをサーバーに送って処理します。
◆javascript Tips
[XHTML]
//複数選択可能に設定
<form name="FORM" action="<?php echo $PHP_SELF; ?>" method="POST">
...
<select name="cmbSel[]" multiple="multiple">
<option value="1">a001</option>
<option value="2">a003</option>
<option value="3">a003</option>
...
...
</select>
//選択完了ボタン(クリックするとsubmitして同じファイルを再実行)
<input type="submit" value="選択完了" />
...
</form>
【肝】name属性に[]を付加する。
[PHP]
<?php
valCNT=count($cmbSel); //渡された配列の数を取得
$cmbSel=$_POST['cmbSel']; //※(注意)
$n=0;
while ($cmbSel[$n]!=""){
$strDataID_multi=$cmbSel[$n];
....//データを処理
&n=$n+1;
}
?>
◆メモ
※セレクトフィールド name属性に[]を付加する。
※submitされたとき、選択されたセレクトフィールドの要素valueは、「$セレクトフィールドのname属性」(例:$cmbSel)という配列で取得できる。
※配列数はcount($cmbSel)で取得できる。
◆注意
※本来、この行を記述しなくても複数データが取得できるばずだったが、ある日、突然、データが受信できなくなった(2008.04)。原因不明で、試行錯誤してこの行を追加したら、受信できるようになった。どうして?
(DataID:000034 Date:2008/03/06)
【セレクトフィールドにテキストファイルのデータをバインドする】
◆概要
※指定したフォルダに保存されたテキスト(txt)ファイルのデータを、セレクトフィールドにバインドして選択できるようにする。
◆前提条件
※テキストファイル(例:data/sample.html)のデータは1行に1データとする(1データづつ改行されている。
[TEXT]
DATA1
DATA2
...
※選択する要素の一番上は「--ファイル選択」と表示する。
◆[XHTML]+[PHP]
<select>
<option value="0">--ファイル選択</option>
<?php
$FilePath="data/sample.txt";
$n=0; //ページ数カウント
//テキストファイルを開く
$fp=fopen($FilePath,"r");
while($data=fgets($fp)){
$data=trim($data); //空白文字除去
if($data!=""){
print '<option value="'.$data.'">'.$data.'</option>\n';
$n=$n+1;
}
}
fclose($fp);
?>
</select>
<input type="text" value="<?php echo $n // 有効ファイル数?>" />
◆メモ
※テキストファイルからデータを一行づつ読み込む。trim関数により前後の空白文字(改行文字等)を除去する。
(DataID:000048 Date:2008/03/19)
【セレクトフィールドにデータベース(MySQL)からSELECTしたデータをバインドする】
◆概要
※MySQLからSELECTしたデータをセレクトフィールドにバインドして選択できるようにする。
◆[MySQL]
※テーブル名:tblSample
※フィールド:FILD1,FILD2,FILD3,...
※WHRER句:FILD1=$strDat1で検索して得られるFILD2のデータをバインドする
◆[XHTML]+[PHP]+[MySQL]
<select>
<option value="0">--ファイル選択</option>
<?phpFILD2
//※データベース設定
require("config.php");
//※SQL接続
$con=mysql_connect(MYSQL_CONNECT_HOST,MYSQL_CONNECT_USER,MYSQL_CONNECT_PASS);
mysql_select_db(MYSQL_DB_NAME);
//※SQL実行
$sql="SELECT FILD2 FROM tblMySample WHERE FILD1='".$strDat1."' ORDER BY FILD2;
$res=mysql_query($sql,$con);
while($row=mysql_fetch_array($res)){
$dd=mb_convert_encoding($row['FILD2'],"SJIS","EUC-JP");
echo "<option value='".$dd."'>".$dd."</option>";
}
//※SQLクローズ
mysql_close($con);
?>
</select>
◆MySQL(config.php)---データベース設定(本文でrequire())
<?php
define("MYSQL_CONNECT_HOST","localhost"); //DBホスト名
define("MYSQL_CONNECT_USER","DBuser"); //DBuser:sample
define("MYSQL_CONNECT_PASS","DBpassword"); //DB password:sample
define("MYSQL_DB_NAME","DBname"); //DB name:sample
?>
◆メモ
※$dd=...は字化けを起こす場合(問題なければ不要)
※上記の例では<option>のvalueと表示されてるTEXTを同じ$ddにしているが、別のデータにすることも可能
(DataID:000047 Date:2008/03/19)
【セレクトフィールドに指定フォルダに保存されたファイル名をバインドする】
◆概要
※指定したフォルダに保存されたファイルのファイル名をセレクトフィールドにバインドして選択できるようにする。
◆前提条件
※サブフォルダ及び特定のファイルは除外する
※選択する要素の一番上は「--ファイル選択」と表示する。
◆[XHTML]+[PHP]
<select>
<option value="0">--ファイル選択</option>
<?php
$FilePath="data/"; //フォルダの相対パス(最後/を付ける)
$List=array("index.html","000000.txt"); //除外ファイルリスト(配列)
$d=dir($FilePath);
while($entry[]=$d->read()){ } //ファイル名取得
sort($entry); //ファイル名並べ替え(分類)
$i_max=count($entry); //取得データ最大値
$n=0; //ページ数カウント
for($i=0;$i<$i_max;$i++){
$Action="1";
if(($entry[$i]=="")||($entry[$i]==".")||($entry[$i]=="..")){
$Action="0";
}else{
//フォルダなら除外(.拡張子のピリオドの有無)
if(strpos($entry[$i],".")==false){
$Action="0";
}else{
//除外ファイルのチェック
if(in_array($entry[$i],$List)){
$Action="0";
}
}
}
//除外されていなければprintする
if($Action=="1"){
print "<option value='".$entry[$i]."'>".$entry[$i]."</option>\n";
$n++;
}
}
?>
</select>
<input type="text" value="<?php echo $n; // 有効ファイル数?>" />
◆メモ
※entry[$i]は、ファイル名の他、空白文字・ピリオド1ケのみ・ピリオド2ケを返すことがある。サーバーの仕様?それらの場合は除外する。
※strpos()は該当する文字がなければfalseを返す(あれば配列内の位置)
※in_array()は該当する値があればtrueを返す(あればfalseを返す)
※詳細はサンプル参照
◆サンプル
「セレクトフィールドに指定フォルダに保存されたファイル名をバインドする」
http://www.dblpar.com/myscript/sample/php/select_dir/select_dir.php
(DataID:000050 Date:2008/03/19)
【テーブルを作る(PHPでデータベースMySQLからSELECTしたデータによる)】
◆概要
※MySQLからSELECTしたデータから、テーブルを作成する。
※PHPスクリプトは直接HTMLに書き込めるので、こうした芸当が可能である。このテクの応用範囲は広い。
◆[MySQL]
※テーブル名:tblSample
※フィールド:FILD1,FILD2,FILD3,FILD4
※検索条件:FILD1=$strDat1で検索して得られる全フィールドのデータをFILD1昇順にてテーブルに書き出す。1列目は行番号を記述。
◆[XHTML]+[PHP]+[MySQL]
<table id="tblData" cellpadding="1" cellspacing="1">
<colgroup span="5" width="100" align="center" valign="middle" ></colgroup>
<tr>
<th>No</th>
<th>列1</th>
<th>列2</th>
<th>列3</th>
<th>列4</th>
</tr>
<?php
//※データベース設定
require("config.php");
//※SQL接続
$con=mysql_connect(MYSQL_CONNECT_HOST,MYSQL_CONNECT_USER,MYSQL_CONNECT_PASS);
mysql_select_db(MYSQL_DB_NAME);
//※SQL実行
$sql="SELECT * FROM tblMySample WHERE FILD1='".$strDat1."' ORDER BY FILD1;
$res=mysql_query($sql,$con);
$n=1;
while($row=mysql_fetch_array($res)){
$data1=$row['FILD1'];
$data2=$row['FILD2'];
$data3=$row['FILD3'];
$data4=$row['FILD4'];
?>
<tr>
<td><?php echo $n; ?></td>
<td><?php echo $data1; ?></td>
<td><?php echo $data2; ?></td>
<td><?php echo $data3; ?></td>
<td><?php echo $data4; ?></td>
</tr>
<?php $n=$n+1;
}
mysql_close($con); //SQLクローズ
?>
</table>
◆MySQL(config.php)---データベース設定(本文でrequire())
<?php
define("MYSQL_CONNECT_HOST","localhost"); //DBホスト名
define("MYSQL_CONNECT_USER","DBuser"); //DBuser:sample
define("MYSQL_CONNECT_PASS","DBpassword"); //DB password:sample
define("MYSQL_DB_NAME","DBname"); //DB name:sample
?>
◆メモ
※データが字化けを起こす場合(MySqlとhtmlの文字コードの相違等)、
$data1=mb_convert_encoding($row['FILD1'],"SJIS",auto);
とエンコードする。
(DataID:000062 Date:2008/03/22)
【テーブルを作る(PHPで指定フォルダに保存されたファイル名を書き出す)】
◆概要
※指定したフォルダに保存されたファイルのファイル名をテーブルに書き出す。
◆前提条件
※サブフォルダはない、index.htmlは除外する
※取得するファイルデータ
ファイル名/ファイルサイズ/最終更新日
※1列目は行番号を記述。
◆[XHTML]+[PHP]
<table id="tblData" cellpadding="1" cellspacing="1">
<colgroup span="5" width="100" align="center" valign="middle" ></colgroup>
<tr>
<th>No</th>
<th>ファイル名</th>
<th>タイプ(拡張子)</th>
<th>サイズ(バイト)</th>
<th>最終更新日</th>
</tr>
<?php
$DirPath="data/"; //フォルダの相対パス(最後/を付ける)
$d = dir($DirPath);
$n=1;
while($file_name= $d->read()) {
if(($file_name!=".")&&($file_name!="..")&&($file_name!="index.html")){
$File=$DirPath.$file_name;
if(!is_dir($File)) {
?>
<tr>
<td><?php echo $n; ?></td>
<td><?php echo $file_name; ?></td>
<td><?php echo str_replace(".","",strrchr($file_name,".")); ?></td>
<td><?php echo filesize($File); ?></td>
<td><?php echo date("Y/m/d H:i",filemtime($File)); ?></td>
</tr>
<?php $n=$n+1;
}
}
}
$d->close();
?>
</table>
<br />
<input type="text" value="<?php echo $n-1; // 有効ファイル数 ?>" />
◆メモ
※$file_nameは、ファイル名の他、空白文字・ピリオド1ケのみ・ピリオド2ケを返すことがある。サーバーの仕様?それらの場合は除外する。
※strrchr($file_name,".")); は ファイル名から.以降の文字を取得---拡張子。
※filesize($File); は$Fileのファイルサイズを取得。
※date("Y/m/d H:i",filemtime($File);は$Fileの最終更新日を「年/月/日」形式で取得。
◆サンプル
「テーブルを作る(PHPで指定フォルダに保存されたファイル名を書き出す)」
http://www.dblpar.com/myscript/sample/php/table_dir/table_dir.php
(DataID:000063 Date:2008/03/22)
【PHPによるクッキーデータの保存】
◆PHP4 Tips
クッキー名:MyCookie
データ名:CkData1,CkData2,CkData3...
function fnSetCookie(){
$strData1="a001"; //保存するデータ
$strData2="a002";
$strData3="a003";
...
$TimeLim=time()+(3600*24*180); //有効期限(タイムスタンプ)---例示は現在から180日後まで
setcookie("MyCookie","CkData1=".$strData1."&CkData2=".$strData2."&CkData3=".$strData3,time()+(3600*24*180));
}
◆メモ
※複数データを保存するには「データ名=値」を&でつなぐ。
※クッキーを有効とするパス名・ドメイン名を指定でき、またHTTPS接続のときにクッキーを送る制限等もあるが、詳細はマニュアルを参照のこと。
※setcookie関数はリダイレクトと同様、すべてのHTML出力の前に実行しなければならない。
※有効期限を指定しないと、ブラウザが閉じたときにクッキーが削除される。
※PHPでは、クッキーでなくセッション変数を使った方が安全かも知れない。
【PHPによるクッキーデータの読み込み】
◆PHP4 Tips
クッキー名:MyCookie
データ名:CkData1,CkData2,CkData3...
if(isset($MyCookie)){
parse_str($MyCookie); //変数の分割
$strData1=stripcslashes(stripcslashes($CkData1));
$strData2=stripcslashes(stripcslashes($CkData2));
$strData3=stripcslashes(stripcslashes($CkData3));
}
◆メモ
※「$クッキー名」という変数ですべてのデータが読み込まれる。
※「データ名=値」を&でつないだ変数を、parse_str関数で分割する。
分割された変数は「$データ名」という変数となる。
※stripcslashes関数は、エスケープされた文字を元に戻す
※クッキーデータは、$_COOKIE["クッキー名"]という形ででも取得することができる。
(DataID:000016 Date:2008/03/03)
【データベース(MySQL)からセレクトしたデータ取得数をカウントする】
◆MySQL+PHP(本文)
※テーブル名:tblMySample
※フィールド:FILD1,FILD2,FILD3,...
※WHRER句:FILD1=$strDat1
<?php
//※データベース設定
require("config.php");
//※SQL接続
$con=mysql_connect(MYSQL_CONNECT_HOST,MYSQL_CONNECT_USER,MYSQL_CONNECT_PASS);
mysql_select_db(MYSQL_DB_NAME);
//※SQL実行
$sql="SELECT COUNT(*) AS CNT FROM tblMySample WHERE FILD1='".$strDat1."'"; //COUNT()を別名CNTで
$res=mysql_query($sql,$con);
$row=mysql_fetch_array($res,MYSQL_ASSOC); //sqlデータ配列変換
$valCNT=$row['CNT']; //取得した値を変数に代入
//※SQLクローズ
mysql_close($con);
?>
◆MySQL(config.php)---データベース設定(本文でrequire())
<?php
define("MYSQL_CONNECT_HOST","localhost"); //DBホスト名
define("MYSQL_CONNECT_USER","DBuser"); //DBuser:sample
define("MYSQL_CONNECT_PASS","DBpassword"); //DB password:sample
define("MYSQL_DB_NAME","DBname"); //DB name:sample
?>
◆メモ
※COUNT()に*でなく特定のフィールドを指定すると、そのフィールドでの検索条件にヒットした件数となる。但し、NULLはカウントされない。
※SELECT COUNT()...を用いず、SELECT文でデータを検索したあとで
...
$res=mysql_query($sql,$con);
$valCNT=mysql_num_rows($res); //セレクトしたデータ数
...
として取得数を取得することもできる。
(DataID:000033 Date:2008/03/05)
【データベース(MySQL)からランダムに複数個のレコードデータをセレクトする】
◆概要
※データベース(MySQL)のテーブル(tblMySample)から、ランダムにn個のレコードをセレクトする
※セレクトしたデータをカンマで接続して文字列に変換する
◆MySQL+PHP(本文)
※テーブル名:tblMySample
※フィールド:FILD1,FILD2,FILD3,...
<?php
//セレクトするレコード数(nは整数)
$n=n;
//※データベース設定
require("config.php");
//※SQL接続
$con=mysql_connect(MYSQL_CONNECT_HOST,MYSQL_CONNECT_USER,MYSQL_CONNECT_PASS);
mysql_select_db(MYSQL_DB_NAME);
//※SQL実行
$sql="SELECT FILD1 FROM tblMySample ORDER BY RAND() LIMIT ".$n
$res=mysql_query($sql,$con);
$SelCNT=mysql_num_rows($res); //セレクトしたデータ数
$j=0;
while($row=mysql_fetch_array($res,MYSQL_ASSOC)){
if($j==0){
$Data=$row['FILD1'];
}else{
$Data.=",".$row['FILD1']; //カンマで接続
}
$n=$n+1;
}
mysql_close($con); //SQLクローズ
?>
◆MySQL(config.php)---データベース設定(本文でrequire())
<?php
define("MYSQL_CONNECT_HOST","localhost"); //DBホスト名
define("MYSQL_CONNECT_USER","DBuser"); //DBuser:sample
define("MYSQL_CONNECT_PASS","DBpassword"); //DB password:sample
define("MYSQL_DB_NAME","DBname"); //DB name:sample
?>
◆メモ
※重複しないレコードをセレクトする。
※$データは 「****,****,****」という文字列になる。
※テーブルのすべてのレコードを参照するので、レコードが多いテーブルでは、かなりサーバーの負荷になる。別の方法を採用する必要がある。
(DataID:000087 Date:2008/04/21)
【タイムスタンプによる日時の差の計算】
◆MySQLのフィールドの種別をdatetimeに設定すると、データは
1999-99-99 99:99:99(年-月-日 時:分:秒)
という形式で格納される。このデータを取得して現在時刻との差を計算する。
◆PHP Tips
//$strRegDate:MySQLから取得した日時データ
$strTimeStamp=strtotime($strDate); //タイムスタンプに変換
$strTime=time()-$strTimeStamp); //タイムスタンプ差計算
◆MEMO
※現在の日時のタイムスタンプ time()
※1週間のタイムスタンプ= 7*24*3600
※n日間のタイムスタンプ= n*24*3600
(DataID:000001 Date:2008/02/27)
【ディレクトリ(フォルダ)の存在をチェック、作成。パーミッションも設定する】
◆概要
※ディレクトリ(フォルダ)の存在をチェックし
存在しないときは、新たにフォルダを作成する
存在するときは、パーミッョンを取得する
パーミッションの設定が異なる場合は、設定しなおす
※作成したフォルダのパーミッョン設定が何故かうまくいかない。
◆問題点
※現在使用しているレンタルサーバ[xrea.com]では下記の方法でフォルダ作成・パーミッション設定は可能だが、所有者がapacheになり、作成したフォルダへのファイル書き込みができない。
※解決方法は、本ページでカテゴリ[PHP]の
「xrea.com+PHPでフォルダを自動的に作成したときの所有者問題」
を参照のこと。
◆Tips
[php]
<?php
$FileFolder="data"; //フォルダへのの相対パス(http://〜でない)
//フォルダが存在しない場合フォルダを作る
if(!file_exists($FileFolder)){
if(mkdir($FileFolder,0707)){ //パーミッョン設定不具合
chmod($FileFolder,0707); //フォルダ属性(8進数で指定)
}else{
echo "フォルダ作成エラー";
}
//フォルダが存在する場合
}else{
$FolderPerms=substr(sprintf("%o",fileperms($FileFolder)),-4);
//パーミッョンが707でないときは設定する
if ($FolderPerms!="0707"){
chmod($FileFolder, 0707); //フォルダ属性(8進数で指定)
}
}
◆フォルダを作る
mkdir($FileFolder,0707);
※パーミッョン707の場合は0を付けて0707と指定する(8進数)。
※これで指定するとパーミッョンが0303となる。そのため、フォルダを作成したあとで、パーミッション設定変更を行う。
※下記の例で実際の数値はわがサーバーの場合であり、サーバーが異なると結果も違う可能性あり。
◆パーミッョンを設定する
chmod($FileFolder,0707);
※8進数で指定(707のときは0を付けて0707)
◆フォルダのパーミッションを取得する
$FolderPerms=substr(sprintf("%o",fileperms($FileFolder)),-4);
※上記の例では、フォルダが存在するときはパーミッョンをチェックしている。10進数なので8進数に整形する必要がある。
(1)パーミッションの取得
$xx1=fileperms($FileFolder);
※10進数によるパーミッションが返る。707の場合、17089となる。
(2)10進数を8進数に整形する
$xx2=sprintf("%o",$xx1);
※707の場合、40707が返る。
(3)上記(2)の右から4桁を切り出す
$FolderPerms=substr($xx2,-4)
(DataID:000064 Date:2008/03/25)
【パス名(C;\〜\)からファイル名・ディレクトリ名を切り出す】
◆概要
※パス名からディレクトリ名・ファイル名を切り出す
(1)basename()・dirname()を用いる
(2)strrev()・strpos()等の文字列操作関数を用いる
◆Tips---(1)basename()・dirname()を用いる
[PHP]
//ファイルパス$strFilePath="D:\web_data\dblpar\homepage\test.php";
※パス名からファイル名を取得
$strFileName=basename($strFilePath);
//$strFileName="test.php"となる
※パス名からディレクトリ名を取得
$strDrPath=dirname($strFilePath);
//$strFileName="D:\web_data\dblpar\homepage"となる
※パス名を用いず、現在のファイルのディレクトリ名を取得
$strDrPath=getcwd();
//$strFileName="D:\web_data\dblpar\homepage"となる
※応用---$strFilePathがディレクトリ名のみの場合
//ファイルパス(ファイル名なし)
$strFilePath="D:\web_data\dblpar\homepage";
※ファイルを保存するフォルダ名
$strFileName=basename($strFilePath);
//$strFileName="homepage"となる
※親ディレクトリを取得
$strDrPath=dirname($strFilePath);
//$strFileName="D:\web_data\dblpar"となる
◆Tips---(2)strrev()・strpos()等の文字列操作関数を用いる
※(1)の方法で充分だが、以下は、話のネタに...
[PHP]
$strPath="C:\sample\sample2\file.jpg"; //ファイルのパス
$strFName=fnGetFileName($strPath);
function fnGetFileName($strPath){
$strPath_r=strrev($strPath); //文字列を逆順に並べ換え
$ff=$strSelFile,"\\",0); //\の出現位置を取得
$strFName2=substr($strPath_r,0,$ff); //$ffの位置まで切り出す
$strFName=strrev($strFName2); //文字順を元に戻す
return $strFName;
}
※実行結果:
$strFName=file.jpg となる
※エラー
[\]の出現位置を取得する
$ff=strpos($strSelFile,"\\",0);
は
$ff=strpos($strSelFile,"\",0);
とにしてIE7.0でスクリプトを実行すると、下記のエラーが発生する。
Warning: Unexpected character in input: '\' (ASCII=92) state=1 in [実行中のPHPファイルの絶対パス] on line [ライン数]
インターネット上でいろいろ調べてみると、なにやらIE7.0の文字コードの問題らしいが、詳細はよく判らない。javascriptでもスクリプトに[\]を用いると同じ現象が生じる。
(DataID:000009 Date:2008/03/01)
【ファイルの種類を調べる(PHP)】
◆概要
※if文などでよく用います。例えば
if(is_dir($strR){
...
}
など。
◆tips
[PHP]
$strR2:戻り値(論理値)
$strR:ファイルパス
$strR2=is_*($strR);
※該当するときはtrue、異なる場合はfalseを返す。
[種類]
$strR2=is_dir($strR) :ディレクトリか否か
$strR2=is_file($strR):通常のファイルか否か
$strR2=is_readable($strR):読み取り可能か否か
$strR2=is_writable($strR):書き込み可能か否か
$strR2=is_executable($strR):実行可能か否か
※この他にもあり。
(DataID:000082 Date:2008/04/01)
【どのラジオボタンが選択されているかチェックする】
◆数設置されたのラジオボタンのどれが選択されているかチェックする。ラジオボタンに設定された値(value)を取得することもできる。
◆javascript Tips
[XHTML]
//複数のラジオボタン
<form name="FORM">
<input type="radio" name="dbnMenu" value="1" onclick="fnSelRab2(this)" />その1
<input type="radio" name="dbnMenu" value="2" onclick="fnSelRab2(this)" />その2
<input type="radio" name="dbnMenu" value="3" onclick="fnSelRab2(this)" />その3
<input type="radio" name="dbnMenu" value="4" onclick="fnSelRab2(this)" />その4
</form>
<a href="javascript://" onclick="fnSelRab()">実行</a>
...
[javascript]
//まとめて
function fnSelRab(){
for(i=0;i<=3;i++){
if(document.FORM.elements["dbnMenu"][i].checked){
rdbValue=document.FORM.elements["dbnMenu"][i].value
}
}
alert(rdbValue);
}
//チェックするたびに
function fnSelRab2(Obj){
alert(Obj.value);
}
◆ラジオボタンのname属性を同じにすることで、submitしてpost送信したときサーバー側のPHPでは下記のようにしてラジオボタンの値を取得することができる。
<?php
$strSelrdb= $_POST['dbnMenu'];
?>
(DataID:000026 Date:2008/03/04)
【ランダムに画像を選択して表示する】
◆概要
※rand(最小,最大)を用いて画像をランダムに選択して書き出す
◆tips
[jpeg]
※整数の連番名を付けた画像を準備する。
gaz_0.gif
gaz_1.gif
...
gaz_20.gif
(最小値:n=0、最大値:n=20)---整数、
※画像の大きさは統一(下記例では20×20px)
[PHP]
<?php
$Gazou="gaz_".rand(0,20).".gif";
?>
<img src="<?php echo $Gazou; ?>" width="20" height="20" border="0" alt="">
◆メモ
※データベースから複数行のレコードをセレクトして表示する場合等で、行毎に表示する画像をランダムに変える、といったときに有効
(DataID:000088 Date:2008/04/21)