queryとparamについての説明

このQ&Aのポイント
  • queryとparamについての説明
  • execute_query関数はPDO、SQL文、$paramを利用してプリペアドステートメントを実行する
  • execute_query関数は更新に失敗した場合にエラーメッセージを表示する
回答を見る
  • ベストアンサー

queryとparam

下記のexecute_query関数はどのような処理を行う関数ですか? $paramの意味が分からないです。 // PDO、SQL文、$paramを利用してプリペアドステートメントを実行する function execute_query($db, $sql, $params = array()){ try{ $statement = $db->prepare($sql); return $statement->execute($params); }catch(PDOException $e){ set_error('更新に失敗しました。'); } return false; } // 添え字が '__error' のものをさらに配列として(二次元配列)要素を追加して変数 $errorの内容とする // $_SESSION['__error'] を配列として、エラー内容[]を追加している //(要素数が 0でなければ何らかのエラーがあって、その内容が記録されている) function set_error($error){ $_SESSION['__errors'][] = $error; }

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

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

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

> executeメソッドを引数なしで使う場合と、引数として配列を入れる場合の違いは何ですか? prepareで渡したSQL文の一部がメタ文字になっていて値を別途与える必要がある場合はexecuteでパラメータを渡します。 prepareで渡したSQL文が値を別途与える必要が無ければexecuteは引数無しになります。 例えば "SELECT * FROM hoge WHERE ID=?" と言うSQL文なら、検索条件のIDの値は後からパラメータで渡す前提のSQL文ですからexecuteでパラメータを渡す必要があります。 しかし "SELECT * FROM hoge WHERE ID=1" と言うSQL文なら、検索条件のIDの値は決め打ちで入っているのでexecuteは引数無しになります。

OBAKEI
質問者

お礼

解決しました。回答ありがとうございます。

その他の回答 (1)

  • t_ohta
  • ベストアンサー率38% (5077/13265)
回答No.1

execute_query() はDB接続インスタンス($db)とSQL文($sql)、SQL文の中に代入する値($params)を受け取り、SQL文を実行して成功したら実行結果のインスタンスを返し、失敗したらset_error()関数を実行しFALSEを返しています。 prepare関数を使ってSQL文を実行するようになっているので、SQL文内のメタ文字を実際の値に変換して実行するために$paramsで値を指定しています。

OBAKEI
質問者

補足

回答ありがとうございます。executeメソッドを引数なしで使う場合と、引数として配列を入れる場合の違いは何ですか?

