2014-02-12 76 views
1

我有一個數據庫表,有幾個BIT(1)類型的列。如果我忘記準備好的陳述,我可以很容易地做這樣的事情:您如何使用PDO預處理語句和BIT(1)列?

UPDATE tablename SET 
bit_column_1 = b'1', 
bit_column_2 = b'0' 

而且這將工作完美。但是,無論我嘗試使用準備好的語句,該值始終爲'1'。

我也做了以下內容,他們沒有工作,如果$_POST['bit_col']0

$stmt = $dbh->prepare("UPDATE tablename SET 
    bit_col = :bit_col "); 
// First attempt 
$stmt->bindValue('bit_col', $_POST['bit_col']); 
// Second attempt 
$stmt->bindValue('bit_col', $_POST['bit_col'], PDO::PARAM_INT); 
// Third attempt 
$stmt->bindValue('bit_col', "b'{$_POST['bit_col']}'"); 

然後我試圖改變事先準備好的聲明把b那裏,但我得到number of bound variables does not match number of tokens

$stmt = $dbh->prepare("UPDATE tablename SET 
    bit_col = b:bit_col "); 
$stmt->bindValue('bit_col', $_POST['bit_col']); 

$stmt = $dbh->prepare("UPDATE tablename SET 
    bit_col = b':bit_col' "); 
$stmt->bindValue('bit_col', $_POST['bit_col']); 

另外值得一提的是PDO::ATTR_EMULATE_PREPARES設置爲true。將其設置爲false將需要我重構相當多的東西,因爲我無意中管理了數據庫連接。

所以我的問題是,是否有可能在MySQL中使用BIT列的預準備語句,如果是這樣,如何?

+0

你可以試試這個不帶參數
訪問http://計算器.com/questions/10540483/pdostatement-mysql-insertion-value-0-into-a-bit1-field-1-written-1/34578200#34578200 – saeed

回答

2

PDO::ATTR_EMULATE_PREPARES導致PDO與BIT列交互的方式略有不同。如果它被設置爲false,你只需要插入值正常,MySQL將做任何必要的轉換幕後:

$stmt = $dbh->prepare("UPDATE tablename SET 
    bit_col = ? "); 
$stmt->bindValue(1, $_POST['bit_col']); 

但是,如果PDO是模擬預處理語句,你需要把b在那裏以某種方式表明它是一種BIT類型。如果你將b置於綁定參數中,PDO將會跳過單引號,並且最終會將類似'b\'0\''的內容發送到MySQL,這顯然不起作用。因此b需要在查詢中,而不是在綁定參數中。使用命名參數執行此操作會產生上述「綁定變量的數量與令牌數量不匹配」的錯誤,因爲PDO無法識別帶有b後跟:作爲命名參數的字符串。然而PDO 確實當您使用問號參數標記,這樣認識到它作爲一個參數:

$stmt = $dbh->prepare("UPDATE tablename SET 
    bit_col = b? "); 
$stmt->bindValue(1, $_POST['bit_col']); 

由於我們需要的東西,如b'1'被髮送到MySQL就結了,綁定將值時使用PDO::PARAM_INT導致查詢失敗,因爲它將變爲UPDATE tablename SET bit_col = b1(不包括數字周圍的引號),因此您必須保留數據類型或使用PDO::PARAM_STR

另請注意,如果禁用模擬預準備語句,則此查詢將失敗,並出現語法錯誤,因此不幸的是,查詢需要根據是否正在模擬準備而完全不同。

0

如果我沒有記錯的話,語法應爲:

$stmt->bindValue(':bit_col', $_POST['bit_col']); 

引用:bit_col來自:

$stmt = $dbh->prepare("UPDATE tablename SET bit_col = :bit_col "); 
+0

如果將'PDO :: ATTR_EMULATE_PREPARES'設置爲「假」,但那是我嘗試的第一件事,我在我的問題中提到過。 – Mike