- 締切済み
mysqlにてinsertした件数を取得
phpからmysqliを利用してmysqlに Insert XX select … の様な形でinsertを行いたいのですが、 この時、insertした件数が必須なのですが、 selectをもう一回発行するのも無駄が気がしており、 insertしながら件数を取得する事は可能でしょうか? 知識不足で恐縮では御座いますが、 何卒宜しくお願い致します。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
定年退職した際にJAVAの職業訓練を受けた者です。その際に、MySQLのコマンドラインツールを自作し、また、サーバーサード・アプリケーションを一つだけ開発しました。その僅かな経験を手がかりに回答します。 >insertしながら件数を取得する事は可能でしょうか? さて、MySQLのコマンドラインツールを自作するにあたってぶつかった課題が正にこれです。 ・DELETE文を実行したら、(1)結果、(2)削除前レコード数、(3)削除後レコード数の三つを取得したい。 ・INSERT文を実行したら、(1)結果、(2)追加前レコード数、(3)追加後レコード数の三つを取得したい。 ・SELECT文を実行したら、(1)結果、(2)取得したレコード総数を知りたい。 そこで考えたのが次の三層構造です。 第1層:mysql.MySQL() ・JSPとDirectDAOとの仲立ちをするメソッド。 ・SQLを解析して適切なDirectDAOのメソッドを選択する。 ・dbAccess.DirectDAO.dbUpdate() ・dCount() 必要に応じて複数のメソッドをコールする。 ・DirectDAOの実行結果とメッセージの編集。 doComd() (例)テーブル'goods'から3レコードが削除されました。 第2層:dbAccess.DirectDAO() ・MySQL.doCmd()から受け取ったSQL文を実行クラスであるdbAccess.DbManeger()に渡す。 ・MySQL.doCmd()から受け取ったSQL文を実行結果を知るためにdbAccess.DbManeger()にコールする。 dbExecute() dbSelect() dbQuery() dbUpdate() 第3層:dbAccess.DbManager() dbAccess.DirectDAO()の各メソッドから受け取ったSQL文を実行する。例えば、INSERT文を実行するdbAccess.DirectDAO.dbUpdate()は、dbAccess.DbManager.open()、dbAccess.DbManager.open()、dbAccess.DbManager.update()、dbAccess.DbManager.close()をコールする。 職業訓練で読んだ教本では、このような3層構造のクラスライブラリを用意するのはかなり一般的な作法・手法のようです。 さて、本題に入りますが、INSERT文の実行においてdbAccess.DirectDAO.dbUpdate()に相当するメソッドが呼ばれるのは間違いないと推察します。そして、多分、論理タイプの値が戻されるでしょう。しかし、 ・dCount() ・dbAccess.DirectDAO.dbUpdate() ・dCount() と、3つのメソッドを実行して3つの戻り値を戻すなんてことは有り得ないと推察します。つまり、一般的に提供されるクラスライブラリは第3層を含む第2層だと思います。第二層の結果をどういうメッセージとして編集して顧客に見せるのかは、あくまでもアプリケーションの課題。ですから、私が自作した第一層もアプリケーション毎に幾つかのバリエーションを持たざるを得ないと思います。 こういうクラス開発者サイド、アプリケーション開発サイドに立って考えると、 Q、insertしながら件数を取得する事は可能でしょうか? A、No! ここに言う第一層に相当するメソッドないし関数を用意するしかないと思います。あくまでも、論理的な考察の帰結においてんことですが・・・。
- coai
- ベストアンサー率50% (152/301)
mysqliを使っているということなので、mysqli_affected_rowsが使えますね http://php.net/manual/ja/mysqli.affected-rows.php 念のためにPDOのケースも書くとrowCount() (PDOStatement::rowCount)ですが、こちらはあらゆるDBから値が取得できると保証はされていない ※まあ、mySQLに限定すればmysqli_affected_rowsが存在するぐらいなので、取得できるでしょうが http://php.net/manual/ja/pdostatement.rowcount.php 可搬性を求めるなら、それが少々無駄な行為でも、行数を取得できるSQLを発行する必要があるでしょう mySQL限定でいいならPDOでも使える(ハズ) ま、質問の件はmysqliという事で、PDOの件は完全に蛇足ですがね