2013-08-28 2 views
0

Я пытаюсь сделать свой запрос PDO динамическим, выполнив некоторые логические операции перед созданием моего запроса.PHP Заменить кавычки, окружающие строку

Однако, когда запрос в настоящее время не создан, результаты не возвращаются, потому что имя столбца, на которое я ссылаюсь в окружении в цитатах (по крайней мере, я считаю, что это проблема), как я могу удалить кавычки, окружающие мою строку?

Логическая операция & Query

 // 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, либо массив в исполнении. – 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 правила:

  • Включить идентификатор в обратные ссылки.
  • Побег backticks внутри, удвоив их.

После такого форматирования можно вставить переменную $ table в запрос. Таким образом, код будет следующим:

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

Thankyou! Я постараюсь, чтобы эта работа с вашими отзывами была высоко оценена. – Alex

+0

Могу ли я спросить, почему: pType теперь окружен кавычками? Это стандартный формат PDO или он является необязательным? – Alex

+0

просто ошибка копирования-пасты. не должно быть никаких котировок вообще –

0

Нет, цитаты на самом деле не проблема. Проблема в том, что вы не можете связывать любые структурные элементы как имена столбцов или таблиц. Вы можете связывать только значениями. Вам нужно будет использовать добрую старую конкатенацию строк/sprintf, если вам нужно динамически изменять имена столбцов.

+1

И сделайте обширную проверку! – eyelidlessness

+0

... или, по крайней мере, белый список. – deceze

+0

Ahh Я вижу, спасибо за ваш ответ! Я попробую решение) – Alex

Смежные вопросы