2013-08-28 32 views
0

我想通過在構建我的查詢之前運行一些邏輯操作來使我的PDO查詢動態化。PHP替換字符串周圍的引號

但是,當查詢當前內置沒有結果返回,因爲列引用中引用列名(至少我相信這是問題),我將如何去除圍繞我的字符串引號?

邏輯運算&查詢

 // 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 
     )); 

我知道轉儲返回正確的列名,我敢肯定,我需要進行某種形式的正則表達式來剝去引號這個工作。

任何指針將不勝感激。

+1

那麼首先你綁定值兩次。 bindParam或execute中的數組。 – Virus721

+0

你是否將字段名稱綁定爲參數?因爲那不行,只要將它連接到你的查詢字符串中,只要它不是用戶輸入,它的注入安全(除非你做一些愚蠢的事情) – x4rf41

回答

1

PDO的準備語句只能表示數據文字。因此,開發人員必須自己處理標識符--PDO爲此提供無幫助

所以,你必須要麼使用其他庫而不是PDO,如safeMysql

$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條規則:

  • 在反引號中包含標識符。
  • 通過將它們翻倍來逃避反作用力。

在這樣的格式化之後,將$ table變量插入查詢是安全的。所以,代碼將是:

$psi = "`".str_replace("`","``",$highestPsi)."`"; 
$sql = "SELECT * FROM pumps WHERE pump_type = :pType AND $psi ..."; 
+0

謝謝!我將盡力讓您的反饋與您一起工作,非常感謝。 – Alex

+0

我可以查詢原因:pType現在被引號括起來了嗎?這是標準的PDO格式還是可選的? – Alex

+0

只是一個複製粘貼錯誤。應該沒有報價 –

0

不,報價不是真正的問題。問題是你不能綁定像列或表名那樣的任何結構元素。您只能綁定。如果您需要動態更改列名,則必須使用好的舊字符串連接/ sprintf

+1

並且做廣泛的驗證! – eyelidlessness

+0

...或至少列入白名單。 – deceze

+0

啊,我明白了,謝謝你的迴應!我會試試看一個解決方案) – Alex

相關問題