Engineering

「mysql concat null」でググると、
引数にNULLが含まれると返り値はNULLになる
という至極当たり前のことをさも大発見かのように語る記事が多く、「どうしたらいいか」について触れられていないものばかりを開いてしまった。
おそらくワタクシメのヒキが悪かったせいで、ちゃんと対処法も書いてある記事もあったに違いない。
まーでも対処法を書いた記事が多くなったほうが良いであろうと考え、本記事を執筆することにした。

なんて偉そうなことを言っているんでしょうか私は…。
『CONCAT_WSも知らないくせに』とか思われるのかな。
ま、いっか。

しかし、掲題に結論を書いてしまったので、もう書くこと無いね。
まあ一応結果でも書きますか。
SELECT CONCAT('hoge', null, 'fuga');
 ↓
NULL
SELECT CONCAT_WS('', 'hoge', null, 'fuga');
 ↓
hogefuga

CONCAT_WS() では、空の文字列がスキップされません。 ただし、区切り文字引数のあとの NULL 値はすべてスキップされます。

今回のように区切り文字を空文字にしていると同じになるけど、区切り文字を指定した場合に違いが出る。
SELECT CONCAT_WS('&', 'hoge', '', 'fuga', 'CHAKE', null, 'YASUKA');
 ↓
hoge&&fuga&CHAKE&YASUKA

引数のhogeとfugaの間に空文字が入っているのに対し、CHAKEとYASUKAの間にはnullが入っています。
すると返り値では、hogeとfugaの間には「&&」と&が2つ重なってしまっています。
対してCHAKEとYASUKAの間は&が1つで「CHAKE&YASUKA」となっていますね。

eval関数を使います。
いや多分、掲題のようなことをしたくて探している人にとっては「そんなの知っとるわい!」なんでしょうけど、違うんです、、、多分。
多分私と同じであれば、PHPタグ外の文字列も含めて出力したい。
イメージ的には、文字列を一度PHPファイルに出力して、それを実行する、という感じです。
そんな話なんです。違ったらすみません。

答えは↓です。
eval('?>' . $str);

これで、例えば$strの中身が
1 + 1 = <?php echo 1 + 1; ?>

だったとすると、出力は
1 + 1 = 2

となります。

こんなことできるんですね。全く盲点でした。
なぜできるのかを考えると、おそらく、evalに渡す文字列はPHPタグに囲まれているものと想定されているため、こんな感じで処理されるのでしょう。
'<?php' + evalに渡された文字列 + '?>'

上の例で言うと、
<?php?>1 + 1 = <?php echo 1 + 1; ?>?>

なにかに似ていると思ったら、SQLインジェクションだね。。

これ、たまたま見つけたんだけど、あまり知られてないよね?
もしかして、広めないほうがいいってやつ?

あれ、こんな夜中に誰か来
結論から言うと、↓この記事の通りです。
autocomplete="new-password"とすることで、自動補完が機能しなくなる


chromeブラウザのログインフォーム用パスワード保存機能、便利に使わさせていただいております。Google様、いつもありがとうございます。
なんですが、、、Webアプリケーション作成者側からすると、意図せず働いてしまい困った事態となってしまいました。
っというお話。

ID/PW入力判定がどのような基準で発動するのかが不明。
PHP側で受け取った時に扱いやすいよう配列化しているのだが
<input type="text" name="data[line_account_name]" />
という入力項目を増やした時に反応した。
元々
<input type="text" name="data[name]" />
という項目はあったのに発動していなかった。
「account_name」という文字列に反応したのか…?
name属性を色々変えて試してみた。
hoge_account_name_fuga → ◯
hogeaccountnamefuga → ◯
accounts_name → ✕
accountsname → ✕
account?name → ◯
account=name → ✕

name属性じゃなくてid属性にも反応するようだ。
<input type="text" id="data[account_name]" />
でも発動。

親切のつもりが、場合によっては迷惑になる…。
これで便利になって皆に喜ばれる、と思って作ったら『小さな親切余計なお世話』なんて言われたら切ないよね(´Д⊂グスン
うーむ、難しいなぁ。
まさにコレなんだけど。
アカウント連携の解除について、Messaging APIに対してrequestを送信する必要などはなく、連携解除の際にはサイト側で持っているデータのみの削除で完結します。

まー、頭が凝り固まってると、ダメだねー。
LINE連携の解除というと、スマポアプリ側で設定することが思い浮かんで、この操作をAPI経由でやるにはどうするんだ?と考えた。
一度そういうアプローチをしてしまうと、軌道変更って難しい。
でも、答えを知って目からウロコ。
Webサービス側が持ってるLINEユーザーIDを破棄すればええんやん。
LINEと我々を結ぶ糸はLINEユーザーIDのみ。これ無しで連携なんてできませーん。
ま、LINEアプリ側には連動アプリとして残っちゃうけどね。
と思ったけど、これを気にするということは、連動解除する画面まで行けてるってことだから、そのまま連動解除すればいいじゃんー、って話だよね。
HTMLで下記のように「menu-open」クラスをつければ良い。
<li class="nav-item has-treeview menu-open">

っという話ではなく、HTML出力が終わってから、javascriptで開きたいという話です。

ドキュメント(Treeview Plugin | AdminLTE v3.2 Documentation)読んでメソッドを叩いて、出来上がり…って、あれ、メソッド無いのー?

ググっても見つからない。AdminLTEってマイナーなん?

仕方がないので、手動?で開くことにした。
<script>
jQuery($ => $('.nav > .nav-item.has-treeview:not(.menu-open) > .nav-treeview > .nav-item > .nav-link.active').each(function(){
$(this).closest('.nav-item.has-treeview').addClass('menu-open').children('.nav-treeview').show();
}));
</script>

↑これを</body>タグの上に入れれば動くはず。
詳しい説明は、今はできませんorz...

【追記】treeviewウィジェットの最小構成が分かってなかった。ていうか今でもわか蘭けど。
↓なるべく最小構成に寄せてみたので、上記ので『動かねぇよ糞がっ!』となったヒトは試してみて
<script>
jQuery($ => $('[data-widget="treeview"] > .nav-item:not(.menu-open) > .nav-treeview > .nav-item > .nav-link.active').each(function(){
$(this).closest('[data-widget="treeview"] > .nav-item').addClass('menu-open').children('.nav-treeview').show();
}));
</script>

これでも動かなかったら…ゴメンナサイm(_ _)m💦
藁をもすがる思いでやってみて動かなかった時ってイラッとしますよね(T_T)

でもね、ウチのような弱小閑散ブログに対し、過大な期待は禁物。「どーせ動かないんでしょ」くらいの気持ちでお試しいただくのが健康のためとご提言申し上げ奉り候。