サポートに連絡

メールでご返信します。通常は2日以内です。

不正利用を防ぐため、Google reCAPTCHA がこの送信を確認します。その際データが Google に送られます。スクリプトはこのフォームを開いたときにだけ読み込まれます。

← すべての記事

いつも真になる確認

このサービスには UPDATE が 23 か所ある。そのうちちょうど一つが、自分が何かを変えたかどうかを見ている。その確認はこうだ。

'success' => $n->rowCount() >= 0

どの行にも当たらなかったとき、rowCount() は 0 を返す。ゼロはゼロ以上である。何が起きても、この確認は通る。

UPDATE 23 か所、結果を見るのは一つ rowCount() >= 0 — 何も当たらなくても通る コード全体の rowCount() > 0: 0 回 更新先の表に行を持つカウンター: 2,218 のうち 4 今日は何も壊れていない — この行のおかげではなく

この文は何のためにあるのか

チェック欄を一つ保存する。カウンターの持ち主が週ごとの要約をメールで受け取りたいかどうか、である。宛先は別の表にあり、そこに行ができるのは、自分で頼んだメールの確認リンクを誰かが押したあとだけだ。その行を持つカウンターは四つ。動いているカウンターは 2,218 ある。

つまり 99.8 % のカウンターでは、この UPDATE は何にも当たらない。受け口は success: true と答え、設定は保存されない。保存する先がないからだ。

その上の注釈は正しい

三行上、同じ関数の中に。

「確認済みの戻り道があるところだけ。それがなければ手紙の宛先がない — そしてチェック欄は、起きないことを約束したことになる。」

まさにそのとおりだ。誰かがこの場合について考え、理解し、その筋道を書き留めた。そして下の行は、その筋道が > を求めていたところで >= を使った。

これは正面から見ておく値打ちがある。よくある説明 — 誰も考えていなかった — はすぐ手に入るが、偽りだからだ。考えはファイルの中にある。しくじったのは一文字で、しかもその場所では、誤った版と正しい版はひと目では同じに見え、更新すべき行がある試験ではまったく同じにふるまう。

誰も欺かれていない

ここからは省きやすい部分で、省けばこの記事はもっと劇的になり、そのぶん真実でなくなる。

その行がなければ、ページはそのチェック欄をそもそも描かない。一画面向こう、持ち主の設定欄を組み立てるコードで、同じ表がまず問い合わされ、問い合わせが空で返ればその塊ごと飛ばされる。確認済みの宛先を持たない持ち主は、その操作部を目にすることがなく、押すこともなく、偽の確認を受け取ることもない。

壊れた確認に届くのは、有効な合鍵を持って受け口を直に呼んだときだけである。そうした人は success: true を得て、設定は保存されない。これは本物の欠陥であり、狭い欠陥だ。

それでも書き留める値打ちがある理由

この機能が安全なのは、誰も「見張り」として書き留めなかった見張りのおかげである。安全にするために存在する行は、安全にしていない。安全にしているのは別の関数の描画条件で、その注釈が説明しているのは、なぜチェック欄を隠すか、であって、隠れたままであることに何かが依存している、ではない。

その描画条件を外すか組み替えるか — 設定画面を作り直すときにはもっともなことだ — すれば、欠陥は即座に見えるようになる。しかも二つの変更を結びつけるものは、どこにもない。安全は本物で、そして偶然であり、偶然の安全とは、無関係な作業のあいだに消えるたぐいのものだ。

同じコードが、一つ隣のファイルでは正しくやっている。ウェブリングの対応する関数は、行があるかをまず尋ね、なければ偽を返し、更新をそもそも送らない。あの表はいま零行なので、その関数は呼ばれるたびに偽を返す — そしてそれが正しい答えである。

一般化した形

どの行にも当たらなかった UPDATE は、どのデータベースでも誤りではない。何もしなかった成功した文であり、誰かが尋ねないかぎり、その上のどの層も成功を報告する。ここの二十二の文は尋ねていない。そしてその大半では、それでよい。要求そのものが存在を証明済みの行を更新しているからだ。

尋ねる必要があった一つは、失敗しようのないやり方で尋ねた。rowCount() >= 0 は弱い確認ではない。確認の衣装を着た確認の不在である — そして何もないより悪い。次にこの関数を読む人は、結果が調べられているのを見て、そこで見るのをやめるからだ。

rowCount() > 0 という書き方は、このコードに零回しか現れない。打ち間違いを一本の記事に値するものに変えたのは、この数字だ。一度書き損じたことではなく、突き合わせるべき正しい実例がどこにもなかったことである。

2026 年 8 月 28 日に修正。この受け口は、書く前にその行があるかを尋ねるようになった — 一つ隣のファイルにあるウェブリングの関数が前からそうしていたやり方である — そして、なければ偽を返す。一文字で済む見るからに妥当な直し方、つまり「ゼロより大きい」を見る版は、先に測ったうえで退けた。ドライバーが知らせるのは変わった行の数であって、当たった行の数ではないからだ。チェック欄をいま入っている値に設定しても何も変わらない — そしてその版は、問題のなかった操作について失敗を告げただろう。どちらの版も誤りで、向きが逆なだけである。

広告