理工系研究者のための Mac OS X, Windows, Linux メモ
 
ホーム >> プログラミング >> PHP
このエントリーをはてなブックマークに追加

PHP

更新日:2012.6.5

PDO (PHP Data Objects)

関連のあるページ


連想配列の特定のキーが存在するかどうか確認する

作成日:2016.9.20

連想配列の特定のキーが存在するかどうか確認するための関数array_key_existsが準備されている。

bool array_key_exists(mixed $key,array $array)
$keyには整数や文字列などキーとして設定されている可能性のある値を与える。 $arrayには調査対象の連想配列を与える。
<?php
//配列を準備する
$arr=array('one'=>1,'two'=>2,21=>'car');
if(array_key_exists('one',$arr)){
  echo "The key 'one' exists."
} 
?>
ここで$arrayは配列でなければならないので、配列ではない可能性があるならばあらかじめis_array関数で確認すること。

特定のキーが存在するかどうか確認するにはisset関数を用いることもできる。 isset関数は調査対象の変数が配列でなかったり、定義されていなくても判定できる。 ただしarray_key_existsと異なる挙動が一点ある。 配列にNULLが入力されている場合に、array_key_existstrueを返すのに対して、issetfalseを返す。

<?php
//配列を準備する
$arr=array('three'=>NULL,'four'=>4,21=>'car');

echo "USE array_key_exist().\n";
if(array_key_exists('three',$arr)){
  echo "The key 'three' exists.\n";
}
else{
  echo "The key 'three' does not exist.\n";
}

echo "USE isset().\n";
if(isset($arr['three'])){
  echo "The key 'three' exists.\n";
}
else{
  echo "The key 'three' does not exist.\n";
}
?>
USE array_key_exist().
The key 'three' exists.
USE isset().
The key 'three' does not exist.

▼参考サイト or 参考文献

代入文の戻り値は代入値

作成日:2011.10.19

代入文の戻り値を調べてみると、

var_dump($foo = "bar");
// => string(3) "bar"
変数に代入する値自身であることがわかる。

この性質を利用すれば、次のような表現ができる。

$a=$b=3;
var_dump($a,$b);
// => int(3)
// => int(3)
while(($line=fgets($fp))!=FALSE){
  ...
}

文字列から画像ファイルを作成する

作成日:2011.4.7

電子メールアドレスをウェブサイトに掲載する場合などに、スパム対策でテキスト・データを画像に変換したい場合がある。変更頻度が低ければ、グラフィックソフトで画像を生成し、それを貼り込めば良いが、度々変更する場合などは、テキストファイルから動的に生成できると便利。

文字列を画像に変換するためにPHPのimagettftext()という関数を利用する。 この関数を使うためには、PHPをGDライブラリとFreeTypeライブラリが利用できる状態でコンパイルしておく必要がある。 コンパイル方法についてはこのサイトの「PHPインストール」のページを参考にして欲しい。

文字列から画像ファイルを作成し、それを表示するためのコードは次の通り。

<?php
$filename='address.png';
putenv('GDFONTPATH=' . realpath("."));
$fontname='ipag.ttf';
$email='E-mail: hoge@example.jp';
    
$img=imagecreatetruecolor(300,20); // 画像の大きさ
$bgColor=imagecolorallocate($img,255,255,255); //背景色
imagefill($img,0,0,$bgColor); //背景色を塗る

$fgColor=imagecolorallocate($img,0,0,0); //文字色
imagettftext($img,12,0,0,16,$fgColor,$fontname,$email);
imagepng($img, $address); //画像の書き出し

printf("<img src=\"%s\">\n", $address);
?>

このコードでは、カレントディレクトリに一旦画像ファイルを作成し、それを表示する。 また画像を作成するのに必要なTrueTypeフォント(ipag.ttf)もカレントディレクトリにあることを想定している。 フォントを用意せずに、組み込みフォントを使う場合にはimagettftext()の代わりにimagestring()の利用を検討するとよい。 ただし、imagestring()では日本語は使えない。

includeパスのまとめ

includeやrequireで読み込む外部ファイルを置くディレクトリを指定する方法には次の方法がある.

  • PHPの設定ファイルphp.iniに書く
  • .htaccessに書く
  • PHPのファイルに書く

PHPの設定ファイルphp.iniに書く

php.iniの中に

