• ベストアンサー

phpのデータベースへの接続

1.PHPでフォームデータを受け取る 2.データベースに接続をして書き込み 3.書き込まれたIDを取り出す + 数値 + 乱数を一つの文字列に結合 4.上記の文字列をデータベースに保存。 このような動作は一つのphpで可能でしょうか? 2.までの動作は問題ないのですが、 3.からが動作しません。 どなたかご教授ください。よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • imeruchan
  • ベストアンサー率43% (45/104)
回答No.3

> ・最新のレコードから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フィールドの値を一度すべてとってきて、数値、乱数部分を切り捨てたあと、最大値を拾ってカウントアップ、というような手順でしょうか。

izaq
質問者

お礼

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

izaq
質問者

補足

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と表示させたいのですが、うまくいきません。 なにが理由と思われますか? よろしくお願いいたします。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • duckling
  • ベストアンサー率47% (88/185)
回答No.4

> 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") で。

izaq
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。
  • kusukusu
  • ベストアンサー率38% (141/363)
回答No.2

> ・最新のレコードからIDを取り出すのはどのような関数を使えばよいのでしょうか? 最新のIDが最も大きい数値と考えていいのでしょうか?それだったら、 select max(id) from table_name; で取得できます。 > ・ID取得にこだわる理由は、データが書き込まれた順番にカウンタ値として、IDを取得しようと考えていま > す。IDの他にも、テーブルに書き込まれた順番をカウントさせる方法はあるのですか? テーブルの再構築は可能でしょうか? 可能であれば、IDをシリアルにすることをお勧めしますが… > 同テーブルへの再接続というのはできないのでしょうか? これはよく意味が分かりませんが、DBへのコネクションを一回一回切断しているのでしょうか?

izaq
質問者

補足

kusukusuさん ご返事有り難うございます。 データベースを始めたばかりで、 とんちんかんなことを聞くようですが、 DBへのコネクションを接続したまま、 テーブルに書き込む、書き込んだデータを取得、 データを加工後に再度、同テーブルに書き込むことは可能なのでしょうか? その場合関数はどういう動きになるのでしょうか? よろしくお願いいたします。

全文を見る
すると、全ての回答が全文表示されます。
  • imeruchan
  • ベストアンサー率43% (45/104)
回答No.1

2の手順でDBに書き込む前に、最新のレコードのID(仮にnとします)を取り出し、フォームデータをDBに渡す際、IDとしてn+1を付与してあげるようにした方が簡単ではないでしょうか。 3の数値、乱数が何によるものかは分かりかねますが、上記のような処理にかえることでDBからIDを取り出す必要がなくなりますから、不必要なコネクションを省略することはできますよね。 4に関しては、おそらく別テーブルに保存ということかと思いますが、これらの一連の操作は、もちろん1ファイル内に記述しても問題なく動作させることができるはずです。

izaq
質問者

