K.Maebashi's BBS

ご自由に書き込んでください。雑談も可。
テスト書き込みの類はテスト用掲示板にどうぞ

[日付順表示] [日付順インデックス] [スレッド順インデックス]

新規投稿 | 開設者ホームページへ戻る | ヘルプ

[1838] PHP、MYSQLのBBSで質問です
投稿者:inak2
2012/11/18 19:07:49

Maebashi様 お世話になります。BBSのソースをサーバーにアップして、動作確認しております。 しかし、最初の投稿はできるのですが、2回目からの投稿でエラーが発生します。 エラーの内容を見ると、 SQLエラーinsert into message (boardid, serialid, name, subject, url, message, password, salt, parent, top, ipaddress, remotehost, useragent) values ('1117no2', 0, '以下省略・・・・・・ となっており、serialidが2回目の投稿にもかかわらず0を入れようとしてエラーになっていると考えられます。 テーブルをみると最初の投稿のserialidのフィールドには0が入っています。 そこでinsert.phpのソースコードを見ると、if($row[0]==0) {$serial_id=0;} else {$serial_id=$row[0]+1;} となっております。 ホームページ上の説明のコードでは$serial_id=$row[0];と書かれています。 オートインクリメントを設定してもうまきいきません。 よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1839] Re:PHP、MYSQLのBBSで質問です
投稿者:(ぱ)こと管理人
2012/11/21 01:59:57

すみません、これはおそらくバグっています。 記憶が曖昧ですが、ずいぶん前に、新しい掲示板を立ち上げるとき、 「ホームページ上の説明のコード」のとおり、 54: $sql_str = sprintf("select count(*)" 55: . " from message where boardid='%s'", 56: $board_id); 57: $result = mysql_query_or_die($sql_str); 58: $row = mysql_fetch_row($result); 59: if ($row[0] == 0) { 60: $serial_id = 0; 61: } else { 62: $serial_id = $row[0]; 63: } count(*)でレコード数をとった値、とすると、レコードの物理削除を行った場合に おかしくなるため修正したような気がします(現在は、あまりのspamの多さに 辟易したため管理者権限で物理削除ができるようになっていますが、当初はその 機能はありませんでした)。 それを考慮して、現状では以下のようにmax()を取るようにしたのですが、 $sql_str = sprintf("select max(serialid)" . " from message where boardid='%s'", $board_id); $result = mysql_query_or_die($sql_str); $row = mysql_fetch_row($result); if ($row[0] == 0) { $serial_id = 0; } else { $serial_id = $row[0] + 1; } その新しい掲示板を立ててからしばらく経ってからのことだったので、 「2回目の投稿」については試していなかったのかと思います。 すみませんが現状こちらではそれを直してテストまでする余裕はありません。 そちらで回避してください。よろしくお願いします。 (serial_idの最小値を1とする、あたりが簡単な気はします)
[この投稿を含むスレッドを表示] [この投稿を削除]