4

PDO プリペアド ステートメントとbitデータ型を操作するときに問題が発生します

PDO プリペアド ステートメントを使用して DB から結果を取得すると、空の結果セットが返されますが、通常の SQL クエリでクエリを実行すると正しい結果が返されます。

is_demowhere 句のフィールドを省略しても、正常に機能します!?

DB テーブル構造

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

戻る

正しい行数を返します

4

2 に答える 2

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";
于 2012-10-19T15:04:28.857 に答える
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);
于 2013-07-23T19:08:04.867 に答える