ソフトウェア開発者の日常

こだわりなく書きたいことを書いていきます。

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桁しかテストしていなかったんでしょうね。