2012-01-21 8 views
0

私はphpMyAdminの奇妙なmysqlの、しかし、PHP PDOで行を返す

SELECT m.msgFrom, m.msgTo, m.msgID, m.subject, m.dateTime, a.username 
FROM mailbox m 
JOIN accounts a ON (a.id = IF(m.msgTo =1, m.msgFrom, m.msgTo)) 
WHERE msgTo =1 
OR msgFrom =1 
AND parentID =0 
AND IF(m.msgTo =1, m.fromDelete, m.toDelete) !=1 
ORDER BY DATETIME DESC 
LIMIT 250 

で実行し、それを使用している場合、私は0

の行セットを取得するこのクエリを持っていますそのようなPDOのPHPとプレースホルダ、

$q = $dbc -> prepare(" 
SELECT m.msgFrom, m.msgTo, m.msgID, m.subject, m.dateTime, a.username 
FROM mailbox m JOIN accounts a ON (a.id = IF(m.msgTo = ?, m.msgFrom, m.msgTo)) 
WHERE msgTo = ? OR msgFrom = ? AND parentID = 0 AND IF(m.msgTo = ?, m.fromDelete, m.toDelete) != 1 
ORDER BY dateTime DESC LIMIT 250"); 
$q -> execute(array($user['id'], $user['id'], $user['id'], $user['id'])); 

と私は1 $user[id'] == 1の行セットを取得します。

ここでは何が起こっていますか、どのように修正できますか?

+0

PDO経由でプレースホルダレスでないクエリを実行すると期待どおりの結果が得られますか? – Charles

+0

はい私はゼロの行を持っていました –

答えて

2

よりもやMySQLに強い結合を持つ

WHERE msgTo =1 
OR msgFrom =1 
AND parentID =0 
AND IF(m.msgTo =1, m.fromDelete, m.toDelete) !=1 

PDOは多分別の方法でこれを処理

WHERE msgTo =1 
OR (msgFrom =1 
AND parentID =0 
AND IF(m.msgTo =1, m.fromDelete, m.toDelete) !=1) 

は、PHPで

WHERE (msgTo =1 
OR msgFrom =1) 
AND parentID =0 
AND IF(m.msgTo =1, m.fromDelete, m.toDelete) !=1 

を試す意味myadmin

+1

PDOは、プリペアドステートメントエミュレーションが有効な場合にプレースホルダを埋める以外に、クエリまたは結果データの操作を実行しません。クエリの実際のロジックを変更することはできません。 – Charles

+0

Bang on !!!ニース1つのチャプス、私ができるときに受け入れます! –

+0

@Charlesそれは今でも働くので、問題を修正しました。 –