2011-03-03 174 views
0

我修改這個代碼的地方,但我不知道如果我做正確,PDO:我可以避免bindParam嗎?

我用的方法將數據插入到數據庫中,

# insert or update data 
    public function query($query, $params=array()) 
    { 
     try 
     { 
      $stmt = $this->connection->prepare($query); 
      $params = is_array($params) ? $params : array($params); 
      $stmt->execute($params); 
      return true; 
     } 
     catch (PDOException $e) 
     { 
      # call the get_error function 
      $this->get_error($e); 
     } 
    } 

然後,我只需要調用它,

$sql = " 
    INSERT root_countries_cities_towns (
     tcc_names, 
     cny_numberic, 
     tcc_created 
    )VALUES(
     ?, 
     ?, 
     NOW() 
    )"; 

$pdo->query($sql,array('UK','000')); 

它工作得很好!但我不明白這條線是什麼 - 有人可以解釋一下嗎?

$params = is_array($params) ? $params : array($params); 

我想我必須使用bindParam先綁定參數,但似乎我不;噸必須再與被法 - 是其安全然後

這是否意味着我不必再以這種方式準備查詢了?

$sql = " 
     INSERT root_countries_cities_towns (
      tcc_names, 
      cny_numberic, 
      tcc_created 
     )VALUES(
      :name, 
      :numberic, 
      NOW() 
     )"; 

忘記這個綁定?

$stmt = bindParam(':name','UK', PDO::PARAM_STR); 
$stmt = bindParam(':numberic','000', PDO::PARAM_STR); 

謝謝。

回答

3

我想這是非常多的PHP語法問題,而不是PDO之一。

$params = is_array($params) ? $params : array($params); 

if (is_array($params)) { 
    $params = $params; 
} else { 
    $params = array($params); 
} 

一個肖特蘭(稱爲三元運算符)),我寧願這樣寫道

if (!is_array($params)) $params = array($params); 

這是不言自明,可以閱讀幾乎用簡單的英文:

如果$ params爲不是一個數組,讓我們把它與數組前$ PARAMS

這就是爲什麼我恨三元操作符(和lambda表達式),總是避免它的使用的一個值。它使得可讀代碼變得混亂。只是程序員的懶惰。

爲了回答您的其他問題,

它意味着我不必再準備以這種方式查詢?

誰說的?你正在準備好代碼,再次檢查它。

忘了這個綁定?

這是真的。 execute($params)只是綁定變量的另一種方法。

+1

在你離開大括號的同一個地方做關於「程序員懶惰」的陳述(除非使用替代控制結構語法,否則沒有任何藉口/如果():endif;)有點虛僞,如果你問我。 – Stephen 2011-03-03 13:25:20

+0

@Stephen很好,你說得對,「懶惰」對此並不合適。 「虛假的效率感」可能是。他們想寫簡潔但不關心可讀性 – 2011-03-03 14:17:24

1

第一個示例將$params的內容轉換爲數組(如果它不是數組的話)(例如,如果只傳遞一個參數並將其作爲單個項傳遞,而不是作爲長度爲1的數組傳遞)。

這兩個示例的工作方式也是一樣,只是第一個示例中引入的參數與$params數組一起被注入,其中?在SQL查詢中找到,而第二個參數的格式化實際上已完成按名稱(您可以將在sql中找到的參數名稱綁定到實際參數)。

你應該使用第一個,它更容易編寫。

+1

您也可以將關聯數組傳遞給'PDOStatement :: execute()'以將值綁定到指定的佔位符 – Phil 2011-03-03 04:14:12

0

傳遞數組到PDOStatement::execute()使用默認值(綁定類型等)將數組中的每個條目傳遞給PDOStatement::bindParam()(或可能是bindValues())。

基本上,它和預先綁定一樣安全。

使用bindParam的優點是它綁定到變量引用。這意味着您可以在不重新綁定的情況下更改變量的值,並用新值執行語句。這是在一個循環中特別有用,例如

$vals = array('foo', 'bar', 'baz'); 
$stmt->bindParam(1, $val); 
foreach ($vals as $val) { 
    $stmt->execute(); // Executes once for each value in $vals 
} 

我不明白這是什麼線做 - 可以有人解釋嗎?

該行將非數組轉換爲數組。

例如

$params = 'foo'; 
$params = is_array($params) ? $params : array($params); 
$params == array('foo'); 

我想這是方便,你只能有一個佔位符和一個值綁定爲PDOStatement::execute()只能傳遞一個數組的情況。

+0

謝謝。我可以問一下'$ stmt-> bindParam(1,$ val);'中1的數字的含義嗎? – laukok 2011-03-03 14:01:14

+0

@lauthiamkok最好閱讀['bindParam()']手冊頁(http://www.php.net/manual/en/pdostatement.bindparam.php) - *參數標識符。對於使用命名佔位符的預準備語句,這將是表單的參數名稱:name。對於使用問號佔位符的準備好的語句,這將是參數的1索引位置。* – Phil 2011-03-03 22:21:36

+0

感謝Phil :-) – laukok 2011-03-05 13:03:22

3

$params = is_array($params) ? $params : array($params); 

被簡單地檢查是否到$ params變量是一個數組,並且如果是這樣,它創建與原始$ PARAMS值作爲其唯一的元件的陣列,並且該陣列分配給$ PARAMS。

這將允許您向查詢方法或變量數組提供單個變量(如果查詢具有多個佔位符)。

它不使用bindParam的原因是因爲值正在傳遞給execute()方法。隨着PDO您有可用於將數據綁定到佔位符多種方法:

  • bindParam
  • bindValue
  • 執行($值)

的bindParam方法的最大優點是,如果你循環對於一組數據,您可以調用bindParam一次,將佔位符綁定到特定的變量名稱(即使該變量尚未定義),並且每次執行語句時它都會獲取指定變量的當前值。

-2

試試這個課程。我大量使用PDO,這就是我一直使用我的項目的時間。 PHP PDO Class on GitHub

+1

如果您問我,將不會提供真正的幫助。此外,魔術方法被稱爲__construct和__destruct,而不是__constructor和__destructor – Stephen 2011-03-03 13:30:27

+0

感謝你,Wrenbjor! – laukok 2011-03-03 13:50:15

+0

@Stephen修復了魔法問題,謝謝指出這個bug。對不起,它並不適用於其他方面。我一直將SQL傳遞給了Binding,而且我沒有任何問題。 – Wrenbjor 2011-03-04 05:25:05