PHP:3桁になると正常に動作しないプログラム
0埋めされた文字列を文字列型のカラムから値を取得して、連番を生成するために、以下のようなコードが書かれていました。
$sql = "SELECT max(no) FROM table "; $result = pg_query($pgsql, $sql); $no = pg_fetch_result($result,0,0); $newno = sprintf("0%02d",(intval($no) + 1) );
このコードは、2桁であれば正常に動作しますが、3桁になるときに動作がおかしくなります。
現象
3行目の$noの値が「099」の場合、4行目の$newnoは「100」になることを期待していますが、結果は「0100」になってしまいます。
桁ずれしているだけのように見えますが、「0100」をデータベースに保存し、再度同じ処理が行われると、3行目の$noが「099」になるため、同じ値になってしまいます。
原因
文字列型のカラムなので、先頭の文字から比較されます。
「099」と「0100」では、1文字目は同じですが、2文字目が「9」と「1」のため、「099」の方が大きいと判断され、「099」が取得されてしまいます。
対策
「%02d」がおかしいので、以下のようにすれば、現象は発生しません。
$sql = "SELECT max(no) FROM table "; $result = pg_query($pgsql, $sql); $no = pg_fetch_result($result,0,0); $newno = sprintf("%03d",(intval($no) + 1) );
また、行数でもいいので
$sql = "SELECT COUNT(no) FROM table "; $result = pg_query($pgsql, $sql); $no = pg_fetch_result($result,0,0); $newno = sprintf("%03d",(intval($no) + 1) );
とすることもできます。
作った人は、2桁しかテストしていなかったんでしょうね。