「php」カテゴリーアーカイブ

【php】filter_inputを使ってみる

こんにちは〜

今日はphpのfilter_inputを使ってみたというお話です。

phpのサイトはこちら

つまり、getとかpostで受け取った値をフィルターにかけてinputする、という関数ですね(そのまま)

具体的にどういう感じなのか説明見ただけでは分からなかったので、実行してみました。

(環境はphp7.4.7です)

$a = filter_input(INPUT_GET, 'name');
if($a === null){
	echo "null";
}else if($a === false){
	echo "false";
}else if($a === ""){
	echo "空白";
}else{
	echo $a;
}

これでどうなるのか。見てみます。

URL 出力
index.php 空白
index.php?name=a a
index.php?name2=a null
index.php?name[0]=a false

表の使い方がよく分からない。。

とりあえず、入力方法として思いついたものを並べてみましたが、意外にも結果は全てバラバラに。

get値がそもそもない場合は空白(””)が、

値があれば値が、

get値はあるもののそのパラメータが存在しない場合はnullが、

パラメータが存在するが配列が返された場合はfalseが

戻ってくるようです。

ちなみに、数値もstring型になります。

いろいろ返ってきて処理がめんどくさい。。という場合は

$a = (string)filter_input(INPUT_GET, 'name');

という形で、string型に変換すると、null,falseが全て空白になります!

特に分ける必要がない場合は便利ですね。

こちらのサイトを見て、filter_inputの存在を知ったのですが、普通にissetだけで確認してると悪意のある人が配列を投げてきたらエラーを吐くとかいう可能性があるので、慎重になる必要があるみたいですね。。

それでは、また〜

【PHP】そのミリ秒の取得の仕方、安全ですか?

こんにちは〜

何となく釣りタイトルを作りたい気分だったので、こういうタイトルになりましたすいません。まぁ興味のある人は最後まで見てください〜(笑)


さて本題。phpでミリ秒ありの現在時刻を取得する際、どうやって取得しますか?

調べてみるとこういう感じのコードをよく見かけます。

$time = date("Y-m-d H:i:s") . "." . substr(explode(".", (microtime(true) . ""))[1], 0, 3);

出力例:2020-05-13 09:41:40.208(※アクセス時間によって変化しません。例です)

一見これでも大丈夫なように見えます。実際動いてますし。

じゃあ何がダメなのか。

explode(".", (microtime(true) . ""))[1]

ここです。

explode関数は、最初の引数の文字列で、二つ目の文字列を区切り、配列化します。

今回は、”.”(ピリオド)で、(microtime(true) . “”)を区切っています。

次に、microtime(true) 。これは現在時刻をマイクロ秒まで含めて返します。

これは、引数にtrueを指定すると、float値で返します。

1589363558.7723

こんな感じ。(編集時間バレそう)


さて、どこが問題かわかったでしょうか?

そう、microtime(true)です。これの戻り値はfloatで返すのが問題なのです。

例えば、下記はどう表示するのか。

echo 205.250; // 205.25 と出力
echo 306.100; // 306.1 と出力
echo 110.000; // 110 と出力

そう、小数点以下が.000になると、ドットが消えるのです!

ドットが消えるとどうなるかと言いますと、

explode(“.”, (microtime(true) . “”))

の値が、要素が1個の配列が返されるのです。

ということで、小数点以下が.0000の時に、下記を実行すると、

explode(".", (microtime(true) . ""))[1] //Undefined offset:エラーが起きる

まぁそもそもmicrotimeが小数点以下4桁まで出力するので、0000を出すのはごく稀ですが。

それでもエラーが起きてしまった場合、最初のコードの$timeにはnullが返されてしまいます。(warningエラーなので止まらない)

実装方法にもよりますが、時間操作で重要なコードを実行していると、大変なことになるかもしれません。(いや可視化の時間出力で重要なコードってあんまりないか・・・?)

ではどうするのか。変数に代入してifする?でもそれは面倒です。

簡単な方法があります。

ドットがなければ、ドットを作ればいいのです。(笑)

$time = date("Y-m-d H:i:s") . "." . substr(explode(".", (microtime(true) . ".000"))[1], 0, 3);

float型をstring型にしていた、 . “”に、.000を付け足すのです。

(ちなみに、.1200みたいな感じで、小数点以下が2桁になる時も3桁にしたい場合は、”000.000″にすると0埋めされますので、一石二鳥?)

こうすることで、仮にint型になるような値が返ってきても、.000が2つ目の要素となり、エラーにならずに返すことができるようになります。


改めて考えれば当たり前の配慮ですが、整数値になる可能性が1万分の1が故、あまり気付けなかった弱点です。

ちなみにこの記事を書いた理由は、このエラーが起きたからですね(笑)

唐突に予期しないところからエラーが起きてびっくりしました

ということで、またね〜

localhostに別端末で接続したい

こんにちは〜

今日やりたいのは、phpをlocalhostで起動させ、別端末でそのphpにアクセスしたいと思ったので、そのやり方を考えてみる。

環境:

Mac  Catalina

iPhone 13

php 7.4.4

前提:同じwi-fiに繋いでること


まずは普通に解放する。

% php -S localhost:8080 -t ./ 

※フォルダ名が長いこともあり、./のところにドキュメントルートかくと大変なので、そのフォルダでターミナルを開いて実行してます。必要に応じて書き換えてください。

これで、Mac上では「http://localhost:8080/index.php」などでアクセスできるようになる。

