0

$q=$_GET["q"];準備済みステートメントを実行したい変数 ( ) があります。データベーステーブルの列名が含まれています。

変数の値は、ドロップダウン リストから取得されます。次のコードを実行すると、リストで選択された正確な値が出力されます。したがって、それは単なる列名です。

$q=$_GET["q"];

$dsn = "mysql:host=$host;port=$port;dbname=$database";

$db = new PDO($dsn, $username, $password);

$sql = "SELECT DISTINCT ? FROM repertoire";
$stmt = $db->prepare($sql);
$stmt->execute(array($q));

    echo "<select>";
    while ( $row = $stmt->fetchObject() ) {
        echo "<option>";
        echo "{$row->{$q}}";
        echo "</option>";
        }
    echo "</select>";

ただし、この行を変更すると$sql = "SELECT DISTINCT ? FROM repertoire";

データベースから$sql = "SELECT DISTINCT ".$q." FROM repertoire";必要な行を取得します...

私はPHPがあまり得意ではないので、構文がどこか間違っていると思います。

よろしくお願いいたします。

4

1 に答える 1

2

PDO では、準備済みステートメントはテーブルではなく値を準備します。

ユーザー入力と引用を直接処理する必要があります。

$q=$_GET["q"];

// Make sure you sanitize your user inputs using filter_inputs() or similar.

$dsn = "mysql:host=$host;port=$port;dbname=$database";

$colNames = new PDO($dsn, $username, $password); // Create object for getting column names.
$sql = "DESC repertoire Field"; // SQL for getting column names.
$stmt = $colNames->prepare($sql);
$stmt->execute();

$colList = $stmt->fetchAll(PDO::FETCH_COLUMN, 0); // Fetch the results into $colList array.

if (in_array($q, $colList)) { // If the value of $q is inside array $colList, then run.

    $db = new PDO($dsn, $username, $password);

    $sql = "SELECT DISTINCT $q FROM repertoire";
    $stmt = $db->prepare($sql);
    $stmt->execute(array($q));

        echo "<select>";
        while ( $row = $stmt->fetchObject() ) {
            echo "<option>";
            echo "{$row->{$q}}";
            echo "</option>";
            }
        echo "</select>";
}

また読む:PHP PDOステートメントはテーブルまたは列の名前をパラメーターとして受け入れることができますか?

編集: テーブル レパートリーからすべての列名を取得するために、基本的に SQL desc を実行して $q が有効な列であることを確認する方法を追加しました。

于 2012-07-08T23:25:57.000 に答える