生半可な気持ちでプログラマになった男日記

日々地獄の中をさまよっている糞雑魚プログラマの技術ブログ。テニスが好きです。

PDO の bindParam() について

いきなり記事の更新が止まってしまいました。

1週間に1記事は上げようと思ってるので、内容薄くても書いていくぞー。

今回は PDObindParam() でつまずいたのでメモがてら記事おこします。

bindParam() は参照渡し

PDO プリペアドステートメントbindParam()bindValue() という2つのメソッドがあります。

bindParam() の場合、引数で渡している変数が参照渡しでバインドされるそうです。

PHP: PDOStatement::bindParam - Manual

準備された SQL ステートメント中で、 対応する名前もしくは疑問符プレースホルダにパラメータをバインドします。 PDOStatement::bindValue() と異なり、 変数は参照としてバインドされ、PDOStatement::execute() がコールされたときのみ評価されます。

参照渡しの為、↓みたいな感じで bindParam() を実行した後に引数で渡してる変数を変更すると、最後の変更結果が DB に保存されます。

<?php

...

$sth = $dbh->prepare('INSERT INTO users SET firstName = :firstName, lastName = :lastName');

$firstName = 'firstName';
$lastName = 'lastName';

$sth->bindParam(':firstName', $firstName, PDO::PARAM_STR);
$sth->bindParam(':lastName', $lastName, PDO::PARAM_STR);

$firstName = 'ruka';
$lastName = 'pachory';

$sth->execute();

実行結果

f:id:pachory:20180818020412p:plain

bindParam() 実行直後に変更した変数の内容が insert されてますね。

知らなかった。

そもそも bindValue() でいいやんって思いますが、どのタイミングで bindParam() 使うんでしょうかね。。

誰か優しい人教えてください。

関係ないけど。。

記事おこすと記憶の整理になるし、手を使って文章に残すので記憶に残りやすいですね。

しょうもない記事でもちょこちょこあげていくようにしよう。

empty() で困った話

PHP で地獄の案件をやってるんですが、その時に empty() 関数で翻弄された話を書きます。

empty( mixed $var )

(PHP 4, PHP 5, PHP 7)

empty — 変数が空であるかどうかを検査する

var が存在し、かつその値が空や0でなければ FALSE を返します。 それ以外の場合は TRUE を返します。

次のような値は空であるとみなされます。

"" (空文字列)

0 (整数 の 0)

0.0 (浮動小数点数の 0)

"0" (文字列 の 0)

NULL

FALSE

array() (空の配列)

PHP: empty - Manual

今の地獄の案件だと、基本的に空文字などのチェックの際に empty() が使われてるんですが、 API へ送信するデータのチェック処理で empty() が使われてて、そこで私は翻弄されました。

具体的には↓みたいな感じでチェックされてました。

$hoge = empty($foo) ? null : $foo;

しかし、API 側の仕様で値を指定しない場合は 0 をセットしなさいというルールがあって思ったとおりのレスポンスを受け取れてなかったという。

単純なお話 + empty() の仕様を知ってれば回避できたバグなのですが、実装者はそこまで考えてなかったのでしょう。(僕は書いてません)

結局↓みたいな感じで、 empty() + 空文字チェックで判定とかが正解になるんですかね。

$hoge = empty($foo) && $foo === "" ? null : $foo;

empty() は判定する値が色々あるので、引数に渡す変数がどういう形で渡されるのかを把握しておかないとバグ製造機になりそうですね。

Node.js のバージョン管理方法について

なんかお手軽に Node.js のバージョン管理できる方法があったっぽいのでメモ。

npm パッケージ n

GitHub - tj/n: Node version management という Node のバージョン管理ツールがあるようです。

最新バージョンのインストールとか、Node.js の過去バージョンを使えるようにしてくれるっぽい。

今はまだ Windows 未対応みたいですね。

使い方

まずはインストールします。

node.js のバージョン管理ツールだしグローバルでいいよねってことで、オプションに -g つけましょう。

って思ったんですけど、プロジェクト毎に Node.js のバージョン変えたいなら -g つけないほうがいいかもしれないですね。

権限(パーミッション)まわりで怒られたら sudo つけて実行しましょうね。

npm install -g n

インストールしたらいきなり使えます。

Node.js の最新バージョンの確認

n --latest

Node.js の安定稼働バージョンの確認

n --stable

Node.js の LTS バージョンを確認

n --lts

Node.js の最新バージョンのインストール

n latest

Node.js の安定稼働バージョンをインストール

n stable

Node.js の LTS バージョンをインストール

n lts

ちなみに LTS ってなんだ。。。ってなったので調べたら長期サポート対象のバージョンらしいです。

なので本番環境とかで使うならこのバージョンの方が安全なのかな?

--stable と --lts でバージョン確認するとそれぞれ違うバージョンだったのがちょっと気になりますが。。

Node.js の特定バージョンをインストール

n 0.8.14

n コマンドの後にバージョン数指定でできるみたいですね。

Node.js のバージョン変更

n

これ叩くとインストール済みのバージョン一覧がでてくるので、ここでバージョン変更すると即座に切り替えてくれるようです。

最後に

後で調べたら Node.js のバージョン管理の主流は nvm というものらしいですね。

React.js のチュートリアルしようと思ってたら、脱線したけどこんなこと基礎中の基礎ですよね。

糞雑魚プログラマだから仕方ないですね。

精進します。