• ベストアンサー

再利用できるPHP関数(データベース用)

こんにちは PHPの初心者です。 今制作しているウェブサイトで数回同じようなmySQLクエリを使いますが、操作の種類によってクエリを処理できるPHP関数を記述したほうが効率的だと聞きました。たとえばすべてのselectクエリは同じPHP関数で扱う。ですが、テーブルによって引数の数などが変わってきて、どうやってそれを正しく扱うのか迷っています。すべての値をarray項目に格納してwhileで扱うということですか? 最もふさわしい方法がわかる方がいれば教えていただけませんでしょうか? select, insert, delete, alterを扱いたいと思います。 宜しくお願いします。

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

  • ベストアンサー
回答No.2

■Insert文の件 ソレで問題ないと思います。MySQLのテーブルを設計した段階で、Primary keyをAUTO_INCREMENTに設定したのであれば、INSERT句に特にそのフィールドを含めなければ勝手に連番でインサートされると思います。 他のフィールドも同様に、defaultを設定しておけば、INSERT句に含めなければ勝手にdefaultの値を挿入すると思います。 ■select文の件 こちらもソレで問題ないと思います。ただ、selectの場合は、毎回作成するウェブサイト毎にどの程度変わるのかということと 似たような構文が何回発生するのか、ということを踏まえて考えてみてください。 作成するアプリケーションで、tableの数が2~3ぐらいしかないのであれば、それぞれのテーブル名を含んだ関数を作ったほうが楽できると思います。 サイトに寄ってはとんでもない数のテーブル名が来るとかであればもはやそれは既存のフレームワークを使うような作り方に変えたほうがいいわけですし。 汎用的に作るっていうことは、外からの色々なパラメータを受け取って丁度良く作らなければいけないので、その関数を実行するために様々なオプション的なパラメータ(引数)を渡してやらなければならず、結局面倒なことになるかも知れません。 全体のボリューム感で見て、関数を設計してみてください。 また、どうしても汎用的なものが必要だ、ということであれば、既存のフレームワークやライブラリを検討してみてください。 ■エスケープ処理に関して >magic_quotes だめでしょうね。むしろmagic_quotesは、OFFにするのが一般的なのではないでしょうか。 mysqlをどの様に操作しているのか分かりませんが・・・ ・mysql関数だった場合 全部の値に対してSQL文に値を収める場合、mysql_real_escape_string関数を使ってエスケープする ・PDOを利用されている場合 プリペアドステートメントを使う 外部からの入力(検索窓など)を受ける場合は特に必須です。 このMySQLを扱うという件に関しては、セキュリティや設定など色々あるので、調べてみてください。

2B2B
質問者

お礼

さまざまな情報を教えていただいて本当にありがとうございます。テーブルが10個あるので、できるだけ重複を避けるよう関数にまとめたいと思いました。ご提案されたとおり検討してみます。

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

その他の回答 (1)

回答No.1

どの程度集約するか、というバランス感覚はなかなか難しいと思います。 単純に、同一のクエリが2回以上発生するのであれば、その同一のクエリのものを関数に入れておく、というだけでいいのではないでしょうか。 つまり、ロジック上で、コピペをしないという。 find_foo_data, find_bar_dataのような感じで、SQL文をリターンするだけ、というのでも良いと思います。(まぁそれだったらdefineすればいいだけですが) テーブルと取得するフィールドは同一で、where句の一部だけ毎回変わる、というのであれば、 <?php function find_hoge_table_where($where){ return "select a, b, c from hoge where " . $where; } //こんなふうに。 $sql = find_hoge_table_where("name='aiueo' and regist=1"); ?> とか。 insert文なんかは、フィールド名に対して、値が決まっていて且つ、複雑なクエリを吐き出さないのであれば、 連想配列を引数で渡してやって動的にsql文を構築して返すだけでいいので簡単ですね。 function insert_query($table, $data){ $sql = "insert into {$table} set "; $buf = array(); foreach($data as $field=>$value){ $buf[] = "`{$field}`='{$value}'"; } $sql .= implode(", ", $buf); return $sql; } PDOのprepareを使うとか、値をエスケープするとかする場合はもうちょっと工夫が必要ですが。 deleteは、単一の行を削除するのであれば、引数にテーブル名と、主キーに設定したIDとかを渡してやったらdelete文が返ってくるようにするだけです。 とにかく、もっと汎用的にとか考え出すと大変なので、コレぐらいの簡単なイメージで実装されたらよいのではないかなと思います。 もっときちんと機能的なものをと思われる場合は、ORマッパーなどをご利用されると良いかと思います。 Doctrineとか、ADODBとか、Propelとか。(ORマッパーが組み込まれているフレームワークを使うというのもありうるとは思います。CakePHPとかKohanaとか、Symfonyとか・・・)

