[PHP]雑記帳
トップページへ
Q. 変数名で大文字、小文字の区別は?
A. します。$Value と $value とでは区別され、別物になってしまいます(詳細)
Q. HTMLなどShift-JISのテキストデータをUTF-8に変換する
A. サンプル
$data = mb_convert_encoding($data, 'UTF-8', 'SJIS');
Q.表示されていない改行、見えない改行を消す
A.あくまでも一例
\rを”に置換し、その後、同様に\nを置換する。”に置換→消去と同じ。
$w_caption = str_replace(“\r”,”, $w_caption);
$w_caption = str_replace(“\n”,”, $w_caption);
Q.自分自身を取得したい
A. 参考元 マジック定数
フルパスのファイル名
__FILE__
ファイル名のみ
basename(__FILE__)
eg. .phpを除去
basename(__FILE__, “.php”);
ディレクトリ
__DIR__ または dirname(__FILE__)
ディレクトリパスの最後の部分
basename(__DIR__)
eg.
../abc/def
実行後
def
Q.日付日時が”2021-09-28T06:28:24+02:00″のように、日本仕様にならない。
A.
date_default_timezone_set(‘Asia/Tokyo’);
date(‘c’)
の順に記述する必要があります。
正常になれば”2021-09-28T13:38:11+09:00″のように「+09:00」が付加され正確な時刻になります。
Q.エラーメッセージ「Warning: mb_send_mail(): Multiple or malformed newlines found in additional_header in」とは?
A. mb_send_mail関数で PHP(楽天市場で探す ・ amazonで探す)のバージョンが「7.4.13」の時
・サンプル文
mb_send_mail($mail, ‘テスト送信’, $msg, ‘ From: 任意のメールアドレス’);
で発生。エラーの表示だけでなくメールの送信も失敗しています。
・改善案
$w_header = ‘From: 任意のメールアドレス’;
mb_send_mail($mail, ‘テスト送信’, $msg, $w_header);
のように、第4パラメータを一度変数に渡すとエラーは消え、メールも送信されました。考えられる原因はPHPのバージョンによるものかもしれませんが詳細は不明です。
Q.エラーメッセージ「Parse error」とは?
A.例 $key’ ではゼロ件でした’ のように変数と文字列との間に結合文字を忘れた場合に発生。結合文字「.」を使って修正します。
$key.’ ではゼロ件でした’
Q. 相対パス
実行するphpファイルの場所と「相手」との関係により異なります。
混乱しやすいので、概要と事例を分けて書きます。
概要
パターン1
php
相手
パターン2
php
相手フォルダ/相手
パターン3
自分フォルダ/php
相手フォルダ/相手
・phpがある場所と同じ階層
sample.html
iamge.webp
同じ階層のフォルダ
フォルダA/sample.html
フォルダA/image.webp
フォルダA/サブフォルダ/sub.html
・phpがある場所より一つ上の階層
../sample.html
../image.webp
一つ上の階層のフォルダ
../フォルダA/sample.html
../フォルダA/image.webp
../フォルダA/サブフォルダ/sub.html
事例
./または指定なし 同じディレクトリを参照
(個人的には, “./”よりも「指定しない」を選択)
指定しない例
abc/def.php
abcフォルダ内のdef.phpを参照
・事例
Q.自分と同じ階層にあるフォルダ内のphpを参照したい
A.
自分.php
abc_folder内の相手.php
サンプル
require_once ‘abc_folder/相手.php’;
・事例
Q.自分のフォルダと同じ階層の別のフォルダにあるphpを参照したい
A.
abc_folder/自分.php
xyz_folder内の相手.php
サンプル
require_once ‘../xyz_folder/相手.php’;
includeのヘルプより
「たとえば ../ ではじまるファイル名を指定した場合は、 親ディレクトリからそのファイルを探します。」
Q.外部ファイルの読み込みにはrequire関数か?include文か?
A.require関数については
https://www.sejuku.net/blog/31255
より「読み込みに失敗する」と
・require文は致命的なエラーになる。
・include文は警告が出るだけ。
※ブラウザに表示する場合は ini_set関数(公式)を使う
例 ini_set(‘display_errors’, ‘1’);
Q.単純にファイルを開いて閉じる
A.file_put_contentsの公式の例1がシンプルでわかりやすい
<?php
$file = ‘people.txt’;
// ファイルをオープンして既存のコンテンツを取得します
$current = file_get_contents($file);
// 新しい人物をファイルに追加します
$current .= “John Smith\n”;
// 結果をファイルに書き出します
file_put_contents($file, $current);
?>
★注意点
当然ながら people.txt が存在しないとエラーになる。そこで file_exists でエラーを回避する。
$file = ‘people.txt’;
if (file_exists($file)){
$current = file_get_contents($file);
以下、同文
}
Q.配列の並べ替えは?
A.個人的にはarray_multisortが便利。
Q.型キャストは?
A.公式
変換しようとする型を括弧で括り、キャストする変数の前に置きます。
●一部抜粋
(int) – 整数へのキャスト
$foo = (int) $bar;
(boolean) – 論理値へのキャスト
$bar = (boolean) $foo; // $bar はbooleanです
(string) – 文字列へのキャスト
$fst = (string) $foo; // $fst も文字列です
intvalもあります
Q.boolean型変数の中身を表示したら?
A. 実行サンプル
echo ‘_’; //正しく動作したら _ と表示される
$cluster_sw = (boolean) FALSE;
printf($cluster_sw);
結果:
_
echo ‘_’; //正しく動作したら _ と表示される
$cluster_sw = (boolean) TRUE;
printf($cluster_sw);
結果:
_1
$_SERVER 一覧
Q. $_SERVER[‘REQUEST_URI’] 、$_SERVER[‘PHP_SELF’]の戻り値は?
A. 呼ばれたPHPファイルのパス。ただしサーバーによっては対応しない場合あり
Q. $_SERVER[‘HTTP_HOST’]の戻り値は?
A. 呼んだ側のPHPファイルのあるドメイン(ホスト)名のみ(ex. domain.co.jp)。ただしサーバーによっては対応しない場合あり
Q. $_SERVER[‘HTTP_REFERER’]の戻り値は?
A. 呼んだ側のPHPファイルのあるサブドメイン(ホスト)名(ex. host.domain.co.jp)。ただしサーバーによっては対応しない場合あり。
また2022年10月
(A)$_SERVER[‘HTTP_REFERER’]を使用したPHPファイルを直接実行(*)した場合。
*ブラウザからURL(パス)を指定し実行した場合。
(B)PHPのバージョンが 8 以降
AとBの両方を満たす時、エラーではないものの警告が表示されることが判明しました。なお、当方のレンタルサーバーだけの可能性もある事例で読者様すべてに発生するとは限りません。
なお現時点で私の対処方法は
・HTML内のFormタグのボタンでPHPファイルをCallする
で回避しています。
Q. Fatal error: Uncaught TypeError: imagewebp(): Argument #1 ($image) must be of type GdImage, bool given in (訳:imagewebp(): 引数 #1 ($image) は GdImage 型、bool 型である必要)のエラーが出た
A. 私の場合、imagewebp で指定した画像に問題があったと判明。画像ソフトでエラーが出た画像を開いて保存し直したら、解消しました。画像パレットあるいは圧縮率関係の不具合ではないかと推定しました。
警告の内容
Warning: Undefined array key “HTTP_REFERER”
未定義の配列
PHPのバージョン 成否
7.3.33 警告なし(成功)
7.4.28 警告なし(成功)
8.0.16 警告あり
8.1.16 警告あり
(2022年10月31日調べ)
なぜか動作しない
※管理人の勉強不足の可能性がありますが、「個人的に解決できていない」ことを列挙します。
Q.PHP 8.0以降だとコマンドライン引数の実行ができない
A.2023.2.22原因判明。契約しているサーバーの初期設定が「引数の使用をオフ」にしていたので、「引数の使用をオン」に変更したら解決しました。訂正のうえお詫びします。
原因不明。コマンドライン引数:PHP7.4以前なら動作するが、PHP 8.0以降だと「未定義定数」となって実行できない。しかし公式ではPHP 8でも動作可能と明記されている。
Q.PHP8.0以降だと、$_SERVER[‘HTTP_REFERER’]で警告が表示された。
A.原因不明。個人的にセキュリティの関係の可能性が推測されますが、詳しくはこの記事の前述の項目を参照して下さい。
その他
・PHP以外の言語と同様に continue もあります。
・ループfor の記述例
配列 $cd_ar の数を把握し、0から配列数未満まで増加1の昇順ループ
for($i = 0, $size = count( $cd_ar ); $i < $size; ++$i) {
逆順の例
for ($i = count( $cd_ar ) -1; $i > -1; --$i) {
Qiita様の記事を参考にさせて頂きました。
*ループ記事を更新できなかったのでこの記事に記載しました
→PHPメニューへ戻る