示例#1
0
 /**
  *  クエリ文字列処理
  *
  *  クエリー文字列を内部変数に格納する。<br />
  *  同時に最適化処理も行う
  *   - スペース、TAB、改行などを除去
  *   - 特殊文字列の処理
  *   - 予約語の置換
  *
  *  @param  array  バインド変数情報
  *  @param  array  クエリ変数値
  */
 protected function setupQuery($pholder, $params)
 {
     // クエリの設定
     $query = $pholder[self::P_HOLDER_STMT];
     foreach ($pholder[self::P_HOLDER_BIND] as $bind) {
         $b_stmt = $bind[self::P_HOLDER_STMT];
         $b_name = $bind[self::P_HOLDER_NAME];
         $b_value = $params[$b_name];
         // 疑問符プレスフォルダに置き換え
         if (preg_match('/^:[a-zA-Z0-9_]+<(.+)>$/', $b_stmt, $maches)) {
             // 行値構成子
             $token = '(' . $maches[1] . ')';
             foreach ($bind[self::P_HOLDER_BIND] as $m_bind) {
                 $m_stmt = $m_bind[self::P_HOLDER_STMT];
                 $m_name = $m_bind[self::P_HOLDER_NAME];
                 $_token = is_array($b_value[0][$m_name]) ? '${1}?' . str_repeat(', ?', count($b_value[0][$m_name]) - 1) : '${1}?';
                 $pattern = sprintf('/(^|[^\\x5c])%s/', preg_quote($m_stmt));
                 $token = preg_replace($pattern, $_token, $token, 1);
             }
             $token .= str_repeat(', ' . $token, count($b_value) - 1);
             $fields = '${1}' . $token;
         } else {
             $fields = '${1}?';
             if (is_array($b_value)) {
                 $fields .= str_repeat(', ?', count($b_value) - 1);
             }
         }
         $pattern = sprintf('/(^|[^\\x5c])%s/', preg_quote($b_stmt));
         $query = preg_replace($pattern, $fields, $query, 1);
     }
     // クエリ条件設定 (最大取得件数)
     if ($this->criteria->limit !== NULL) {
         $query .= ' LIMIT ?';
     }
     // クエリ条件設定 (オフセット)
     if ($this->criteria->offset !== NULL) {
         $query .= ' OFFSET ?';
     }
     // 予約文字を置き換える
     if (strpos($query, '__TABLE_NAME__') !== false) {
         $tbl_name = $this->data_format->getTableName($this->criteria);
         $query = str_replace('__TABLE_NAME__', $tbl_name, $query);
     }
     $query = preg_replace('/\\x5c:/', ':', $query);
     // クエリ登録
     $this->query = $query;
 }
示例#2
0
文件: Cascade.php 项目: gree/cascade
 /**
  *  データフォーマットの動的クエリー取得部分にハンドラーを定義する
  *
  *  @param  callback  コールバック関数
  */
 public static function registerDynamicQueryHandler($callback)
 {
     Cascade_DB_SQL_DataFormat::setExtraStaticProperty(Cascade_DB_DataFormat::EXTRA_STATIC_PROP_DQ_CALLBACK, $callback);
 }