関連するQ&A

  • mysql_queryがある場所について

    ZendFramework-1.11.7を使用しています。 Zend_DbでPdo_Mysqlで接続して利用しています。 そこで、クエリを実際に実行している箇所を探しているのですが、 ソースの中にmysql_queryが見つからないのです・・・ PHPとかでSQLを発行したい場合にはmysql_queryでやるんですよね?? ┬ Zend │└ Db │ ├ Statement.php ファイルには public function execute(array $params = null) { /* * Simple case - no query profiler to manage. */ if ($this->_queryId === null) { return $this->_execute($params); } があるのですが、これは $this->_execute($params); を実行していて ┬ Zend │└ Db │ ├ Statement │ │ ├ Pdo.php ファイルには public function _execute(array $params = null) { try { if ($params !== null) { return $this->_stmt->execute($params); } else { return $this->_stmt->execute(); } があるのですが、これは $this->_stmt->execute(); を実行しているようなのです。 なんか行ったり来たり(^^;)していて最終的にどこでSQLを発行(mysql_queryを実行)しているのかが フォルダ全体を文字列検索しても見つからないのです・・・ _stmtが何のオブジェクトなのかが定かではないので、追跡しづらいのかもしれませんが、 どこでSQLを発行しているのか教えて頂けないでしょうか?

    • ベストアンサー
    • PHP
  • SQLインジェクション対策

    SQLインジェクション対策として、変数を直接SQLに埋め込むのではなく、PDOのprepareメソッドを利用して作成したステートメントに値をバインドする形式にする場合、ユーザー定義関数をどのように 修正すればいいですか? function update_item_stock($db, $item_id, $stock){ $sql = " UPDATE items SET stock = {$stock} WHERE item_id = {$item_id} LIMIT 1"; return execute_query($db, $sql); } function execute_query($db, $sql, $params = array()){ try{ $stmt = $db->prepare($sql); return $stmt->execute($params); }catch(PDOException $e){ set_error('更新に失敗しました。'); } return false; } 上記のユーザー定義関数を下記のようにbindValueを用いて表す場合、$stmt->bindValueの部分を 上記のどこに追加すればいいですか? try { $sql = 'UPDATE item_stock SET stock = ?, update_date = ? WHERE item_id = ?'; $stmt = $db->prepare($sql); $stmt->bindValue(1, $update_stock, PDO::PARAM_INT); $stmt->bindValue(2, $date, PDO::PARAM_STR); $stmt->bindValue(3, $item_id, PDO::PARAM_INT); $stmt->execute(); $complete_msg[] = '在庫変更に成功しました。'; } catch (PDOException $e) { $err_msg[] = '更新に失敗しました。理由:' . $e->getMessage(); }

    • 締切済み
    • PHP
  • メソッドの処理の意味

    PHP Version 5.3.1を使用しています。 Zend Frameworkというフレームワークを使用しているのですが、 http://manual.zfdes.com/ja/zend.db.profiler.html http://ideone.com/JekM0d ┬ Zend │└ Db │ ├ Profiler │ │└ Query.php Query.phpというファイルのクラスZend_Db_Profiler_Query内のbindParamsメソッド /** * @param array $param * @return void */ public function bindParams(array $params) { if (array_key_exists(0, $params)) { array_unshift($params, null); unset($params[0]); } foreach ($params as $param => $value) { $this->bindParam($param, $value); } } の if (array_key_exists(0, $params)) { array_unshift($params, null); unset($params[0]); } この部分は具体的に何をしている処理なのでしょうか? 配列内に数値の0があるかを調べて、 存在したらunshiftで先頭にnullを挿入する。 でもunsetでその挿入した行(インデックスが0なので)を削除する。 というふうに自分は解釈しているのですが、もしそれだと array_unshiftでnullの行を挿入する意味が分かりません・・・ そもそもなぜarray_key_existsで0があるかを調べる必要があるのでしょうか? できればこのメソッドの具体的な使用も含めてアドバイス頂けないでしょうか?

    • 締切済み
    • PHP
  • php execute関数

    おしえてください。 Functionの戻りで以下のreturn文があります。 $sqlの変数には実行するSQL文が格納されます。 $sqlParamは配列変数です。 どのような結果を返すのか分かりません。 return $conn -> Execute ($sql, $sqlParam); 多分Execute関数というものがあると思うのですが、 第2引数の配列変数を使ってどのような結果を返すのかが分からないです。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 別ファイルのfunction

    別ファイルのfunctionを使いたいのですが3つのfunctionのうちsql()しかつかえません。 まだ作成とちゅうでfunctonがつかえるかの確認中です。共通でつかいたいのできた画面によって表示する項目をかえるためにテンプレートで制御してます。sqlから配列を作ってpagerでリスト表示しようとしてます。 sakusei.php <? //sql作成 function sql(){ $sql = "select * from shop_t where point=4"; $sql = $sql." order by id asc"; return $sql; } //配列作成 function hairetu(){ $list_data[] = array( "id"=>$row["id"], "name"=>$row["name"], "address"=>$row["address"], "tel"=>$row["tel"], "point"=>$row["point"], "a1"=>$row["a1"]); return $data; } //テンプレート選択 function tmple(){ $tpl="./sample.tpl"; return $tpl; } ?> sample.php <?php session_start(); require_once("sakusei.php"); @ini_set('include_path', './includes/Smarty'.PATH_SEPARATOR.ini_get('include_path')); @ini_set('include_path', './includes/'.PATH_SEPARATOR.ini_get('include_path')); require_once("DB.php"); require_once("Pager/Pager.php"); require_once("Smarty/libs/Smarty.class.php"); //新しい画面からきたときの処理 if(isset($_POST[db])){ session_unset(); } if(isset($_SESSION["db"])){ } else { $_SESSION["db"]=$_POST[db]; } if(isset($_SESSION["basyo"])){ } else { $_SESSION["basyo"]=$_POST[basyo]; } //データベースからデータを取得する $datasource = "mysql://root:@localhost/".$_SESSION["db"]; print"$datasource"; $db = DB::connect($datasource ); mysql_query("SET NAMES UTF8"); $basyo=$_SESSION["basyo"]; $sql=sql(); if($_SESSION["sql"]==""){ $_SESSION["sql"]=$sql; } print $_SESSION["sql"]; //クエリ作成 $res = $db->query($_SESSION["sql"]); //データを配列に格納 $list_data=new hairetu();  ←※エラー行 while ($row = $res->fetchRow( DB_FETCHMODE_ASSOC )) { $data_list } //データベース後処理 $res->free(); $db->disconnect(); //Pagerへのデータ割り当て処理 $perPage=3; $params=array("perPage"=>$perPage, "itemData"=>$data_list, "delta"=>5, "altFirst"=>"First", 'firstPageText' => '最初', 'altFirst' => '最初', 'lastPageText' => '最後', 'altLast' => '最後', ); $o_page=Pager::factory($params); foreach($o_page->getPageData() as $item){ $data_list_for_page[]=$item; } //Smartyへの割付処理 $smarty=new Smarty; $smarty->template_dir = "./templates"; $smarty->compile_dir = "./templates_c"; //$smarty->cache_dir = "./cache"; $smarty->assign("list", $data_list_for_page); $navi=$o_page->getLinks(); $smarty->assign("pageNavi", $navi['first'].$navi['all'].$navi['last']); //テンプレート表示 $tql=new tmple();  ←※エラー行 print $tql; $smarty->display("$tpl"); ?> Fatal error: Class 'hairetu' not found in D:\xampp\htdocs\rei\pager\sample.php on line~ Fatal error: Class 'tmple' not found in D:\xampp\htdocs\rei\pager\sample.php on line~ がエラーになります。。よろしくお願いします。。

    • 締切済み
    • PHP
  • PDOのprepareの使い方が正しいのか教えてください

    1つのレコードに入った二つのデータを反映させようと思ってますが、 prepareの使い方を教えてください。 持っている参考書があまり参考にならず困っているのですが、 prepareを使った再利用のやり方として、下記の方法は正しいでしょうか? $sql = "INSERT INTO $table (name,birth) VALUES(:name,:birth);"; $statement = $dbh->prepare($sql); $rtn = $statement->execute(array('太郎','2000/01/01')); $rtn = $statement->execute(array('花子','2000/10/31')); 一応、DBにデータの追加はでてきますが、 検索すると、 $statement->bindValue(':name',$name,PDO::PARAM_INT); を使ったやり方がたくさん出てきていて、 何が正しいやり方なのかよくわかりません。 宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • PHPで ”Call to a member function bind_param() ”が出る・・・

    PHPでアンケートサイトを作ろうとしていて、下のようなエラーが出て、どうしても前に進めません。 Fatal error: Call to a member function bind_param() on a non-object in /home/・・・・/aaa.php on line 5 サーバはロリポップを使っており、PHPはver.5.2.6 、SQLはバージョン4.0.24です。 ソースは以下のようになっています。 <?php require_once("DB.php"); $db=DB::connect("mysql://ユーザID:PASS@サーバ名/DB名"); $stt=$db->prepare("SELECT Title FROM master WHERE id=?"); $stt->bind_param("s",$_GET['id']); $stt->bind_result($Title); $stt->execute(); if($stt->fetch()!==TRUE){ print("登録されていません"); exit(1); } else{ 以下略 何が悪いのでしょうか?

    • ベストアンサー
    • PHP
  • クエリーの作り方

    SQLから、Postgres上のデータを参照しています。 まず、この形式で取り出そうとしています。 $query = 'select * from comment where oya = ■■'; この、■■のところには整数が入りますが、 事前にアレイに入れてある数字「 $DB_data[0] 」から、 whileでぐるぐる回して検索したいのですが、 こうすると、エラーになります。 $query = 'select * from comment where oya = $DB_data[0]'; エラー Query failed: ERROR: syntax error at or near "$" at character 何か良い手はないでしょうか? 別のテーブルの数値を持ってきて、$を使わずに検索できれば・・ こういうのも可能でしょうか・・?

    • ベストアンサー
    • PHP
  • 初心者ですがよろしくお願いします。

    初心者ですがよろしくお願いします。 サーバー設置後、下記のようなエラーがでます。 どのようなエラーの可能性がありますか? どなたか教えていただけないでしょうか? Fatal error: Call to undefined method DB_Error::fetchRow() in /home/OOOO/www/OOOO/check.php on line 41 // ログイン認証実施 $sth = $conn->prepare($sql); $rs = $conn->execute($sth, array($get_name,$get_pass)); // SQL実行時エラー判定 if (!$rs) exit('Err:Execute Query error'); // レコードの取得 $row = $rs->fetchRow(DB_FETCHMODE_ASSOC); // 認証成功時 if ($row) { // セッション初期化 //session_destroy(); // セッションにショップIDをセット $_SESSION['shop_id'] = $row['SHOP_ID']; $_SESSION['name'] = $get_name; $_SESSION['pass'] = get_pass; // セッションクローズ session_write_close();

  • クエリファイルから外部のクエリファイルを実行する方法

    SQL Server2000です。 DB構築を行うにあたり、インストールで実行するクエリファイルから、 別のクエリファイル(実際にテーブル、ストアドを構築する内容を記述)を実行できる方法がわからず悩んでいます。 a.sql・・・b.sqlやc.sqlを統括するクエリファイル b.sql、c.sql・・・テーブル構成、ストアドを構築するクエリファイル SQL クエリアナライザからa.sqlのクエリファイルを開いて、 クエリ実行するイメージでいます。 a.sqlからb.sqlを呼び出すには、どのような記述をすればよろしいのでしょうか? よろしくお願いします。

専門家に質問してみよう