補足

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

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • PHPからデータベースへの登録について

    はじめまして。現在、仕事の関係でPHPのプログラムを勉強している者です。 早速ですが、質問させていただきます。 PHPで作成したフォームメールから別で用意したデータベースに 入力データを登録しようとしているのですが、エラーでうまく動作しません。 PHP側のコードミスもあるかもしれませんが、PHPを動作させているサーバーと データベースサーバーの文字コードが違う点も原因しているのでは?と調べている状況です。 フォームからのデータを送るPHP ⇒ Shift_jis PHPをアップしているWebサーバー ⇒ Shift_jis データベースサーバー ⇒ EUC-JP データベースへの接続は問題なく行えているようですので、 登録処理するコードの部分のみを書きます。(↓) ******************************************************************************** // データベースへの登録 $sql = "INSERT INTO FORM_DATA(DataNumber, Time, Name, Email, Area, Sex, Interest, Commnet, OS, IP) VALUES('$tsvcount', '$ymdhis', '$sender_name', '$mail_address', '$mail_area', '$mail_sex', '$mail_interest', '$mail_body', '$os', '$ip')"; $sql = mb_convert_encoding($sql, 'EUC-JP', 'sjis'); mysql_query("SET NAMES 'EUC-JP'"); $db_result = mysql_query($sql); print $sql; print $db_result; if (!$db_result) { exit('Error! データを登録できませんでした。'); } // データベースとの接続解除 $db = mysql_close($db); if (!$db) { exit('データベースとの接続を閉じれませんでした。'); } **************************************************************************** PHP&Webサーバーとデータベースの文字コードを統一すればいい話かもしれませんが、 事情により異なる文字コードの環境で開発しております。 上記の通り、データベースに送信するSQL文はmb_convert_encoding()で「EUC-JP」に変換し、 mysql_query($sql);でデータベースに送信している形です。 この状態で送信すると、エラーとなり送ったSQL文を処理してくれません。 文字コードの変換処理、コードの記述など何が原因なのか分からず困っています。 考えられる原因と、解決策があればご教授いただきたいです。 ちなみに私はPHPはもちろんプログラム自体もまだ経験が浅く、 基礎的なことも理解していないことがかなりあります。 その上でご説明いただけますと大変有難いです。 ではよろしくお願い致します。

    • 締切済み
    • PHP
  • 長い文章のデータベース格納について

    phpで会員制サイトの制作を勉強しています。 データベースへはPDOで接続しています。 MySQLデータベースを使用しています。 会員制サイトによくある、 各ユーザーの自己紹介文を保存したいのです。 500文字程度の文章になると思うのですが、 そういった長い文字列データはデータベースに保存してよいのでしょうか? 長い文字列はあまりデータベースには保存すべきでないでしょうか? また、データベースに保存すべきでない場合は どのように長い文字列を保存したら良いでしょうか? ご回答、よろしくお願いします。

    • ベストアンサー
    • PHP
  • データベースに"や'を保存できない

    phpで会員制サイトの制作を勉強しています。 データベースへはPDOで接続しています。 MySQLデータベースを使用しています。 自己紹介文のような長めの文章をデータベースのTEXT型カラムにUPDATEで保存したいです。 $stmt = $db->prepare("UPDATE member SET text=:text WHERE id=:id"); $stmt -> bindParam(':text ',$text,PDO::PARAM_STR); $stmt -> bindParam(':id',$id,PDO::PARAM_INT); $stmt -> execute(); というSQL文を作成し、 文字列データを保存することはできたのですが、 「"」や「'」のような記号を含めるとそれ以降の文章が消えた状態で保存されてしまいます。 例えば顔文字などで「"」や「'」のような記号を使用する場合もあると思うので、 できれば、データベースに保存したいです。 どうしたら安全に「"」や「'」が保存できるでしょうか? ご回答、よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHPでMySQLのデーターベースが書込み出来ない

    PHPとMySQLとJAVAスクリプトで作成しましたデーターベースについてお尋ねします。 PHPとMySQLで作成したデータベースの検索したり、読み込みを普通に可能ですが、書き込み及び、削除が出来ません。 PhpMyAdminでは書けます(データー入力出来ます)が、PHPプログラムからはデーターを入力したり、削除を行うことが出来ません。 そして、全くエラーも出ません。 PHP上では「書き込みました」と、いかにも正常なようなメッセージが返ってきます。 が、中身は空です。 システムが出来上がって問題なく3年以上使用していたのですが、自宅のLINUXサーバーのHDDが壊れましたので、再度システム構築をやり直しました。 MySQLとPHPも再インストールを行い再構築を行いました。 その後上記症状が出て書き込み、削除が出来なくなりました。 PHPのプログラムは全く触っておらず、変更も更新もしておりません。 念のためプログラムのチェックも何度もしておりますが、勿論これといって問題は見あたりません。 PHP.INI等の設定ファイルに問題があるのでしょうか。 それとも、MySQLに問題が有るのでしょうか。 宜しくご教授の程お願い致します。

  • htmlタグを含んだ文字のデータベースへの読み書き

    PHPで、「htmlタグを含んだ文字」を、 データベースへ読み書きする安全な方法を教えて下さい。 リンクタグや、フォントタグなどは、 そのまま使用できるようにしたいです。 ■追加する時 htmlフォームからデータベースに保存(SQLインジェクション) ■編集する時 データベースからデータを読み出す(htmlエスケープ) htmlフォームで再編集し、データベースに保存(SQLインジェクション) こういう作業になるかと思いますが、 どのように処理したら、htmlタグを使いつつ、 安全に更新ができるでしょうか? 教えてくださいm(_ _)m

    • ベストアンサー
    • MySQL
  • PHP+ACCESSのデータベース接続について

    こんにちわ。PHP+ACCESSを使って、データベース接続を試みようとしておりますが、最初のところでつまづております。 <?php //データベースに接続する $DB = sqlite_open('db.mdb'); $SQL = "create table db (id integer ,name,time) $result = sqlite_query($DB, $SQL); ?> 上記のPHPで、ACCESSファイルを作成しましたが、作成したファイルを開くと、"データベース形式が認識できません"と表示し、データベースを閲覧することができません。 また、ACCESSから手動で作成したファイルをsqlite_openで接続しようとすると、sqlite_open(): file is encrypted or is not a database inエラーが表示接続することができません。 PHPとACCESSの相性の問題なのでしょうか。この原因がわかる方がいらっしゃいましたら、教えていただけないでしょうか。 宜しくお願い致します。 【php4.3.10 SQLite Library2.8.14 ACCESS2000】

    • ベストアンサー
    • PHP
  • PHP+MySQLで数千字程度のテキストを扱う

    PHPを勉強中で、入門書をつまづきながら読むくらいのレベルの者です。 例えば、PHP+MySQLでブログのようなシステムを作るとしたとき、本文にあたる短ければ数百字、長くて数千字のテキストを扱う場合にどのような方法をとればいいのか悩んでいます。 1. テキストファイルとして保存してデータベースにファイル名を保存し、ファイル名からPHPのテキストファイルを読み込む関数で読み込む 2. TEXT型(あるいはVARCHAR型?)でそのままデータベースに保存する の2つの方法のいずれかを考えており、 テキストの利用方法として、 1. そのままHTMLに出力して表示する。その際、データベースの同じテーブルに入っている記事タイトルなどのデータも利用する。 2. 複数ファイルから特定の文字列を含むもののみを選び出す(行番号などの情報は不要)。この際は他のデータは利用せず、例えば記事IDのようなものの配列が得られればよい。 のことをしたいと思っており、 また、その他の条件として 1. 動作が高速な方がいい(特に複数ファイルからの検索) 2. 直接テキストファイルのURLを指定して内容を読まれても、まあOK 3. 最大文字数は多分8000字程度で固定(書き込み時にチェック) を考えております。 総合的に考えてどちらの方法が優れているでしょうか? また、それぞれの方法で知っておいた方がいい制限事項などはありますか? 特に、正直なところVARCHAR型、TEXT型がどのようなアクセス速度など特徴を持つのかをまったく分かっていません。 ご教授宜しくお願いします。

    • ベストアンサー
    • MySQL
  • phpとデータベース

    書籍のサンプルを実行しても表示されません pearのインストールが怪しいですが、どこを直せばいいかわかりません。 ご教授お願いいたします。 <HTML> <HEAD> <TITLE>PHPのテスト</TITLE> </HEAD> <BODY> <?php require_once("DB.php"); $dbUser = "sample"; // ユーザー名 $dbPass = "password"; // パスワード $dbHost = "localhost"; // ホスト名 $dbName = "sampledb"; // データベース名 $dbType = "mysql"; // データベースの種類 // MySQL="mysql", PostgreSQL="pgsql", MS SQL-Server="mssql", ODBC="odbc" などを設定 // 接続文字列の作成 $dsn = "$dbType://$dbUser:$dbPass@$dbHost/$dbName"; // データベースに接続 $conn = DB::connect($dsn); // 接続に失敗したらメッセージを表示して終了します。 if (DB::isError($conn)){ die($conn->getMessage()); } print('接続に成功しました。'); // データベースから切断します。 $conn->disconnect(); ?> </BODY> </HTML>

  • phpでデータベースを呼び出してデータがなかったら

    phpでデータベースを呼び出してデータがなかった場合の処理をif文を使って行いたいのですがどうしたらいいのでしょう? $result = mysql_query("select id from table where id = 1"); として1というidが入ってない場合$resultの中身はどうなるのでしょうか? if(idが存在しない時の条件) { echo "そんなデータ登録されてないよー" }else{ echo "$result" } としたいのですがifの条件の作り方がわかりません。 みなさんならどうしますか?

    • ベストアンサー
    • MySQL
  • カテゴリ絞込みのテーブル表示の仕方(PHPのCSVデータベース)

    初心者な質問すみません。 CSVのデータベースからPHPでID別にカテゴリ表示されるのを作りたいのですが、考えているのはフレームひとコマにデータを表示して3列並べると改行して並べていくのを作りたいのですが 全部一列で並んでしまいます・・・ どのようなタグを使えばいいかわかる方いらっしゃいましたらお願いします。  □□□  □□□  □□  ↑ 上手く書けませんがこんな感じにしたいんです。

    • 締切済み
    • PHP