2013-03-01 95 views
3

SOLUTION帶有bindParam和bindValue的PHP PDO?

更改此:

foreach($fields as $dbfield => $field) { 
    $value = isset($_POST[$field]) ? 1 : 0; 
    $STH -> bindParam(':' . $dbfield, $value, PDO::PARAM_INT, 1); 
} 

這樣:

foreach($fields as $dbfield => $field) { 
    $value = isset($_POST[$field]) ? 1 : 0; 
    $STH -> bindValue(':' . $dbfield, $value, PDO::PARAM_INT); 
} 

問題

我有FOLL由於代碼,不給任何錯誤,但它不會做什麼,我需要它做的事:

PHP

$fields = array(
    'db_col_1' => 'cb_1', 
    'db_col_2' => 'cb_2', 
    'db_col_3' => 'cb_3' 
); 

$parts = array(); 

foreach($fields as $dbfield => $field){ 
    $parts[] = '`' . $dbfield . '` = :' . $dbfield; 
} 

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

//temp id 
$id = 1; 

$STH = $DBH -> prepare('UPDATE `table1` SET ' . join(', ', $parts) . ' WHERE `id`= :id'); 

$STH -> bindParam(':id', $id, PDO::PARAM_INT, 10); 

foreach($fields as $dbfield => $field) { 
    $value = isset($_POST[$field]) ? 1 : 0; 
    $STH -> bindParam(':' . $dbfield, $value, PDO::PARAM_INT, 1); 
} 

$STH -> execute(); 

HTML

<input id="cb_1" name="cb_1" type="checkbox" value="cb_1" /> 
<br /> 
<input id="cb_2" name="cb_2" type="checkbox" value="cb_2" /> 
<br /> 
<input id="cb_3" name="cb_3" type="checkbox" value="cb_3" /> 

數據庫去更新,但如果我檢查複選框如下:

示例複選框STATES

cb_1 = 1 
cb_2 = 1 
cb_3 = 0 

在db每一列得到0

如果我選中複選框如下:

樣品複選框STATES

cb_1 = 0 
cb_2 = 0 
cb_3 = 1 

在db每一列得到1

任何人都知道如何解決這個問題?

難道是因爲bindParam結合實際的可變$value(通過引用),我認爲,通過循環結束,具有基於$_POST['cb_3']一個值的時間?我想我應該使用bindValue?但不知道如何..我檢查了文檔,但發現它令人困惑。

+0

[標籤維基](http://stackoverflow.com/tags/pdo/info)在這個問題上包含一個建議 – 2013-03-01 09:27:17

+1

我想你應該在問這裏之前試過'bindValue()'。 – Voitcus 2013-03-01 09:33:31

回答

13

PDOStatement::bindParam()是一種告訴PDO的方法:「當您稍後執行此語句時,請閱讀此變量的值»。這意味着當致電$STH -> execute()$value必須存在並且必須保持其原始值。

由於您使用的是這樣:

foreach($fields as $dbfield => $field) { 
    $value = isset($_POST[$field]) ? 1 : 0; 
    $STH -> bindParam(':' . $dbfield, $value, PDO::PARAM_INT, 1); 
} 

... $value被覆蓋在每個循環迭代和你的價值觀迷失。 (只有最後一個仍然存在。)

您需要使用PDOStatement::bindValue()這意味着:「存儲此值並在以後執行語句時使用它」。這樣,變量就不再需要了。

+6

@DownVoter - 小心解釋爲什麼這個答案沒有用,所以我們都可以向你學習? – 2013-03-01 09:34:55

+1

我用捱打的方式說下來:/謝謝你的解釋。 – Coldblackice 2013-07-17 19:26:35