include_path = ".:./include:/usr/local/php5/lib/php"
のような設定があるので,ここにコロンで区切ってパスを並べる.

.htaccessに書く

.htaccessに

php_value include_path ".:/php/includes:/usr/local/php5/lib/php"
のように書く.適用される範囲は.htaccessを置いたディレクトリ以下にあるPHPファイル.

PHPのファイルに書く

PHPのset_include_path()を用いる.

set_include_path(".:/php/includes:/usr/local/php5/lib/php");

この設定方法を汎用的に用いるためには,

$path=$_SERVER["DOCUMENT_ROOT"]."/hogehoge/include";
set_include_path(get_include_path() . PATH_SEPARATOR . $path);
のようにするとよい.

▼参考サイト or 参考文献

ファイル名を取得したい

スクリプトの中でファイル名を取得するには、

$filename = basename($_SERVER['SCRIPT_NAME']);
とすればよい。basename()はファイル名からディレクトリ部分を取り除く関数。

ダウンロードするファイルにファイル名を付けたい

例えばPDFファイルをダウンロードする時に、ファイル名を指定するには次のように書く。

$output="output.pdf";
header("Content-type: application/pdf");
header("Content-Disposition: attachment; filename=$output");

FORMタグからアップロードできるファイル容量を増やしたい

環境: PHP 4.3.10 (cli) (built: Jan 4 2005 16:04:24)
Apache/2.0.52

PHPの設定ファイル php.ini に次のように設定する。

memory_limit = 100MB
post_max_size = 98MB
upload_max_filesize = 96MB

それぞれの値は、

memory_limit > post_max_size > upload_max_filesize

になるようにする。

PHPのエラーをブラウザに表示しないようにしたい

PHPスクリプトを作成している段階では、エラーがブラウザに表示されるとデバッグしやすいが、実際に運用段階になれば、エラーメッセージをブラウザに出さないようにしなければならない。

エラーをブラウザに表示しないようにし(display_errors)、エラーログをファイルに出力し(log_errors)、エラーログを出力するファイルを指定する(error_log)には、php.iniに次のように指定する。

display_errors = Off
log_errors = On
error_log = /var/log/php

エラーログを出力するファイルに対してウェブサーバーの実行ユーザー apache2 の書き込み権限あるかどうかあらかじめ確認しておくこと。

設定ファイル php.ini の位置の位置を確認したい

php.ini の置き場所は、バージョンやディストリビューションによって変わる事があるため、実際に読み込まれているphp.iniを確認しておく。

$ /usr/local/php5/bin/php -r "phpinfo();" | grep php.ini
Configuration File (php.ini) Path => /usr/local/php5/lib/php.ini

また、次のファイルを作成してウェブサイトに置き、ブラウザから読み込む方法もある。

<?php
phpinfo();
?>

PHPのバージョンを見えないようにする

何も設定しないと、HTTPヘッダー情報にPHPのバージョンが入る。 バージョン情報を見えなくするには php.ini を開いて expose_php を Offにする。

expose_php = Off

PDO: SQLite3のデータベースからデータを取得したい

作成日:2012.1.13

SQLite3のデータベースファイル hoge.sqlite3 がPHPスクリプトを書いたファイルと同じディレクトリにある場合、

$db=new PDO("sqlite:hoge.sqlite3"); //データベースを開く
として開く。SQLコマンドを実行するには、
$sql="SELECT * FROM mytable";
$stmt=$db->prepare($sql);
$stmt->execute();
$row=$stmt->fetch();
とする。mytableはデータベースに含まれるテーブルとする。

PDO: prepareメソッドの使い方を知りたい

作成日:2012.1.13

SQLコマンドに:valiableの形でプレースホルダーを埋め込んでおき、実行前に置き換えることができる。

$sql="SELECT * FROM mytable WHERE age>=:lowerAge AND age<:upperAge";
$stmt=$db->prepare($sql);
$stmt->bindValue(':lowerAge', 30, PDO::PARAM_INT);
$stmt->bindValue(':upperAge', 50, PDO::PARAM_INT);
$stmt->execute();

クエスチョンマークをプレースホルダーとして使うこともできる。

$sql="SELECT * FROM mytable WHERE age>=? AND age<?";
$stmt=$db->prepare($sql);
$stmt->execute(array(30,50));
この場合、executeメソッドの引数に配列として値を与える。