プロが教えるわが家の防犯対策術!

1.PHPでフォームデータを受け取る
2.データベースに接続をして書き込み
3.書き込まれたIDを取り出す + 数値 + 乱数を一つの文字列に結合
4.上記の文字列をデータベースに保存。

このような動作は一つのphpで可能でしょうか?
2.までの動作は問題ないのですが、
3.からが動作しません。

どなたかご教授ください。よろしくお願いいたします。

A 回答 (4件)

> ・最新のレコードからIDを取り出すのはどのような関数を使えばよいのでしょうか?



最新のレコードは常にIDの最大値をとるとすれば、SQL文は、

$sql = "SELECT MAX(id) FROM table";

のようにすればよいと思います。

> ・ID取得にこだわる理由は、データが書き込まれた順番にカウンタ値として、IDを取得しようと考えています。IDの他にも、テーブルに書き込まれた順番をカウントさせる方法はあるのですか?

要はMysqlに勝手にカウントアップさせるか、手動でカウントアップするか、だと思うんですよ。
で、何度もDBとやりとりさせるよりは、手動でカウントアップさせるようにした方が簡潔な処理が可能になりますよね。

で、上記のIDの取り出しからの一連の流れはこんな感じで書けると思うのですが、いかがでしょうか。
----------
$sv = "localhost";
$dbname = "hogehogehoge";
$user = "root";
$pass = "";

/* 最新のIDの取得 */
$conn = mysql_connect("$sv", "$user", "$pass");
mysql_select_db($dbname) or die("接続エラー");
$i = mysql_query("SELECT MAX(id) FROM table", $conn) or die ("SQL Error");
mysql_close($conn);

/* IDのカウントアップと数値・乱数の連結 */
++$i;
$var = $i . $num . $rand();

/* DBへの書込み */
$sql = "INSERT INTO table VALUES ('$i','hoge1','hoge2','~','$var')";
$db = mysql_connect("$host", "$user", "$pass");
mysql_select_db($dbname) or die("接続エラー");
mysql_query($sql, $db);
mysql_close($db);
----------
乱数関数($rand)については、正確な書き方ではないので、書籍やサイトのマニュアル等で確認して下さい。

> ・種別+カウンタ値+乱数として、
> IDを発行して再度、同テーブルに書き込み情報を管理させようと思っていますが、
> 同テーブルへの再接続というのはできないのでしょうか?

これって最終的にDBに登録されるIDフィールドのデータは連番にはならないようにする、ということなんでしょうか?

だとすると、上のIDの取得部分はもう少し複雑にしなきゃいけませんね。
IDフィールドの値を一度すべてとってきて、数値、乱数部分を切り捨てたあと、最大値を拾ってカウントアップ、というような手順でしょうか。

この回答への補足

imeruchanさん

ご丁寧な解説ありがとうございます。

教えていただいた方法で、
試しにIDのみを取得してブラウザに反映させようと思ったのですが、
Resource id #3と表示されて、最新の入力したデータの、
レコードのIDが表示されませんでした。

取り出したいテーブルのIDの設定は、
id , int(11) , not null , auto_increment , primary key(id)です。

以下phpのソースです。
<?php
//
$sv = "hoge";
$dbname = "hoge";
$user = "root";
$pass = "hoge";
// データベースに接続する
$conn = mysql_connect($sv, $user, $pass) or die("接続エラー");
mysql_select_db($dbname) or die("接続エラー");
$i = mysql_query("SELECT MAX(id) FROM hogehoge", $conn) or die ("SQL Error");

echo "<p>テスト表示";
echo "<p>$i";
mysql_close($conn);
?>

試しに、
$i = mysql_query("SELECT MAX(id) FROM hogehoge group by id", $conn) or die ("SQL Error");
としても結果は同じでした。


例えば23番目に入力したのであれば、23と表示させたいのですが、うまくいきません。
なにが理由と思われますか?
よろしくお願いいたします。

補足日時:2003/07/17 13:12
    • good
    • 0
この回答へのお礼

imeruchanさん

度々、ご丁寧な解説をありがとうございました!
どうにか解決することができました。

お礼日時:2003/07/22 10:28

> Resource id #3と表示されて、最新の入力したデータの、


