エンジニアのひよこ_level10

毎日更新してた人。たまに記事書きます。

【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を検索するとわかりやすい。

おまけ:初心者がDockerを勉強した本

■対象の人:環境構築わからない・・・インフラ用語わからない・・・

プログラム書けるけど、インフラ用語わからない、環境構築してみたいけどできない。

私がそうでしたが、以下の本で勉強しました。

インフラの用語を一から説明してくれて、その後にDockerの話をしてくれるので初心者向けです。
Laravelの環境くらいなら、一人で書けるようになりました。

アフィリエイトリンク貼ると、胡散臭くなるけど、単純におすすめしたい本(`・ω・´)ゞ

【Laravel】routeに名前空間(namespace)を使って、見やすい構成に【179日目】

こんな書き方あるよ

Route::group(['namespace' => 'Admin'], function () {
    // "App\Http\Controllers\Admin"名前空間下のコントローラ
});

何が嬉しいの?

App\Http\Controllers\Admin\SomeController.php
App\Http\Controllers\Admin\AnyController.php
App\Http\Controllers\User\SomeController.php
App\Http\Controllers\User\AnyController.php

こんな構成なら、下のように
■同じコントローラー名でも見やすく書ける
ディレクトリに分けてルートが書ける

Route::group(['namespace' => 'Admin'], function () {
    Route::get('admin/some', 'SomeController@show');
    Route::get('admin/any', 'AnyController@show');
});

Route::group(['namespace' => 'User'], function () {
    Route::get('some', 'SomeController@show');
    Route::get('any', 'AnyController@show');
});

参考ページ

ルーティング 5.3 Laravel

【PHP】null合体演算子とエルビス演算子(三項演算子)の違い【163日目】

ちょっと間違えていたので

こちらの方で内容を変えて書いています。こちらもご参考に

www.nyamucoro.com

null合体演算子とは

null合体演算子(A ?? B)は、
Aが nullundefinedの時に、Bを出力し、
非nullの時にはAを出力するものです。

例がundefinedやnullの場合の処理を考える時に便利です。

// undefinedなので、''が出力される
echo $item ?? '';

// nullなので、''が出力される
$item = null;
echo $item ?? '';

// 非nullなので、10が出力される
$item = 10;
echo $item ?? '';

エルビス演算子(三項演算子)とは

エルビス演算子(?:)は、評価がtrueかによって分岐します。
三項演算子とも呼ばれます。

シンプルなif文を短く書いたり、見やすくするために使われたりしますが、
三項演算子を好まない人もいるので、チームメンバーと事前に使うかどうか決めておくとより良いです。

$item = 10;

// isset($item)がtrueなので、$itemが出力される
echo isset($item) ? $item : '';

// 上の式は下と一緒
if (isset($item)) {
    echo $item;
} else {
    echo '';
}

$item = 1;
// ?と:の間を省略すると、
// $itemが1なので、trueと同等であることから、$itemが出力されます。
echo $item ?: '';

// 上の式は下と一緒
if ($item) {
    echo $item;
} else {
    echo '';
}

それぞれの公式ドキュメント

null 合体演算子 (??)

この演算子は、もし第一オペランドが非 NULL の値であればそれを返し、 そうでない場合は第二オペランドを返します。

http://php.net/manual/ja/migration70.new-features.php

エルビス演算子三項演算子)(?:)

(expr1) ? (expr2) : (expr3) という式は、式1 が TRUE の場合に 式2 を、 式1 が FALSE の場合に 式3 を値とします。

式 expr1 ?: expr3 の結果は、expr1 が TRUE と同等の場合は expr1、 それ以外の場合は expr3 となります。

http://php.net/manual/ja/language.operators.comparison.php

【PHP】多態性(ポリモーフィズム)について勉強中【162日目】

元となる抽象クラス

<?php
abstract class baseClass
{
    abstract public function action();
}

継承先のクラス2つ

class ringoClass extends baseClass
{
    public function action() 
    {
        echo '私はりんごだよ';
    }
}
class orangeClass extends baseClass
{
    public function action() 
    {
        echo '私はオレンジだよ';
    }
}

動作させるコード

$r_class = new ringoClass;
$o_class = new orangeClass;

$r_class->action();
$o_class->action();

同じクラスを継承して、『同名のクラスを持つけど、別の動作してる』って話・・・?

Javaだと、$r_classと$o_classをbaseClass型で受け取るから、イメージがついた感じしたけど、
PHPで作ってみて、ポリモーフィズムがますますわからなくなった・・・

【PHP】??。undefinedに対してifを書くときにissetを使わない方法。【161日目】

undefindedの時に、空文字を出したい

if (isset($item)) {
    echo $item;
} else {
    echo '';
}

あるいは、三項演算子を使って

    echo (isset($item) ? $item : '')

これをnull 合体演算子 (??)を使って書く

null合体演算子

    echo ($item ?? '');

短い。見やすい。便利ね。

公式ドキュメント

PHP: 新機能 - Manual