2016-12-26 10 views
0

質問があります。 は、私は次のクエリを持っている:PHP PDO mysqlによる準備と参加

$query = "select * from module,bloc where module.id_bloc = ?"; 

私は私がしたように、値をバインドしようとしました:私は私のブラウザ上で任意の結果を得ることはありませんテストするとき、

$stmt = $this->db->prepare($query); 
$stmt->bindValue(1, "bloc.id_bloc"); 

しかし。

$query = "select * from module,bloc where module.id_bloc = bloc.id_bloc"; 

私は私のブラウザ上で正しい結果を得る:私は次のコードのように、直接内部交換するときので それは奇妙です。

誰かが私がbindValueをやっているときにうまくいかない理由を説明できますか?

+2

これは、パラメータバインドを使用する状況ではありません。モジュールからのselect *、blocここでmodule.id_bloc = bloc.id_bloc ";"は正しい形式です。 – e4c5

+0

私は後者をjoin 'SELECT * FROM module INNER JOIN bloc ON module.id_bloc = bloc.id_bloc'とすることをお勧めします。 – Machavity

+0

[あなたはビン文字列と数値リテラルのみ](https://phpdelusions.net/pdo#bindable ) –

答えて

1

バインドされると文字列が引用されるため、機能しません。 (それは引用されたかのようにそれとも、すべての意図や目的、仕事のために、しかし、PDOは舞台裏でそれを処理することができる。)次に、クエリは次のように解釈されます

select * from module,bloc where module.id_bloc = 'bloc.id_bloc' 

であること:それはと解釈されますリテラル文字列ではなく、テーブル列への参照であり、明らかに期待通りの結果を得られません。それをバインドする必要はありません。

何らかの理由で、安全でないソースからの可変テーブル/カラム名でクエリを実行する必要がある場合は、手動でフォーマット/サニタイズする必要があります。それを行う方法の例についてはsee hereを参照してください。

関連する問題