> レコードのIDが表示されませんでした。

$i = mysql_query("SELECT MAX(id) FROM hogehoge", $conn) or die ("SQL Error");

↑mysql_query を echo しているのですから、
出力されるのは当然、Resource id です。

結果をプリントするためには、
mysql_result(リソースID,行番号,カラム名)
みたいに、query結果を分割して出力しないとダメです。

mysql_result($i, 0, "MAX")

で。
    • good
    • 0
この回答へのお礼

ducklingさん

ご解説ありがとうございます。
queryの分割でうまくいきました。

お礼日時:2003/07/22 10:27

> ・最新のレコードからIDを取り出すのはどのような関数を使えばよいのでしょうか?



最新のIDが最も大きい数値と考えていいのでしょうか?それだったら、
select max(id) from table_name;
で取得できます。

> ・ID取得にこだわる理由は、データが書き込まれた順番にカウンタ値として、IDを取得しようと考えていま
> す。IDの他にも、テーブルに書き込まれた順番をカウントさせる方法はあるのですか?

テーブルの再構築は可能でしょうか?
可能であれば、IDをシリアルにすることをお勧めしますが…

> 同テーブルへの再接続というのはできないのでしょうか?

これはよく意味が分かりませんが、DBへのコネクションを一回一回切断しているのでしょうか?

この回答への補足

kusukusuさん

ご返事有り難うございます。

データベースを始めたばかりで、
とんちんかんなことを聞くようですが、
DBへのコネクションを接続したまま、
テーブルに書き込む、書き込んだデータを取得、
データを加工後に再度、同テーブルに書き込むことは可能なのでしょうか?

その場合関数はどういう動きになるのでしょうか?
よろしくお願いいたします。

補足日時:2003/07/16 19:48
    • good
    • 0

2の手順でDBに書き込む前に、最新のレコードのID(仮にnとします)を取り出し、フォームデータをDBに渡す際、IDとしてn+1を付与してあげるようにした方が簡単ではないでしょうか。



3の数値、乱数が何によるものかは分かりかねますが、上記のような処理にかえることでDBからIDを取り出す必要がなくなりますから、不必要なコネクションを省略することはできますよね。

4に関しては、おそらく別テーブルに保存ということかと思いますが、これらの一連の操作は、もちろん1ファイル内に記述しても問題なく動作させることができるはずです。

この回答への補足

imeruchanさん

ご返事ありがとうございます。

補足と追加の質問があります。

・最新のレコードからIDを取り出すのはどのような関数を使えばよいのでしょうか?

・ID取得にこだわる理由は、データが書き込まれた順番にカウンタ値として、IDを取得しようと考えています。IDの他にも、テーブルに書き込まれた順番をカウントさせる方法はあるのですか?

・種別+カウンタ値+乱数として、
IDを発行して再度、同テーブルに書き込み情報を管理させようと思っていますが、
同テーブルへの再接続というのはできないのでしょうか?

何度か試しましたが、
<?php
//
$sv = "localhost";
$dbname = "hogehogehoge";
$user = "root";
$pass = "";

//
$conn = mysql_connect($sv, $user, $pass) or die("接続エラー");
mysql_select_db($dbname) or die("接続エラー");
$sql = "SELECT * FROM hogedata000 ORDER BY id DESC";
$res = mysql_query($sql, $conn) or die("データ抽出エラー");
?>
----------中略----------
<?php
mysql_close($conn);
?>

----------中略----------

<?php
//
$sv = "localhost";
$dbname = "hogehogehoge";
$user = "root";
$pass = "";

//
$conn = mysql_connect($sv, $user, $pass) or die("接続エラー");
mysql_select_db($dbname) or die("接続エラー");
$sql = "SELECT * FROM hogedata000 ORDER BY id DESC";
$res = mysql_query($sql, $conn) or die("データ抽出エラー");
?>
----------中略----------
<?php
mysql_close($conn);
?>

こういうことではないのでしょうか?
参考書を読みながら、あれこれ試しているのですが
うまくいきません。。。
いろいろ質問ばかりで申し訳ございませんが、
よろしくお願いいたします。

補足日時:2003/07/16 13:19
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!