SQLの窓

2020年07月25日


ロリポップのモジュール版 PHP でエラーを出力する方法




実行する PHP の先頭で、『ini_set("display_errors", 1);』を実行して、処理は全て別のファイルに書いて require_once() します。こうする事によって、PHP は以下の例の action1.php 内で発生したエラーに対して error_reporting の設定に基づいてエラーを表示します。
<?php
ini_set("display_errors", 1);

require_once("action1.php");

?>

action1.php のサンプル
<?php
common_action();

$a = 1;

function common_action() {

    error_reporting( E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED );
    session_cache_limiter('nocache');
    session_start();

    header( "Content-Type: text/html; charset=utf-8" );
}


?>
<!DOCTYPE html>
<html>
<head>
<meta content="width=device-width initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" name="viewport">
<meta charset="utf-8">
<title>メール送信</title>
<head>
<body>
<div>メール送信</div>
</body>
</html>

このソースで、$a = 1; のセミコロンを削除して実行してみると以下のようになるはずです
Parse error: syntax error, unexpected 'function' (T_FUNCTION) in /home/users/1/yourdomain/web/yourapp/path/action1.php on line 6



そして、action1.php を直接実行すると Google Chrome では以下のようになります




では、WordPress の場合はどうするかというと

※ wp-config.php の先頭に 『ini_set("display_errors", 1);』を記述してください



posted by lightbox at 2020-07-25 15:12 | PHP | このブログの読者になる | 更新情報をチェックする

2019年02月28日


PHP : unset によるオブジェクトのプロパティのと配列の要素の削除

unset() は指定した変数を破棄します。その結果オブジェクトではプロパティが削除され、連想配列ではその変数が削除されます

Run code で検証

※ 日本語のプロパティなので、$obj->{"手当"} というように参照します

get_object_vars : 非 static プロパティを連想配列として返します
$format1 = <<<FIELD
{
    "社員コード": "",
    "氏名": "",
    "フリガナ": "",
    "所属": "",
    "性別": "",
    "作成日": "",
    "更新日": "",
    "給与": "",
    "手当": "",
    "管理者": "",
    "生年月日": ""
}
FIELD;

print "\n-----------------------------------";
print "\nJSON文字列\n";
print $format1;

print "\n-----------------------------------";
print "\nオブジェクトに変換したもの\n";

$obj = json_decode($format1);
print_r($obj);

print "\n-----------------------------------";
print "\n『手当』プロパティを削除\n";
unset($obj->{"手当"});

print_r($obj);

print "\n-----------------------------------";
print "\n配列に変換したもの\n";

$array = get_object_vars( $obj );
print_r( $array );

print "\n-----------------------------------";
print "\n配列の要素を削除\n";

unset($array["所属"]);
    
print_r( $array );


実行結果
-----------------------------------
JSON文字列
{
    "社員コード": "",
    "氏名": "",
    "フリガナ": "",
    "所属": "",
    "性別": "",
    "作成日": "",
    "更新日": "",
    "給与": "",
    "手当": "",
    "管理者": "",
    "生年月日": ""
}
-----------------------------------
オブジェクトに変換したもの
stdClass Object
(
    [社員コード] => 
    [氏名] => 
    [フリガナ] => 
    [所属] => 
    [性別] => 
    [作成日] => 
    [更新日] => 
    [給与] => 
    [手当] => 
    [管理者] => 
    [生年月日] => 
)

-----------------------------------
『手当』プロパティを削除
stdClass Object
(
    [社員コード] => 
    [氏名] => 
    [フリガナ] => 
    [所属] => 
    [性別] => 
    [作成日] => 
    [更新日] => 
    [給与] => 
    [管理者] => 
    [生年月日] => 
)

-----------------------------------
配列に変換したもの
Array
(
    [社員コード] => 
    [氏名] => 
    [フリガナ] => 
    [所属] => 
    [性別] => 
    [作成日] => 
    [更新日] => 
    [給与] => 
    [管理者] => 
    [生年月日] => 
)

-----------------------------------
配列の要素を削除
Array
(
    [社員コード] => 
    [氏名] => 
    [フリガナ] => 
    [性別] => 
    [作成日] => 
    [更新日] => 
    [給与] => 
    [管理者] => 
    [生年月日] => 
)




