2011-11-10 7 views
-1

mysqliでプリペアドステートメントを実行しようとしていますが、ステートメントが結果とともに実行されることはなく、エラーもスローされません。しかし、クエリの実行は正常に動作します。Prepared StatementがPHPで動作しません

プリペアドクエリは次のようになります。

SELECT * FROM games WHERE YEARweek(game_date)=? 

通常の非プリペアドクエリは、この

SELECT * FROM games WHERE YEARweek(game_date)= YEARweek(current_DATE) +1 

任意のアイデアなぜですか?

クエリを実行するためのコードが異なる場所にあるが、それは、短いバージョンでは、次のようになります

$WHERE_CLAUSE=''; 
     $first=true; 
     if(isset($conditions['conditions'])) { 
      foreach($conditions['conditions'] as $key=>$condition){ 
        if(is_array($condition)){ 

        } else { 
         if($first) 
          $WHERE_CLAUSE.=$key.'=?'; 
         else 
          $WHERE_CLAUSE.=' AND '.$key.'=?'; 

         $input_data[$key]=$condition; 
         $first=false; 
        } 
      }//end foreach 

      if(!empty($WHERE_CLAUSE)){ 
       $query.='WHERE '.$WHERE_CLAUSE.' '; 
      } 
     } 

     $result=PVDatabase::preparedSelect($query, $input_data); 

public static function preparedQuery($query, $data, $formats = '') { 

    if (self::_hasAdapter(get_class(), __FUNCTION__)) 
     return self::_callAdapter(get_class(), __FUNCTION__, $query, $data, $formats); 

    if (self::$dbtype == self::$mySQLConnection) { 
     self::$link -> prepare($query); 
     $count = 1; 

     foreach ($data as $key => $value) { 
      self::$link -> bindParam($count, $value); 
      $count++; 
     }//end foreach 

     return self::$link -> execute(); 
    } else if (self::$dbtype == self::$postgreSQLConnection) { 
     $result = pg_prepare(self::$link, '', $query); 
     $result = pg_execute(self::$link, '', $data); 
     return $result; 
    } else if (self::$dbtype == self::$oracleConnection) { 

    } else if (self::$dbtype == self::$msSQLConnection) { 
     $stmt = sqlsrv_prepare(self::$link, $query, $data); 
     return sqlsrv_execute($stmt); 
    } 

}//end preparedQuery 
+3

はあなたの文に任意のパラメータをバインドしましたか?おそらく、コードを投稿した方が便利かもしれません。 –

+0

どのように関数を呼び出してクエリを実行しますか? – Catalin

+0

preparedQueryに渡すデータの価値は? –

答えて

4

あなたは、クエリを呼び出すために使用しているコードを提供していないので、私はよおそらく式を含む値をバインドしていると推測します。評価される代わりに、文字通り解釈されます。

+0

コードはありますが、依然としてバインドに使用している値を指定する必要があります。 –

0

PDOは、2番目のクエリのYEARweek(current_DATE)+1部分をエスケープする必要があります。

ではなく、これを実行します。

$next_year = date('Y) + 1; 

SELECT * FROM games WHERE YEARweek(game_date) = $next_year