2012-10-19 37 views
3

我遇到一個問題,當與PDO工作準備語句和bit數據類型PDO準備與位域

當檢索從DB結果與PDO準備語句中的查詢結果爲空是returnd語句,但正確的結果返回如果查詢是通過正常的SQL查詢

如果省略WHERE子句在現場is_demo它的作品,因爲它應該做!?

數據庫表結構

CREATE TABLE IF NOT EXISTS `user` (
    `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, 
    `client_id` smallint(5) unsigned NOT NULL, 
    `is_admin` bit(1) NOT NULL, 
    `is_demo` bit(1) NOT NULL, 
    `name` varchar(30) NOT NULL, 
    `pass` varbinary(20) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `client_id` (`client_id`), 
    KEY `is_admin` (`is_admin`), 
    KEY `is_demo` (`is_demo`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=20 ; 

PDO預處理語句

$sql = "SELECT id,client_id,is_admin,is_demo\n" 
    ."FROM user\n" 
    ."WHERE is_demo=? && client_id=? && name=? && pass=?\n" 
    ."ORDER BY name"; 
$fields = [ 
    0, 
    500, 
    'test', 
    123 
]; 
$sth = $dbh->prepare($sql); 
$sth->execute($fields); 

返回

PDOStatement Object 
(
    [queryString] => SELECT id,client_id,is_admin,is_demo 
FROM user 
WHERE is_demo=? && client_id=? && name=? && pass=? 
ORDER BY name 
) 

沒有行返回

普通查詢

SELECT id, client_id, is_admin, is_demo 
FROM user 
WHERE is_demo=0 && client_id=500 && name='test' && pass=123 
ORDER BY name 

返回

返回行

+0

提示:對於多行字符串分配,請使用[HEREDOC](http://php.net/heredoc)。它們更容易閱讀,並且不必嵌入'\ n'換行符並擔心引用轉義。 –

+0

+1,可在此處重現。 – goat

+1

http://stackoverflow.com/questions/10540483/pdostatement-mysql-inserting-value-0-into-a-bit1-field-results-in-1-written – goat

回答

0

這裏的正確數量的問題\n不能在查詢

$sql = "SELECT id,client_id,is_admin,is_demo\n" 
."FROM user\n" 
."WHERE is_demo=? && client_id=? && name=? && pass=?\n" 
."ORDER BY name"; 
+0

它的工作原理對所有其他查詢都適用。如果where子句中的'is_demo'行被省略,它就可以工作 – clarkk

0

MySQL能夠變換字符串值「0」位寫作在這樣的代碼爲「B」的字符串之前:

$sql = "SELECT id,client_id,is_admin,is_demo\n" 
    ."FROM user\n" 
    ."WHERE is_demo=B? && client_id=? && name=? && pass=?\n" 
    ."ORDER BY name"; 
$fields = [ 
    '0', 
    500, 
    'test', 
    123 
]; 
$sth = $dbh->prepare($sql); 
$sth->execute($fields);