• ベストアンサー

phpでmysqliで接続

慣れてなくきょうしゅくなのですが、 mysqliで接続して、 selectして、 insertして、 selectして 切断みたいな事をユーザがリクエストしたタイミングで行うのですが、 こういった場合、接続と切断は、 どのタイミングで行うのでしょうか? ユーザが途中で止めた場合、切断出来ない?? 皆様、ユーザーが検索する様なwebシステムの時、 mysqliでどの様に、接続と切断を書いておりますでしょうか。

  • PHP
  • 回答数2
  • ありがとう数1

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

  • ベストアンサー
  • coai
  • ベストアンサー率50% (152/301)
回答No.1

>ユーザが途中で止めた場合、切断出来ない?? ユーザーが途中でやめるという事が、そもそもできない。 もしかして、これまでローカルプログラムを作ってきた人ですかね? 私は、ローカルプログラムを作ってきて、Webプログラムを作り始めた時には根本的な考え方の相違が理解しにくくて大変混乱しました。 それと同様の混乱があるように感じたので、もしかしてそうかな?と思ったわけですが。 1)ユーザーがサーバにリクエスト(HTTPリクエスト)します。 2)そのリクエストをトリガーに、サーバサイドプログラム(PHP)が実行されます。 3)サーバサイドプログラムが何らかの処理をして、クライアント(ブラウザ)になんらかの情報(多くの場合にはHTML)を出力します。 4)出力後に終了、サーバサイドプログラムが確保していたリソース(メモリやDB接続等)はすべて解放されます。 だいたいこんな感じですね。 仮に(1)~(3)の途中(ブラウザでは、読み込み中の表示がされているでしょう)で、読み込みを中断(×ボタンを押す等)した場合でも、サーバー上の処理が止まるという事はありません。 送られてきたデータを、クライアント(ブラウザ)が無視するだけですね。 サーバ上のプログラムを、ユーザーが途中で止めるという事は基本的にできません。 ※できるように作り込めばできないことはないが、普通はわざわざそんな事はしない DBへの接続が必要なら、リクエスト毎にDBに接続して、SELECTやINSERT等SQLを発行して、DBから切断して終了。 リンクをクリックされるたび(=リクエストが発行されるたび)に、毎回それを行います。 毎回のうち、どのタイミングでそれを行うかと言えば…まあ、多少はその個々人の癖があるでしょうが、要・不要に関わらず真っ先にDBに接続する、切断はわざわざ行わないでプログラム終了で自動で切断・解放されるに任せるなんて方法でもいいと思いますよ。 ローカルプログラムの流儀で言うと、不要なのにDBに接続するなんて無駄だとか、不要になったのにDBに接続し続けるなんて無駄だという感覚ですが、Webプログラムはむしろ、必要・不必要を判定する方が無駄、わざわざ一旦切断する手間こそ無駄というのが流儀っぽい。 HTTPリクエストを受けて、データを返して終了するまでの、0.0何秒の世界での話なのでというところでしょうか。

その他の回答 (1)

  • t_ohta
  • ベストアンサー率38% (5083/13283)
回答No.2

DBへの接続はHTTPリクエストがHTTPサーバに届きプログラムの実行が始まった時点で開始します。 一連の処理をしてブラウザに対しHTML等を返す直前にプログラムの実行が終了しますので、その時点でDBへの接続は切れます。 長い処理でユーザーが読込待ちの時にブラウザの「×」ボタンを押すとPHPは処理を中断します。 その場合、DBへの接続は処理を中断した時点で自動的に閉じられます。 また、正常終了した場合でもプログラム中にcloseの処理が書かれていなければ、処理終了時に自動的にDBへの接続を切ってくれます。 DB接続を各クラス毎に書くと接続が頻発してしまうので、DB処理クラスを用意してシングルトンにしておき、最初にインスタンスが作られた時点でDBへ接続し、切断処理は明示的に書かず自動切断に任せるか、デストラクタに切断処理を書いておきます。

