-
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
-
POSTやGETなどのスーパーグローバル変数へのアクセスは直接以下の様にすることで行えます。
この例では、$_GET変数から id という引数を取得します。<?php if((isset($_GET["id"]) == false) || ($_GET["id"] == "")) { $id = ''; }else{ $id = $_GET["id"]; } ?>
これを filter_input 関数を使うと1行ですっきりします。<?php $id = filter_input(INPUT_GET, 'id'); ?>
但し、これだと引数 id が全く指定されない場合は、変数 $id の中身がNULLになってしまいます。 そこで filter_input 関数の第3引数に FILTER_SANITIZE_STRING を指定すれば id を文字列として 取得できます。<?php $id = filter_input(INPUT_GET, 'id', FILTER_SANITIZE_STRING); ?>
引数 id を整数値として扱いたい場合は、第3引数に FILTER_VALIDATE_INT を指定します。<?php $id = filter_input(INPUT_GET, 'id', FILTER_SANITIZE_STRING); ?>
この場合でも、id=aaa の文字列指定であったり、id= の様に未指定であったりすると 変数 $id が false で返されます。
これでは不都合があったりしますので、値の規定値、最小値、最大値の指定を filter_input 関数の第4引数に配列で指定します。<?php $id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT, array('options' => array('default' => 0, 'min_range' => 0, 'max_range' => 999) ) ); ?>
指定された min_range指定値と max_range指定値の範囲外の場合は default指定値が返されます。
PR -
画像ファイルのアップロードでBMPファイルをJPGに変換する時に imagecreatefromwbmpを使ったがうまくいかない現象が発生しました。 以下の様なソースで、画像ファイルの種類としては「jpeg」「bmp」「png」「gif」を 対象としていたのですが、「bmp」用の関数「imagecreatefromwbmp」がうまく動作しませんでした。
// 画像ファイル名のチェック if (!empty($_FILES['fileImage']['name'])) { $strExt = strtolower(pathinfo($_FILES['fileImage']['name'], PATHINFO_EXTENSION)); // ファイル拡張子が正常の場合 switch ($strExt) { case "jpg": case "jpeg": $im = @imagecreatefromjpeg($_FILES['fileImage']['tmp_name']); break; case "bmp": $im = @imagecreatefromwbmp($_FILES['fileImage']['tmp_name']); break; case "png": $im = @imagecreatefrompng ($_FILES['fileImage']['tmp_name']); break; case "gif": $im = @imagecreatefromgif ($_FILES['fileImage']['tmp_name']); break; default: $im = FALSE; break; } //JPEGファイルへの変換 if (!$im) { imagejpeg($im, 'test.jpg'); } }
何度やってもうまくいかないので、PHPの正式な関数の説明書を見ると 以下の関数の投稿が載っていました。
ダメもとで一度この関数で行うと取り敢えず処理がうまくいったのでこれでOKとしました。/*********************************************/ /* Fonction: ImageCreateFromBMP */ /* Author: DHKold */ /* Contact: admin@dhkold.com */ /* Date: The 15th of June 2005 */ /* Version: 2.0B */ /*********************************************/ function ImageCreateFromBMP($filename) { //Ouverture du fichier en mode binaire if (! $f1 = fopen($filename,"rb")) return FALSE; //1 : Chargement des ent?tes FICHIER $FILE = unpack("vfile_type/Vfile_size/Vreserved/Vbitmap_offset", fread($f1,14)); if ($FILE['file_type'] != 19778) return FALSE; //2 : Chargement des ent?tes BMP $BMP = unpack('Vheader_size/Vwidth/Vheight/vplanes/vbits_per_pixel'. '/Vcompression/Vsize_bitmap/Vhoriz_resolution'. '/Vvert_resolution/Vcolors_used/Vcolors_important', fread($f1,40)); $BMP['colors'] = pow(2,$BMP['bits_per_pixel']); if ($BMP['size_bitmap'] == 0) $BMP['size_bitmap'] = $FILE['file_size'] - $FILE['bitmap_offset']; $BMP['bytes_per_pixel'] = $BMP['bits_per_pixel']/8; $BMP['bytes_per_pixel2'] = ceil($BMP['bytes_per_pixel']); $BMP['decal'] = ($BMP['width']*$BMP['bytes_per_pixel']/4); $BMP['decal'] -= floor($BMP['width']*$BMP['bytes_per_pixel']/4); $BMP['decal'] = 4-(4*$BMP['decal']); if ($BMP['decal'] == 4) $BMP['decal'] = 0; //3 : Chargement des couleurs de la palette $PALETTE = array(); if ($BMP['colors'] < 16777216) { $PALETTE = unpack('V'.$BMP['colors'], fread($f1,$BMP['colors']*4)); } //4 : Cr?ation de l'image $IMG = fread($f1,$BMP['size_bitmap']); $VIDE = chr(0); $res = imagecreatetruecolor($BMP['width'],$BMP['height']); $P = 0; $Y = $BMP['height']-1; while ($Y >= 0) { $X=0; while ($X < $BMP['width']) { if ($BMP['bits_per_pixel'] == 24) $COLOR = unpack("V",substr($IMG,$P,3).$VIDE); elseif ($BMP['bits_per_pixel'] == 16) { $COLOR = unpack("n",substr($IMG,$P,2)); $COLOR[1] = $PALETTE[$COLOR[1]+1]; } elseif ($BMP['bits_per_pixel'] == 8) { $COLOR = unpack("n",$VIDE.substr($IMG,$P,1)); $COLOR[1] = $PALETTE[$COLOR[1]+1]; } elseif ($BMP['bits_per_pixel'] == 4) { $COLOR = unpack("n",$VIDE.substr($IMG,floor($P),1)); if (($P*2)%2 == 0) $COLOR[1] = ($COLOR[1] >> 4) ; else $COLOR[1] = ($COLOR[1] & 0x0F); $COLOR[1] = $PALETTE[$COLOR[1]+1]; } elseif ($BMP['bits_per_pixel'] == 1) { $COLOR = unpack("n",$VIDE.substr($IMG,floor($P),1)); if (($P*8)%8 == 0) $COLOR[1] = $COLOR[1] >>7; elseif (($P*8)%8 == 1) $COLOR[1] = ($COLOR[1] & 0x40)>>6; elseif (($P*8)%8 == 2) $COLOR[1] = ($COLOR[1] & 0x20)>>5; elseif (($P*8)%8 == 3) $COLOR[1] = ($COLOR[1] & 0x10)>>4; elseif (($P*8)%8 == 4) $COLOR[1] = ($COLOR[1] & 0x8)>>3; elseif (($P*8)%8 == 5) $COLOR[1] = ($COLOR[1] & 0x4)>>2; elseif (($P*8)%8 == 6) $COLOR[1] = ($COLOR[1] & 0x2)>>1; elseif (($P*8)%8 == 7) $COLOR[1] = ($COLOR[1] & 0x1); $COLOR[1] = $PALETTE[$COLOR[1]+1]; } else return FALSE; imagesetpixel($res,$X,$Y,$COLOR[1]); $X++; $P += $BMP['bytes_per_pixel']; } $Y--; $P+=$BMP['decal']; } //Fermeture du fichier fclose($f1); return $res; }
-
PHPでのQRバーコードの生成方法ですが、以下のサイトにフリーソフトが公開されていますのでこれを使ってみます。
⇒QRcode Perl CGI & PHP scripts ver. 0.50
ページの下の方の「qr_img0.50j.tar.gz (1007KB)」をダウンロードします。
ダウンロードしたファイルを展開し「qr_img0.50j」フォルダができますので、 PHPプログラムのあるディレクトリに全てをコピーします。
このプログラムの使い方は「qr_img0.50j/README.txt」に詳しく書かれていますが、 プログラムの出力が画像データそのものなので、HTMLのIMGタグのURLとして指定すれば ブラウザでQRコードが表示されます。
HTMLのソースは以下の様になります。<!DOCTYPE html> <html lang="ja"> <body> <IMG SRC="./qr_img0.50j/php/qr_img.php?d=test"> </body> </html>
PHPのプログラムで使う場合は以下の様なソースになります。<?php // コード化したいURL $strQR = urlencode("./test.html?data=aaaaaa"); // QRコードの生成(デフォルトでPNGファイル生成) $strURL = 'http://localhost/_qr/qr_img0.50j/php/qr_img.php?d='.$strQR; $qr_img = file_get_contents($strURL); // PNGファイルの書込み $fp = fopen('./qrcode.png', 'w'); fputs($fp, $qr_img); fclose($fp); ?> <!DOCTYPE html> <html lang="ja"> <body> <IMG SRC="./qrcode.png"> </body> </html>
ここで注意するのは「qr_img.php」を呼出す場合は、URLをサイトの先頭から記述することです。
-
PHPでの長い処理の中で単にブラウザに表示する場合、以下の様な手順で行います。
まず最初にブラウザに対する出力用バッファを最初にフラッシュをします。
その後、長時間の処理のループで echo 関数で文字列を表示した時に その都度バッファのフラッシュを行います。
プログラムの例としては以下の通りです。<?php // 実行時間の無制限 set_time_limit( 0 ); // 出力バッファクリア ob_end_flush(); ob_start(); // 結果が出力される様に空白出力 echo str_repeat( ' ', 4096 ); echo("start...<br />\n"); for($i = 1; $i <= 100;$i++){ //件数表示 echo($i."件目処理...<br />\n"); ob_flush(); flush(); sleep(10); } echo("end...<br />"); ob_flush(); flush(); ?>
-
HTMLの a タグのリンク先にPHPプログラムを指定してファイルをダウンロードする方法ですが、 リンクファイルの引数を GET 指定する様にします。
HTMLのソースは以下の様にします。 リンクファイルの引数を file として、その値にファイル名を直接指定しています。
呼出すPHPプログラムは download.php とします。
<!doctype html> <html lang="ja"> <head> <meta charset="utf-8"> </head> <body> <h1>ファイルダウンロード</h1> <br /> <a href="./download.php?file=test.txt">ファイルダウンロード(test.txt)</a> </body> </html>
PHPプログラムは以下の通りです。
<?php //指定ファイル名 if(!isset($_GET['file'])){ exit(); } $fileName = $_GET['file']; //ヘッダ header('Content-Type: application/force-download'); //ダイアログボックスの表示ファイル名 header('Content-Disposition: attachment; filename="'.basename($fileName).'"'); header('Content-Transfer-Encoding: binary'); header('Content-Length: '.filesize($fileName)); header('X-Download-Options: noopen'); //出力バッファの無効化 while (ob_get_level()) { ob_end_flush(); } flush(); //ファイル出力 readfile($fileName); ?>
いろんなサイトを見ると、 出力ヘッダのタイプは application/force-download でOKな様です。
ファイル出力は readfile() で行います。