タグ:PHP
posted by lightbox at 2019-02-28 15:59 | PHP | このブログの読者になる | 更新情報をチェックする

2016年05月05日


レンタルサーバで PHP のバージョンを 5.4 から 5.6 に変更する時の注意事項

PHP 5.4 までは default_charset に値が入っていませんでした。しかし、5.6 では default_charset = UTF-8 となるので日本語が化ける可能性がとても多くなります。そこで、php.ini の中に以下のように設定を追加します
default_charset = 

こうすると、PHP 5.4 と同じ no_value 設定になります( phpinfo 関数で確認します )



但し、その php ファイルが参照できる範囲に別の個別の php.ini があると、その設定で全て上書きされるので注意して下さい。



posted by lightbox at 2016-05-05 14:36 | PHP | このブログの読者になる | 更新情報をチェックする

2015年06月25日


【3大手法】 PHP で変数を埋め込んだ画面定義を外部ファイルにして、ループ内で展開する

外部ファイルを読み込む手段としては二つあって、一つは一般的な require で行います。もう一つはテキストファイルとして file_get_contents を使用します。

以下のサンプルソースの実行時の環境としては、データベースに対して接続した後、select 文を実行して行データをループで取得しているという前提です。

require 使った標準的な手法

この方法は PHP のあたりまえの記述で、想定通りの結果になる手法です。ただ、外部ファイルの埋め込み方法の記述も一般的になる為、変数埋め込みの記法が面倒で、画面作成やメンテナンスに時間がかかりますし、他の目的への転用は全くできません。
// 画面作成
print "<table>";
while ($row = $result->fetch_array(MYSQLI_BOTH)) {

	// 行の繰り返し
	require("view_row.php");

}
print "</table>";

<tr>
	<td class="left"><?= $row["社員コード"] ?></td>
	<td class="right"><?= $row["氏名"] ?></td>
</tr>


file_get_contents 使った手法

この方法は、画面定義用の文字列を単純に外部ファイルにして、テキストデータ内の変数を eval を使って置き換える手法です。この場合、変数部分以外も単純な文字列なので、正規表現による置換や単純な置換の対象となりますし、利用方法はいろいろな場面であらわれると思います。( SQL 文の定義にも有効です )

ただ、変数の記述部分のルールとして、連想配列部分の文字列はシングルクォートで書く必要があります
// 画面作成
print "<table>";
while ($row = $result->fetch_array(MYSQLI_BOTH)) {

	// 行の繰り返し
	$view_row = file_get_contents("view_row.txt");
	$view_row = str_replace('"', '\\"', $view_row );
	eval("\$view_row = \"$view_row\";");
	print $view_row;

}
print "</table>";

<tr>
	<td class="left">{$row['社員コード']}</td>
	<td class="right">{$row['氏名']}</td>
</tr>



require の中で、ヒアドキュメントを使う方法

この方法が一番簡単で単純で、本来のヒアドキュメントの目的をしっかり使ったものです。難しい問題は全く無く、自然に使える方法です。

ここでは、print を外に出して使っていますが、view_row.php 内で print してしまってもかまいません。
// 画面作成
print "<table>";
while ($row = $result->fetch_array(MYSQLI_BOTH)) {

	// 行の繰り返し
	require("view_row.php");
	print $view_row;

}
print "</table>";

<?php
$view_row = <<<VIEW_ROW
<tr>
	<td class="left">{$row["社員コード"]}</td>
	<td class="right">{$row["氏名"]}</td>
</tr>
VIEW_ROW;
?>

いずれも関数化する事は可能ですが、テキストを外部に定義して管理するという目的においては、file_get_contents を使う方法が最も優れています。( 画面作成の場合、文字列を取得するだけで後で使うという選択肢のほうが現実的です )

require は、その場で書いてしまう場合において、一般的なメンテナンス性が向上するはずです。

関数化する場合は、埋め込む変数にスーパーグローバルの $GLOBALS を使うといいです。



タグ:PHP
posted by lightbox at 2015-06-25 11:14 | PHP | このブログの読者になる | 更新情報をチェックする

2015年06月23日


PHP で pathinfo と mime 情報やその他を合体した、get_finfo 関数を使って、opendir からファイル一覧を出力