じゃあ、iPhoneでアクセスするには?

「http://localhost:8080/index.php」→もちろんできない

localhostをmacのIPv4アドレスにするとアクセスできるらしいので、

「http://XXX.XX.XX.XXX:8080/index.php」(Xは必要に応じて書き換えてください)

でアクセスしてみるが、これもできなかった。

ファイアーウォールが邪魔しているのかも?と思い、切ってみるも変わらず。

次にbluetoothでつないで、「システム共有」→「共有」に書いている

「XXXXXX.local」(特にいじっていない場合はコンピュータ名+.local)

でアクセスすると繋がるらしい。試してみる。

「http:/XXXXXX.local//index.php」

これもできない。(ちなみにwwwがあると無理らしいので取り除くもこれもダメ)

もう少し調べてみると、上の.localの前にハイフン「-」があると不具合が起きる、とのことなので、これを取り除いてみるが、これもダメ。

そして思いつく。そもそもlocalhostじゃなくていいのでは?

% php -S XXX.XX.XX.XXX:8080 -t ./ 

(※Xにはipv4の値。他の値で実行できるのかは不明)

これで解放してみると、iPhoneでも無事接続できた!

ただlocalhostで接続できないので、macも上記urlになるが。。

※一応iPhoneのwi-fiを切るとアクセスできないので、ローカルでしか繋がらないとは思うが、調べて出てきたやり方じゃないので、操作は自己責任でお願いします。

ではまた〜

coteditorでphpの構文チェックをしたい!

こんにちは〜タイトルで全部書いてるので特に追記することもないですが、今日の記事はそういうことです。

ちなみに最近(最近?)windows版もあるという話を聞いておりますが、おそらく今日書く内容はwindowsでは動きません。あしからず。

では本題。

続きを読む coteditorでphpの構文チェックをしたい!

phpの構文チェックをする

※Macのターミナルで実行した話です。windowのコマンドプロンプト(?)で同じことが出来るかは不明(多分php関連の何かを入れてないと無理なのでは・・・?)

こんにちは〜

今日はphpで構文チェックをしたいんだが。。。という話。

いつも「工具邦」の構文チェックのサイトを使っていたのだが、ローカル内でチェックする方法は無いのか?と思って少し調べてみることにした。

ちなみに普段はcoteditorを使っているので、エディターにチェック機能はなかった。

調べてみると、こんなサイトが(php公式のサイトですが)

どうやら、コマンドラインの「php -l」でチェックができるらしい。

ということでやってみる。

「index.php」というphpファイルのチェック

$ php -l index.php

No syntax errors detected in index.php

・・・出来ました。ターミナルって地味にすごいですよね。

ただ毎回ターミナルを起動するのもなぁと思ってAutomaterとか使って自動化したかったものの、やり方がよく分からずに挫折。

誰かわかる方教えてください。()

では、また〜

[PHP]最後に現れた文字列の後ろを取得する。

タイトルの表現がものすごく悪いんですが、そういうことです。

例えば、「ABCDAEFAGH」という文章があって、最後に現れた「A」の後ろ以降を取得する(今回なら「GH」)、という話です。

$value = "ABCDAEFAGH"; //文字列
$split = "A"; //区切りたい文字
echo end(explode($split,$value)); // GH が出力。

簡単に説明すると、

explodeが特定の文字で区切り、配列で返す。

endが配列の一番最後を返す。(ちなみにphp7.3以降ではarray_key_lastというものが代役として使えるらしい。endがポインタを使用しているので、それで不具合が生じる方向け?)

複数行での取り方なら色々あるが、一行ならこんな感じだろうか。

他にもあればコメントで教えてください。

では〜

Macでphpを実行する

macのローカルでphpを実行したいと思ったので、それのメモ。

windowsと違い、macは専用のアプリケーションを入れなくても実行できるらしい。

参考サイト → https://tofusystem.work/programming-lesson/create-dev-for-mac/

まずはターミナルを起動。

そして、ターミナルに以下のコードを記述。

$ php -S localhost:8080 -t *****

$はデフォルトで入力されているのでその後ろの phpから

localhost:8080 ← 数字は4桁ならなんでもいい?7070とか1234試したけど動いてるぽい

-S -t は知らない。書いてたから書いてる。(知ってる人いれば教えてください→ 2020/1/24追記:参考サイトさんの下の方に載ってました。コメント欄で指摘されているので、気になる方はurlを飛んで確認してみてください。。)

*****のところは、起動したいファイルがあるフォルダ。例えばデスクトップにあるフォルダなら、 /User/**(ユーザー名)/Desktop になる。

ちなみに、php -S localhost:8080 だけでも動く。その場合は、選択されてるフォルダが実行範囲になる。(-tを入れると実行できないっぽい)

icloudのフォルダにアクセスしたい場合は、Finderで右クリック→サービス→フォルダに新規ターミナル でターミナルを起動するか、/User/**(ユーザー名)/Library/Mobile Documents/com~apple~CloudDocs/ にあるのでそこから。ただ、アプリが作ったフォルダ(QuickTime Playerとか)は、com~apple~CloudDocsではなく、別のフォルダになるのでターミナルからアクセスするのは地味に面倒。

これで、http://localhost:8080/**.php でその中にあるphpファイルにアクセスすると、phpが実行されている。

以上です!ではまたね〜

※終了時は「control」+「c」です。コピーのショートカットは「command」「c」ね。