2B2B
質問者

お礼

ありがとうございます。とても参考になりました。 もう少し質問させていただきますが function insert_query($table, $data){ $sql = "insert into {$table} set "; $buf = array(); foreach($data as $field=>$value){ $buf[] = "`{$field}`='{$value}'"; } $sql .= implode(", ", $buf); return $sql; } という分でテーブルの第1フィールドがauto increment(データを挿入する必要なく、自動的に値が生成されるタイプ)でも使えますか?フィールド名を明記しない場合、$dataのなかの第一の値を無理矢理そのフィールドに挿入しないのですか? select文についてなんですが、やはり毎回テーブルとフィールド名などが変わると、このようにarrayでまとめるのは、ふさわしいでしょうか function select_elements($table, $fieldname){ $sql = "select"; $buf = array(); foreach($fieldname as $value){ $buf[] = $value; } $sql .= implode(", ", $buf); $sql .= "from {$table}" ; return $sql } やはり、エスケープ処理はmagic_quotesだけに頼って安全ではありませんよね? お手間をおかけしますが、また宜しくお願いします。

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

関連するQ&A

  • mysqlからphpに表示ですべての項目を出したい

    phpとmysqlの勉強をしているのですが、出したい項目がでてきてくれません。 今mysqlでidとnameとpriceの項目を作っているのですが、以下だとどうしてもnameしか出てきてくれません。 どうすれば3つの項目がでてくれますでしょうか? よろしくお願いします。 <?     mysql_connect('localhost' , 'root' , '') or die(mysql_error());     mysql_select_db('db1'); mysql_query('SET NAMES UTF8'); $sql="SELECT * FROM syouhin"; $res=mysql_query($sql); $options=""; while($row = mysql_fetch_array($res,MYSQL_ASSOC)){ $options.="<input type=\"radio\" name=\"syouhin1\" value='{$row['id']}' checked>        {$row['name']}\n<br>"; } $select="{$options}</select>\n";     print $select; ?>

    • ベストアンサー
    • PHP
  • PHP phpMyAdmin

    hetemlのmysqlを利用しているのですが phpからmysqlへの格納が上手くいきません。 ■phpソース <?php $link = mysql_connect('サーバー名','ユーザー名','パスワード'); mysql_select_db('データベース名'); mysql_query("INSERT INTO myname VALUES ('test')"); echo mysql_errno($link); echo mysql_error($link); ?> ■phpMyAdmin テーブル myname を作成済 phpはエラーを出していないのですが テーブル myname のフィールドに test が格納されません。(変化ありません)

    • 締切済み
    • PHP
  • PHP javascript の関係に関して

    現在、MySQLよりPHPを用いてデータを取得し、PHPのある変数にデータを格納しています。 その結果を、javascriptの中でデータとして使用したいと考えていますが、そもそもPHPで格納されている変数をjavascriptの中で使用する事は可能なのでしょうか。。。 //例ですが、   $sql = "select aaa from AAA"; if (!mysql_select_db('db', $con)) { echo 'Could not select database'; exit; } mysql_query("set names sjis"); $result = mysql_query($sql,$con); $row = mysql_num_rows($result); $count = 1; for($i=0;$i<$row;$i++) { $array = mysql_fetch_array($result); $tmp_aaa[$count] = $array[0]; $count++; } <script type="text/javascript"> <!-- msgtxt = new Array(); for (i=0; i<3; i++){ msgtxt[i] = new Array(); } $count = 0; for($i=0;$i<$row_naiyou;$i++) { $msgtxt[$count] = $tmp_aaa[$count]; $count++; } というような形です。 javascript自体、php> ?>の中に囲まれていれば問題ないのでしょうか? 初歩的な質問で申し訳ありませんが、教えて下さい。

    • 締切済み
    • PHP
  • PHP preg_match_all関数の配列をMysqlに格納したい

    PHP preg_match_all関数の配列をMysqlに格納したい PHP初心者です。 preg_march_all関数を使って正規表現でマッチングする練習を行っています。 preg_march_allを使った場合、マッチングした結果が多次元配列となって出力されると思うのですが、それらをそれぞれのレコードに分けてMysqlに格納したいと思っています。 php入門サイトのものを弄って作ったのですが、 while (! feof($fp)) { $s = fgets($fp); $n = preg_match_all($Pattern, $s, $ar, PREG_SET_ORDER); for ($i = 0; $i < $n; $i++) mysql_query("insert into seikihyougen1 (benri) value ('$ar[$i][2]')"); } 結果はマッチングした数のレコード分、benriカラムにArray[2]という文字列が入力されてしまいます。 これらをマッチングした文字列に直してMysqlに入れるにはどうすればよいのでしょうか?

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

    毎回お世話になっております。あの今phpmy-adminで作成したデータベースにphpでつなげました。ユーザがウェブページ上で入力したものを保存してテーブルのそれぞれのレコードを表示させました。そこのページに”削除”というボタンを押すとテーブルからそのレコードだけを消せるようにしたいのですがどのようにすれば良いでしょうか?下のようなものを考えたのですが失敗してテーブルに含まれる全てのレコードを間違って消してしまいました。すみませんがよろしくお願いします。 2つテーブルがあり、entries とcommentsテーブルのフィールドはこのようになっております。 entries entry_id title entry entered_timestamp comments comment_id commentor_name commenter_email comment timestamp <html> <body> <form action="<?php echo $_SERVER["PHP_SELF"]; ?>" method="post"> <?php require_once("connect.php"); $booDelete = 0; $dbRecords = mysql_query("SELECT* FROM entries", $dbLocalhost) or die("Problem reading table: " .mysql_error()); while ($arrRecords = mysql_fetch_row($dbRecords)) { echo "<p>" .$arrRecords[0] ." "; echo $arrRecords[1] . ""; echo $arrRecords[2] . ""; echo $arrRecords[3] ."</p>"; echo "<INPUT type ='submit' value ='Delete' name='submit'>"; } if (isset($_POST["submit"])) { $dbRecordDelete = mysql_query("DELETE FROM entries WHERE entry_id = entry_id", $dbLocalhost); } ?> <form> </body> </html>

    • ベストアンサー
    • PHP
  • MySQL 文字化けについて(PHP)

    いつもお世話になっております。 PHPを使用してMySQLからデータを出し入れする際に文字化けが発生し原因がわからず、大変困っております。 MySQL 4.1.18(クライアント 4.1.21) MySQL文字セット UTF-8 Unicode (utf8) 様々なHPを検索して、下記のような一文を入れれば大丈夫と思ったのですが、それでも文字化けは改善されませんでした。 mysql_query("SET NAMES ujis"); 上記文はmysql_connectの直後に記述しております。 INSERT文、SELECT文どちらに不備があるのかわかりません。 ご教授お願い致します。 記述プログラム:(INSERT文) /********************************* * MySQL接続 ********************************/ // DB Connect $db = db_connect(); // DB Select select_db($db); // Set Names mysql_query("SET NAMES ujis"); /********************************* * INSERT文 ********************************/ $sql = "insert into T_YOYAKU values ('1','A','1','あいうえお')"; mysql_query($sql) 省略・・・ 記述プログラム:(SELECT文) /********************************* * MySQL接続 ********************************/ // DB Connect $db = db_connect(); // DB Select select_db($db); // Set Names mysql_query("SET NAMES ujis"); /********************************* * INSERT文 ********************************/ $sql = "select * from T_YOYAKU"; if ( $rs = mysql_query($sql) ) {

    • ベストアンサー
    • MySQL
  • phpでデーターベース編集

    phpを独学し始めた初心者です。 よろしくお願いします。 以下のphpファイルを実行すると エラーが出ないにもかかわらず、 データーベースの表示で確認すると 『item_name』に『もも』という文字が入っていません。 その他はphp通りデーターが挿入されます。 なぜでしょうか? (環境)------------------------------------- phpエディターでphpファイルをつくり phpMyAdminでデーターベースを編集してます。 ローカルホストです。 --------------------------------------------- <?php mysql_connect('localhost', 'root', '') or die(mysql_error()); mysql_select_db('mydb') or die(mysql_error()); mysql_query('SET NAMES UTF8'); mysql_query ('INSERT INTO my_items SET maker_id=1, item_name="もも", price=480, keyword="缶詰,ピンク,甘い", sales=0, created="2010-10-10", modified="2012-05-05"') or die(mysql_error()); echo 'データー挿入完了'; ?> どうぞよろしくお願いします。

  • データーベースのすべての画像を取り出したい

    データーベースのテーブル内の画像をすべて取り出すプログラムを書いています。 データベース(Mysql)には画像が4列(4個)存在しますがプログラムの書き方が悪いと思うのですが、1つしか画像を取り出すことができません。 すべて取り出すにはどこを直せばよいでしょうか? 書いたソースは以下になります。 たぶん$img_db=$row["img_data"]; echo $img_db;が原因のような気がしますが分かりません。 詳しい方教えてください。 <display.php>(データーベースから読み込みようphp) <?php $conn=mysql_connect("localhost","root",""); mysql_select_db("practice"); $result = mysql_query("select img_data from sample "); while($row= mysql_fetch_array($result)){ $img_db=$row["img_data"]; echo $img_db; } ?> <output.php>(ブラウザ表示用php) <html> <head> <meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8”> <title>画像表示</title> </head> <body> <p>MySQLのBLOBにバイナリで格納した画像を表示してみます。</p> <?php echo "<img src=\"display.php?$img_db\">" ?> </body> </html>

    • ベストアンサー
    • PHP
  • phpのmysql_fetch_arrayに該当する関数はありますか?

    以下のようなphp、MySQLのセレクト文は perlだとどのようになるのでしょうか? $sql="SELECT abc,xyz FROM table "; $res=mysql_query($sql,$con) or die("データベースを検索できませんでした。 mysql_error(); "); $i=0; while($row=mysql_fetch_array($res)) { $abc[$i]=$row['abc']; $xyz[$i]=$row['xyz']; $i++; }

    • ベストアンサー
    • Perl
  • PHP・MySQL・javascriptを用いたセレクトボックスによる絞込み検索

    はじめまして!現在PHPを勉強し始めた初心者なのですが、PHP・MySQL・javascriptを用いて、検索機能を実現させたいと思い思考錯誤しているのですが、やりたいことができず、困っております。 やりたいことというのは、MySQLに商品テーブルが存在し、材質やサイズなどのフィールドをいくつか設けているのですが、セレクトボックスを5つ配置し、それぞれのセレクトボックスを選んでいくと他のセレクトボックスが連動して絞り込まれていき、5つ全て選んだ時に1つの商品がヒットするというものを作りたいのです。 一つ目のセレクトボックスからポストされた値を次のセレクトボックスのクエリのwhere句の条件として絞り込んで二つ目を表示させることはできたのですが、三つ目以降どうしていいかわかりません>< 初心者なので、詳しく解説して頂ければ幸いです。 どうか宜しくお願いいたします。 現在製作中のソースですは下記をご参照下さい。 <?php //MySQLクラスファイルの取り込み require_once("mysql.php"); //MySQLクラスファイルの取り込み $mysql = new MySQL; //ポストされた値を変数に格納 $category = $_POST["category"]; $syo_code = $_POST["syo_code"]; ?> <html> <head> <body> <form action="jon2.php" method="post"> <!--jon2.phpは現在のページの名前です--> <select name="category" onChange="this.form.submit()"> <option value="">-------------</option> <? $query = "select * from category"; $result = $mysql->query($query); while ($rows = $mysql->fetch($result)) { ?> <option value="<?=$rows["category_id"]?>"><?=$rows["category"]?></option> <? }//while終わり ?> </select><br /> <select name="syo_code"> <option value="">-------------</option> <? $query = "select syo_code from syohin where category_id=$category"; $result = $mysql->query($query); while ($rows = $mysql->fetch($result)) { ?> <option value="<?=$rows["syo_code"]?>"><?=$rows["syo_code"]?></option> <? }//while終わり ?> </select> </body> </head> </html>

    • 締切済み
    • PHP
このQ&Aのポイント
  • 都城市には「がね」という郷土料理があります。これは、イモ、ニンジン、ニラを使った料理です。どんな味なのでしょうか?
  • 「がね」は、都城市の特産品であり、地元の人々に親しまれています。食事の時に出るものであり、主にごはんと一緒に食べられます。
  • 「がね」は、イモの甘みとニンジン、ニラの風味が絶妙に組み合わさった味わいです。ほんのりとした甘さと野菜の風味が広がり、食欲をそそります。
回答を見る