ファイルの一覧から、ファイル情報を配列でまとめたものを一括で取得できるようにしました。

※ Windows では、php.ini の extension=php_fileinfo.dll を有効にする必要があります
<?php
header( "Content-Type: text/html; Charset=utf-8" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

print "<pre>";

$target = ".";
print realpath($target) . "\n";

$dir_handle = @opendir($target);
if ( $dir_handle ) {
	// ディレクトリハンドルの取得成功

	while (false !== ($entry = readdir($dir_handle))) {
		// 対象外は読み飛ばし
		if ( $entry == '.' || $entry == '..' ) {
			print  "対象外=>{$entry}\n";
			continue;
		}

		print  "{$entry}\n";
		print_r( get_finfo($target.DIRECTORY_SEPARATOR.$entry) );


	}
}

print "</pre>";

function get_finfo($path) {

	$finfo = finfo_open(FILEINFO_MIME);
	$mime = finfo_file($finfo, $path);
	$mime2 = explode( "; ", $mime );
	$mime3 = explode( "=", $mime2[1] );
	$pathinfo = pathinfo(realpath($path));
	$path_parts = pathinfo($pathinfo["dirname"]);
	$pathinfo["parent"] = $path_parts["basename"];
	$pathinfo["mime"] = $mime2[0];
	$pathinfo["charset"] = $mime3[1];
	if ( $pathinfo["charset"] == "" ) {
		unset($pathinfo["charset"]);
	}
	$pathinfo["size"] = filesize($path);
	if ( $pathinfo["mime"] == "directory" ) {
		unset($pathinfo["size"]);
	}
	$pathinfo["full"] = realpath($path);

	return $pathinfo;

}

?>


▼ 以下は、Windows での実行サンプルです。
C:\user\web\basic
対象外=>.
対象外=>..
db_update
Array
(
    [dirname] => C:\user\web\basic
    [basename] => db_update
    [filename] => db_update
    [parent] => basic
    [mime] => directory
    [full] => C:\user\web\basic\db_update
)
dir_test.php
Array
(
    [dirname] => C:\user\web\basic
    [basename] => dir_test.php
    [extension] => php
    [filename] => dir_test
    [parent] => basic
    [mime] => text/x-php
    [charset] => utf-8
    [size] => 1457
    [full] => C:\user\web\basic\dir_test.php
)
log.zip
Array
(
    [dirname] => C:\user\web\basic
    [basename] => log.zip
    [extension] => zip
    [filename] => log
    [parent] => basic
    [mime] => application/zip
    [charset] => binary
    [size] => 1589
    [full] => C:\user\web\basic\log.zip
)
php.exe
Array
(
    [dirname] => C:\user\web\basic
    [basename] => php.exe
    [extension] => exe
    [filename] => php
    [parent] => basic
    [mime] => application/x-dosexec
    [charset] => binary
    [size] => 59392
    [full] => C:\user\web\basic\php.exe
)
php5.dll
Array
(
    [dirname] => C:\user\web\basic
    [basename] => php5.dll
    [extension] => dll
    [filename] => php5
    [parent] => basic
    [mime] => application/x-dosexec
    [charset] => binary
    [size] => 5949440
    [full] => C:\user\web\basic\php5.dll
)
tool_html_150517214638.htm
Array
(
    [dirname] => C:\user\web\basic
    [basename] => tool_html_150517214638.htm
    [extension] => htm
    [filename] => tool_html_150517214638
    [parent] => basic
    [mime] => text/html
    [charset] => utf-8
    [size] => 603
    [full] => C:\user\web\basic\tool_html_150517214638.htm
)
_img.jpg
Array
(
    [dirname] => C:\user\web\basic
    [basename] => _img.jpg
    [extension] => jpg
    [filename] => _img
    [parent] => basic
    [mime] => image/jpeg
    [charset] => binary
    [size] => 133801
    [full] => C:\user\web\basic\_img.jpg
)





タグ:PHP
posted by lightbox at 2015-06-23 23:12 | PHP | このブログの読者になる | 更新情報をチェックする

2014年11月14日


Windows で、MySQL を使っているので phpMyAdmin で参照しようとして、AN HTTPD だと setup が動かなかったので Apache を入れようとしたらいろいろルールがあったお話



重要な手順部分は、NAVER にまとめました。

そもそも、USB でもサーバ移動できる AN HTTPD を授業で使用しており、卒業進級制作の課題内容を WEB と ローカルで同じ環境を作るよう指示した手前、自分でテストしていて起きた内容のまとめです。
( ちなみに、AN HTTPD は管理者権限で起動する必要があります )

phpMyAdmin

インストーラとか特にありません。定義ファイルは実運用で必要ですが、すぐテストしたいだけなら全てデフォルトで動作します。DB のユーザとパスワードでログインして操作可能です。

ですが、setup フォルダがあるので気になって使ってみると、config.inc.php という定義ファイルを作成する為のもので、サーバを何通りも追加して定義ファイルをダウンロードしたり表示したりできるツールでした。
さらに、config フォルダを作成して、そこに書き込み権限を与えると作成されますが、本体を実行する際にその confog フォルダが残っていると、早く消せと警告されます。つまり、あまり推奨するようなものでもなさそうです。

config.sample.inc.php をコピーして十分使えます。特に、保存領域の機能を追加するにしても、examples の中にある create_tables.sql を実行した後、/* Storage database and tables */ に関する設定のコメントを外すと、DB のテーブル内に表示しておきたいデータベースの一覧を保存できるようになり、運用が楽になります。

setup は、実際問題、あまり役には立ちそうに無かったのですが、AN HTTPD で動作しなかったので、Apache のテストをする事になってしまいました

Apache Lounge

さくらインターネットのレンタルサーバで動いたので、AN HTTPD のせいだと思い、Windows に Apache をインストールしようと思ったのですが、この時 Apache の配布に二種類ある事に気がつきませんでした。
Apache
Please use the Apache builds provided by Apache Lounge. They also provide VC11 builds of Apache for x86 and x64. We use their binaries to build the Apache SAPIs.

If you are using PHP with Apache 1 or Apache2 from apache.org (not recommended) 
PHP の Windows バイナリを配布するところにこのように書かれているのですが、最初 apache.org からダウンロードしてしまって、インストーラでインンストールした後、Apache から PHP を使うという所で止まってしまい、Apache Lounge の存在に気がつきました。 Apache Lounge は、完全な実行環境が書庫化されており、bin ディレクトリの httpd.exe をコマンドプロンプトから実行するだけで開始されます。サービスに登録したい場合は、httpd.exe -k install を実行するようにと、ReadMe.txt に書かれていました。
Install
-------


- Unzip the Apache24 folder to c:/Apache24 (that is the ServerRoot in the config).
  Default folder for your your webpages is DocumentRoot "c:/Apache24/htdocs"

  When you unzip to an other location, change ServerRoot in the httpd.conf,
  and change in httpd.conf the Documenroot, Directories, ScriptAlias,
  also when you use the extra folder config file(s) change to your location there. 

Start apache in a DOS box:

>httpd.exe

Install as a service:

>httpd.exe -k install

ApacheMonitor:

Double click ApacheMonitor.exe, or put it in your Startup folder.
スレッドセーフ

AN HTTPD では、ノンスレッドセーフを使用しています。つまり、既存の PHP 内に Apache 用の dll は入っていません。なので PHP を新たにダウンロードして、Apache のバージョンとも一致させる事になりました。

最新では、php5apache2_4.dll が入っていたので、Apache は 2.4 が必要です。ここで注意するのは、古いバージョンでなんとかしようとする場合は、対応する Apache の dll を Apache Lounge からダウンロードする事が必要な場合があります。Apache Lounge では、VC9 に関していくつか PHP のバージョンにあわせて配布されています。また、VC11 用のランタイム無いと動かないので、ランタイムを現在のものを使用したい場合は、同様のバージョンあわせとダウンロードが必要になります。

MSVCR110.dll

最新は、VC11 でビルドされているので、ランタイムをインストールしても良いという場合は、以下からダウンロードできます。

Visual Studio 2012 更新プログラム 4 の Visual C++ 再頒布可能パッケージ

でも、Microsoft の余計なインストールはできれば避けたいので、VC9 でなんとかしたい人も多いと思います


※ phpMyAdmin の setup は、結局 Windows の Apache で動作しました。


posted by lightbox at 2014-11-14 21:10 | PHP | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します
container 終わり



フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり