0

クエリを作成する前にいくつかの論理操作を実行して、PDO クエリを動的にしようとしています。

ただし、クエリが現在構築されている場合、参照している列名が引用符で囲まれているため、結果が返されません (少なくともこれが問題だと思います)。文字列を囲む引用符を削除するにはどうすればよいですか?

論理演算とクエリ

       // Logical comparison
       if($psiA >= $psiB){
            $highestPsi = "high_psi";
       } else {
            $highestPsi = "flow_psi";
       }

       if($gpmA >= $gpmB){
            $highestGpm = "high_gpm";
       } else {
            $highestGpm = "flow_gpm";
       }

       var_dump($highestGpm);
       var_dump($highestPsi);

       // Set up query variables
       if( $pVal <= 0 && $gVal <= 0) {
           $sql = "SELECT * FROM pumps WHERE pump_type = :pType AND :thePsi >= :pVal AND :theGpm >= :gVal AND pump_category = :cVal";
       } else {
           $sql = "SELECT * FROM pumps WHERE pump_type = :pType AND :thePsi >= :pVal AND :theGpm >= :gVal AND pump_category = :cVal";
           var_dump($sql);
       }

        // Build and execute query
       $stmt = $connection->prepare( $sql );

       $stmt->bindParam(':pType', $pType, PDO::PARAM_STR);
       $stmt->bindParam(':pVal', $pVal, PDO::PARAM_STR);
       $stmt->bindParam(':gVal', $gVal, PDO::PARAM_STR);
       $stmt->bindParam(':cVal', $cVal, PDO::PARAM_STR);
       $stmt->bindParam(':thePsi', $highestPsi, PDO::PARAM_STR);
       $stmt->bindParam(':theGpm', $highestGpm, PDO::PARAM_STR);

       $stmt->execute(array( 
                      'pType'   => $pType, 
                      'pVal'    => $pVal, 
                      'gVal'    => $gVal,
                      'cVal'    => $cVal,
                      'thePsi'  => $highestPsi,
                      'theGpm'  => $highestGpm
        ));

ダンプが正しい列名を返していることはわかっています。これを機能させるには、何らかの正規表現を実行して引用符を取り除く必要があると確信しています。

どんなポインタでも大歓迎です。

4

2 に答える 2

1

PDO のプリペアド ステートメントは、データ リテラルのみを表すことができます。したがって、開発者は自分で識別子を処理する必要があります。PDO はこの問題を解決する助けにはなりません。

したがって、safeMysqlなど、PDO の代わりに他のライブラリを使用する必要があります。

$sql = "SELECT * FROM pumps WHERE 
        pump_type = ?s AND ?n >= ?s AND ?n >= ?s AND pump_category = ?s";
$data = $db->getAll($sql, $pType, $highestPsi, $pVal, $highestGpm, $gVal, $cVal);

または、識別子を手動でフォーマットする必要があります。識別子をフォーマットするには、次の 2 つのルールを適用する必要があります。

  • 識別子をバッククォートで囲みます。
  • バッククォートを 2 倍にしてエスケープします。

このようなフォーマットの後、$table 変数をクエリに安全に挿入できます。したがって、コードは次のようになります。

$psi = "`".str_replace("`","``",$highestPsi)."`";
$sql = "SELECT * FROM pumps WHERE pump_type = :pType AND $psi ...";
于 2013-08-28T14:40:02.720 に答える