エンジニアの卵_level1

【毎日更新!】新卒2年目エンジニアブログです! プログラムだけじゃなく、マネジメントとかも書いていきたい!

【PHP】'1.0' == '1'がtrueだった。【210日目】

なんで起こるの?

比較に数値形式の文字が含まれる場合は、文字列が 数値に変換され

PHP: 比較演算子 - Manual

値をテストしてみた

>>> "a" == "0"
=> false
>>> "a" == 0
=> true
>>> "1.0" == "1"
=> true
>>> "1.0" == 1
=> true
>>> "1.0" === "1"
=> false

== を使う時は気をつけよう

“1.0” == “1"
=> true
“1.0” === “1"
=> false

比較演算子の動きを理解しないと、意図しない動作をしてしまうので、
文字列同士で比較したとしても、===を忘れない方がいいなと思いましたという共有でした。

【PHP】HTMLのclassを指定して要素を取得。DomCrawler【209日目】

こんな時に使う

<div class="aaa">
    <p class="aaa">aaaaa</p>
    <img src="/test/img.png">
</div>

これの、src部分 /test/img.pngが欲しい。

DomCrawler使ってみよう

これ使うと、CSSセレクタ使って取得が出来る。

簡単。見やすい。

■DomCrawler
https://symfony.com/doc/current/components/dom_crawler.html

テスト用コード

(Laravelでphp artisan tinkerとかしていただければ試せます)

use Symfony\Component\DomCrawler\Crawler;

$html = <<< EOF
<div class="aaa">
<p class="aaa">aaaaa</p>
<img src="/test/img.png">
</div>
EOF;

$crawler = new Crawler($html);
$srcs = $crawler->filter('.aaa img')->each(function (Crawler $c) {
return $c->attr('src');
});

結果

=> [
"/test/img.png",
]

【PHP】表示させたページに404のステータスコードをつける【206日目】

こんな時に使う

PHPでオリジナルの404ページを表示させたい。

で、ページが例外に入った時にオリジナルの画面を表示させたけど、
ステータスコードが200で正常に表示されている時。

このコード付け足す

header("HTTP/1.1 404 Not Found");

これでステータスコードが404になっています。

google chromeのNetworkの項目とかで確認してみましょう。

【PHP】PDO使ってSQL文タイポした時にExceptionを投げる【195日目】

こんな時に使う

(PDO使う時ほぼないというツッコミは置いておいて)

 $dbh->exec('CREATE TBLE Pages (id int, name nchar(255), create_date datetime)');

あ、 TABLETBLEになってる。
でもエラー出てないから気づかなかった・・・

って時に、エラーを投げてやりたい。

こうかく

PDOのオブジェクトを生成する時に、
第四引数に、 array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)を渡してやる。

$dbh = new PDO('mysql:host=mysql;dbname=dbname',
                'username',
                'password',
                array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

これで、構文間違えた時もエラーが出る。
try catchとかで、rollbackさせたい時とかどうぞ。

公式ドキュメント

PHP: PDO::__construct - Manual

ここで使うOption

PHP: 定義済み定数 - Manual

【PHP】相対パスでincludeした後のファイルで、さらにincludeすると読み込めない【194日目】

こんなファイル作りました

public/index.php

include ../xxx/yyy/temp.php

xxx/yyy/temp.php

include ../../zzz/item.php

zzz/item.php

echo 'hello';

これ、動かないです。

どこが問題か

xxx/yyy/temp.php

include ../../zzz/item.php

これ。単体で見たら問題なさそう。
でも、このファイルをincludeすると話は別。

includeは、ファイルの中身を、自分にコピーするイメージ

includeはファイルの中身をコピーするイメージ。

だから、最初のincludeでこんな風になる。

public/index.php

// include ../xxx/yyy/temp.phpで呼び出した
include ../../zzz/item.php

そう、public/index.phpから相対パス../../zzz/item.phpを呼び出してしまうのだ。

だから、publicより下のディレクトリを読み出そうとするし、目的のディレクトリなんて存在しない。

反省

ということで、ファイルをincludeするなら、基本的に絶対パス使おう。

【Laravel】直前にアクセスしたページのURLを取得する【188日目】

引数を入れた時どうなるかも書きました

取得失敗した時の動作が書かれているよ。

willow710kut.hatenablog.com

直前にアクセスしたURL、ページに来るためのリクエスト元のURL

こうかく

url()->previous();

結果

"http://blog.hatena.ne.jp/willow710kut" みたいにStringで取得出来る。

余談、 /willow710kutの部分を取得するならPHPparse_url()使って

parse_url(url()->previous();, PHP_URL_PASS);

こんな感じ。

公式ドキュメント

ヘルパ関数 5.3 Laravel

PHP: parse_url - Manual

【Docker】phpでPDOにmysqlを使うと、could not find driverと出る【186日目】

Dockerfile

FROM php:7.1-fpm

phpファイル

$dbh = new PDO('mysql:host=mysqlaaa;dbname=dbname',
                'username',
                'password);

エラー

could not find driver

対処法

RUN docker-php-ext-install pdo_mysqlの一文をDockerfileに付け足す

FROM php:7.1-fpm
RUN docker-php-ext-install pdo_mysql

なぜか

PDOのプラグインmysqlが入っていないから。

phpinfo();でPDOを検索するとわかりやすい。