1

多くのメソッドを持つ同様のクラスがgetData()ありますが、パラメーターの値のみを返し$columnます。

private $db;

function __construct()
{
    $this->db = new PDO('sqlite:\db');
}

public function getData($rowid, $column)
{
    $st = $this->db->prepare('SELECT ? FROM tbl WHERE rowid=?');
    $st->bindParam(1, $column, PDO::PARAM_STR);
    $st->bindParam(2, $rowid, PDO::PARAM_INT);
    if ($st->execute())
        return $st->fetchColumn();
    else
        return false;
}

クラスの他のすべての部分と残りの半分のgetData()作品。ここでの問題は何ですか?

4

2 に答える 2

2

bindParam識別子ではなく、パラメータをバインドするために使用されます。そこでバインドする値は、次のように展開されます。

SELECT 'some_value' FROM tbl WHERE rowid='some_other_value';

...したがって、以下と同等です。

SELECT 'some_value';

パラメータは実際のパラメータにのみ使用する必要があります。

$this->db->prepare('SELECT '.$column.' FROM tbl WHERE rowid=?');

列がユーザー提供であり、それをエスケープしたい場合は、適切なエスケープ関数を使用してください。この場合、それはSQLite3::escapeString()

$column = SQLite3::escapeString($column);
$this->db->prepare('SELECT '.$column.' FROM tbl WHERE rowid=?');

列がユーザー指定でない場合は、実際にエスケープする必要はありません。

于 2012-04-04T17:35:18.513 に答える
0

識別子は文字列ではありません。
識別子をバインドすることはできません。
代わりに、それらをホワイトリストに登録する必要があります。

または-より良い-動的なフィールド名をまったく必要としない適切な方法でアプリケーションを設計します。

于 2012-04-04T17:38:02.270 に答える