関連するQ&A

  • mysqliについて

    PHP初心者です PHP 5.2.5 MySQL 5.1.22 レンタルサーバーのphpのバージョンが php5.2.5ではpdoがバグで使えないらしいのでmysqliを使おうとしています。PHP 5.2.5でもmysqliはバグありますか? mysqliでMYSQLに接続するにはどうすればいいのでしょうか? いままではこんな感じでしたがmysqliにするとどんなコードになるのでしょうか? $link=mysql_connect('localhost', 'user', 'pass')or die(mysql_error()); mysql_select_db(user'); mysql_query('SET NAMES UTF8'); $start=1; $hyouji=10; $recordSet = mysql_query(sprintf('SELECT * FROM hoge2 ORDER BY id LIMIT %d, %d' , ',$start,$hyouji)); <?php while ($table = mysql_fetch_assoc($recordSet)) { ?> <tr> <td><?php print($table['id']); ?></td> <td><?php print($table['name']); ?></td> </tr> <?php } ?>

    • ベストアンサー
    • PHP
  • php mysql接続での書き方

    色々なサイトを拝見させて頂き勉強をしていると phpからmysqlで接続し呼び出すときに prepare(array(SELECT * FROM request WHERE id = ?,)); このような一文で呼び出すものと行数を分け prepare(implode(' ', array( 'SELECT *', 'FROM `request`', 'WHERE `id` = ?', このように書いているものとあります。 個人的には行数を分けていた方がわかりやすいので後者のほうで書いているのですが、これは作る人の気分でかき分けていいものなのか気になり質問させて頂きました。 また後者ではどういうタイミングで区切るのかわからないというのもあります。 SELECT * FROM users INNER JOIN category ON users.category = category.id INNER JOIN images ON users.category = images.id このように3つのテーブルを内部統合したくこの文を作りmysql上で叩くと3つ統合され表示されます。 しかし上記の文に当てはめphpから叩くとエラーがでます。 素直に1行で書けばよいのですが、分からないからというってスルーするのはあまり良くないかと重いご質問させて頂きました。 この3つのテーブルの場合、後者の書き方ではどのタイミングで区切るのでしょうか。

    • ベストアンサー
    • PHP
  • mysql mysqli 違いなど

    php & mysql Webアプリ開発初心者向け関連の本を読みながら学習している者です・・・。 本によってはSQL文が、mysql~と書いてあるものもあれば、mysqli~と書いてあるものもあります。 わからなくなってしまいました・・・。 PHPのバージョン ⇒ 5.2.17(phpinfo();にて確認) Mysqlのバージョン ⇒ 5.1.56(サーバー側のphpMyadminからselect version()にて確認) サーバーapacheのバージョン ⇒ 2(外人サポートに聞いたら、『2』とだけ言われました汗) 使用PC ⇒ Windows7 質問 1、私の場合、主にmysql mysqli、どちらを使っていけばいいでしょうか? 2、mysql mysqliの機能的な違いに関してよくわかりません。。phpやmysqlなどのバージョンによって片方のみを使用するのか、時と場合によって使い分けるのか、別にどちらを使用してもいいのか、など・・。 すいません、検索したんですけど、よくわかりませんでした・・・涙

    • ベストアンサー
    • MySQL
  • PHP Mysqli関数でエラー情報を取得する

    はじめまして。 PHPから、Mysqli関数を使用して、5000件のinsert文をMySQLサーバーに投げる処理で困っています。 insert文をセミコロン;で接続して、1つのSQL文にして、executeしています。 あるinsert文でエラーが発生した場合、それ以降のSQL文が実行されずに、PHPに戻ってきてしまいます。マルチクエリの挙動としては、この動きはしょうがないのでしょうか? 5000件のうち、複数のエラー(キー重複や、外部参照キーエラー)があった場合、エラーが起きたデータについてはどのようなエラーであったかが取得でき、それ以降のデータについてはinsertが実行できると言う処理をしたいのですが、このような処理は不可能でしょうか。 ちなみにupdateの場合は、更新対象のデータがなかった場合でもエラーとはならないので5000件文の処理が行われます。 環境は、以下です。 OS:FreeBSD6 PHP:PHP5 MySQL:MySQL5.2 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • mysqlにてinsertした件数を取得

    phpからmysqliを利用してmysqlに Insert XX select … の様な形でinsertを行いたいのですが、 この時、insertした件数が必須なのですが、 selectをもう一回発行するのも無駄が気がしており、 insertしながら件数を取得する事は可能でしょうか? 知識不足で恐縮では御座いますが、 何卒宜しくお願い致します。

  • 【添削願】PHP5,4手続型チェックお願いします。

    初歩的で恐縮ですが PHP5,4手続き型で書く場合についてです。 うまくMYSQLにインサートの文章がかけず or die("データ追加エラー");のエラーの表示しかされず右往左往しています。 <?php $sv = "mysql.xxx.jp"; $dbname = "bbb"; $user = "bbb"; $pass = "aaa"; $txt="あああ"; $ip="1234"; $ua="mac"; //接続 $link = mysqli_connect($sv, $user, $pass,$dbname); //クエリ文 $query = "INSERT INTO data1 (txt,ip,ua) VALUES('$txt','$ip','$ua')"; //書込不可ならエラー表示 $result = mysqli_query($link, $query) or die("データ追加エラー"); ?> txt,ip,uaというカラムは作ってあります。そこに各変数のデータを入れたいのです。 ご指摘、添削いただけますとありがたいです。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • PHPとMySQLとの連携エラー

    環境はWin 8.1, Apache 24, PHP 5.5.6, MySQL 5.5です。 My SQLとの連携で、以下のエラーが出てしまいました。 ---------------------------------------------エラー文ここから Warning: mysqli_select_db() expects parameter 1 to be mysqli, string given in C:\Program Files\Apache\Apache24\htdocs\sample\省略.php on line 11 データベースの選択に失敗しました。 ---------------------------------------------エラー文ここまで ---------------------------------------------コードここから <?php $url = "省略"; $user = "省略"; $pass = "省略"; $db = "省略"; // mysqliへ接続 $link = mysqli_connect($url,$user,$pass) or die("mysqliへの接続に失敗しました。"); // データベースを選択する $sdb = mysqli_select_db($link, $db) or die("データベースの選択に失敗しました。"); // クエリを送信する $sql = "SELECT * FROM省略"; $result = mysqli_query($sql, $link) or die("クエリの送信に失敗しました。<br />SQL:".$sql); //結果セットの行数を取得する $rows = mysqli_num_rows($result); //結果保持用メモリを開放する mysqli_free_result($result); // mysqliへの接続を閉じる mysqli_close($link) or die("mysqli切断に失敗しました。"); ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=SHIFT-JIS"> <title>全件表示</title> </head> <body> 接続ID:<?= $link ?><br /> 選択の成否:<?= $sdb ?><br /> 結果ID:<?= $result ?><br /> 行数:<?= $rows ?><br /> </body> </html> ---------------------------------------------コードここまで 11行目はコメント文「データベースを選択する」です。 ただ、実際の間違いはその下ですよね? ネットで検索してみたつもりですが、良い情報はありませんでした。 直訳を考えると、mysqli_select_db($link の部分がmysqliであるべきなんですか? 少なくともmy SQLへの接続には成功していると取っていいのでしょうか?

    • ベストアンサー
    • PHP
  • mysqli_stmtエラーの修正方法がわからない

    以下のエラーがわかりません。 Warning: mysqli_stmt::bind_param(): Number of variables doesn't match number of parameters in prepared statement in C:\xampp\htdocs\job_site4\search_criteria.php on line 62 Warning: mysqli_stmt::bind_result(): Number of bind variables doesn't match number of fields in prepared statement in C:\xampp\htdocs\job_site4\search_criteria.php on line 68 Warning: printf(): Too few arguments in C:\xampp\htdocs\job_site4\search_criteria.php on line 73 というエラーになりました。 以下ソースです。 /* 変数定義関連 */ /* mysqliの定義 */ global $mysqli; $mysqli = new mysqli('localhost', 'root', "", "db"); //$link = mysqli_connect('localhost', 'root', "", "db"); /* 接続状況をチェックします */ if (mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_connect_error()); exit(); } print("<BR>"); /* 現在のデフォルトデータベース名を返します */ if ($result = $mysqli->query("SELECT DATABASE()")) { $row = $result->fetch_row(); printf("Default database is %s.\n", $row[0]); $result->close(); } print("<BR>"); /* データベースを a_db に変更します */ $mysqli->select_db("a_db"); /* 現在のデフォルトデータベース名を返します */ if ($result = $mysqli->query("SELECT DATABASE()")) { $row = $result->fetch_row(); printf("Default database is %s.\n", $row[0]); $result->close(); } // データベースのdump echo "<pre>";var_dump($mysqli);echo "</pre>"; /* プリペアドステートメントを作成します */ $sql = " SELECT * FROM `test_table` WHERE 1 "; // バインドデータ設定 $key = 1; if($stmt = $mysqli->prepare($sql)) { /* マーカにパラメータをバインドします */ $stmt->bind_param("i",$key); // バインドする変数に設定して送る /* クエリを実行します */ $stmt->execute(); /* 結果変数をバインドします */ $stmt->bind_result($col1,$col2); // バインドする変数分設定 /* 値を取得します */ $stmt->fetch(); printf("%s : %s\n", $col1.$col2); /* ステートメントを閉じます */ $stmt->close(); } // 切断 $mysqli->close(); よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHPの書き方について

    PHPを独学で勉強中で、気になったことがあるので質問させていただきます。 最初に買った書籍とその次に買った書籍で書き方が違うところがあるので、普通はどちらでやるのか、また、使い分けがあるのかが知りたいです。 たとえば、データベースを1行ずつ取り出す処理で、1冊目では $pdo = new PDO($dnsinfo,$USER,$PW); $sql = "SELECT * FROM ○○"; $stmt = $pdo->prepare($sql); $stmt->execute(null); $res = ""; while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ $res .= $row['△△'] ."," .$row['□□'] ."<br>\n"; } ・・・というコードがあったのですが、2冊目には同じような処理が mysqli_fetch_assoc()を使って書かれていたり、 接続の仕方も1冊目では「new PDO($dnsinfo,$USER,$PW);」を使って書かれているのが、2冊目では「mysqli_connect()」になっていたり、 他にも同じような処理がよく似たコードで書かれています。 調べてみると、PHP5.5から1冊目のやり方になった・・・ような記事を見つけたのですが、どちらの本もPHP5.5と書いてあり、いまいちよくわかりません。 詳しい方いらっしゃいましたらご教示お願いいたします。

    • ベストアンサー
    • PHP
  • 複数行のクエリを、まとめて実行するには?mysqli_multi_query()?

    PHPとMySQLの環境です。 複数行のクエリを、まとめて送って取得したいと考えています。 ですが、今試行錯誤しているのですが、うまく行かない状態で、クエリをきちんと実行できません。 処理の流れとしては、 [DBにアクセス]→[2つのクエリの実行]→[データ取得]→[DBをクローズ] でいいのではないかと思ってやっているのですが、 2つのクエリを実行するのはなにやら無理なような記述もウェブ上で拝見しました。 その場合、同じDBの同じテーブル内の異なるデータを取得したいだけなのに、 わざわざ、一度DBにコネクトして、切断、そしてまたコネクトして、切断ということを繰り返さないとダメなのでしょうか。。? そもそも同一PHPファイル内で二度も接続、切断はすべきではないですか? ちなみに、 一つ目のクエリでは、テーブル(table_a)のレコード数をカウントしてPHP側で取得するという流れの処理です。 $query = "SELECT count(*) FROM `table_a`"; もう一つのクエリは、テーブル(table_a)の最新のレコードの、idカラムのidを取得するだけのものです。 $query = "SELECT arrayset FROM `table_a` ORDER BY id DESC LIMIT 1"; この処理を一度のクエリで入れ込むことは可能でしょうか。 それぞれ単独では実行できます。 PHPでこのような関数 mysqli_multi_query() を見つけて色々調べているのですが、 いまだに使用方法がきちんとつかめない状況です。 これで複数のクエリを送ることは可能でしょうか。 アドバイス宜しくお願いします。

    • ベストアンサー
    • MySQL

専門家に質問してみよう