2011-09-30 93 views
2

我有一些古老的代碼,我要轉換爲PDO:使用PDO構建查詢?

<?php 
    function build_query() { 
     // db connection here 

     $the_query = ""; 

     if (empty($_GET['c'])) { 
      $the_query = "select * from table1"; 

      if ((isset($_GET['y'])) && (isset($_GET['m']))) { 
       $the_query .= " where y = " . $_GET['y'] . " and m = " . $_GET['m']; 
      } 
     } elseif (($_GET['c'] == "1") || ($_GET['c'] == "2")) { 
      $the_query = "select * from table1 where GGG = " . $_GET['c']; 

      if ((isset($_GET['y'])) && (isset($_GET['m']))) { 
       $the_query .= " and y = " . $_GET['y'] . " and m = " . $_GET['m']; 
      } 
     } else { 
      $the_query = "select * from table1"; 

      if ((isset($_GET['y'])) && (isset($_GET['m']))) { 
       $the_query .= " where y = " . $_GET['y'] . " and m = " . $_GET['m']; 
      } 

      $the_query .= " and c = " . $_GET['c']; 
     } 

     return // use the query to return results $the_data; 
    } 
?> 

我似乎無法弄清楚如何重新編寫此使用PDO。我做了下面一個開始,但似乎無法得到任何進一步:

<?php 
    function build_query() { 
     $the_data = ""; 

     $DBH = new PDO("mysql:host=server;dbname=database", "user", "pass"); 
     $DBH -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

     $STH = $DBH -> prepare("build query here"); 

     $STH -> bindParam(':c', $_GET['c'], PDO::PARAM_INT); 
     $STH -> bindParam(':y', $_GET['y'], PDO::PARAM_INT); 
     $STH -> bindParam(':m', $_GET['m'], PDO::PARAM_INT); 

     $STH -> execute(); 

     $ROWS = $STH -> fetchAll(); 

      foreach($ROWS as $ROW) { 
      $output .= $ROW["a"] . " - " . $ROW["b"] . " - " . $ROW["c"] . " - " . $ROW["d"] . "<br />"; 
      } 

     $DBH = null; 

     return $output; 
    }  
?> 
+1

你真的連接到預處理語句數據庫每次運行查詢時? –

+0

@Col。據我所知,彈片是的。 – oshirowanen

+0

但爲什麼?有什麼理由呢?僅僅因爲它在教程中? –

回答

2

嗯,這是有準備的語句
相當棘手的(這就是爲什麼我更喜歡我自己釀製的佔位符在準備好的發言)你必須使這個古老的代碼明智的

首先,如果沒有所有當前的混亂。 只檢查一次每個參數。

這裏是一個代碼,給你一個想法

$w = array(); 
if (!empty($_GET['c']) AND ($_GET['c'] == "1") || ($_GET['c'] == "2")) 
{ 
    $w[] = $db->parse("GGG = ?i", $_GET['c']); 
} 
if (isset($_GET['y']) && isset($_GET['m'])) 
{ 
    $w[] = $db->parse("where y = ?i and m = ?i",$_GET['y'],$_GET['m']); 
} 
$where = ''; 
if ($w) $where = implode(' AND ',$w); 
$query = "select * from table1 $where"; 

要利用你有你的值添加到數組,然後用它來與執行()

+0

+1你會不會碰巧與那些自釀的佔位符有關聯? – Johan

+0

那麼,它最近纔可用。 https://github.com/colshrapnel/safemysql如果你仍然很有趣。歡迎您使用並批評它:) –

0

你正在改變你的函數做了很多,它用來做。如果你想堅持原來的設計(這與你的函數的名稱一致),你需要改變你的函數,以便它仍然返回一個查詢,但不會執行它,因爲舊版本沒有連接到一個數據庫或查詢數據庫。

要解決您的問題,您可以讓該函數返回一個包含2個元素的數組,帶有命名參數的查詢以及帶有名稱 - 值對的另一個數組。

如果您確實想要返回查詢結果,則可以爲數據庫連接使用全局變量,或將其作爲變量傳遞給該函數。

+0

你的方式過於謹慎:)'PDO :: PARAM_INT並沒有真正將你的變量轉換爲int' - 它做了什麼? –

+0

@Col。彈片如果我沒有記錯,沒有,但我找不到一個參考,所以我已經刪除它... – jeroen

+0

好吧,它什麼也沒做,所以呢?後果是什麼? –