/** * クエリ文字列処理 * * クエリー文字列を内部変数に格納する。<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; }