5

いくつかのレコードを取得するための検索フォームがあります。フォームの制限フィールドの 1 つは、record次のようなドロップダウン ボックスです。

<select name="record" id="record">
<option value="1">Highest Score</option>
<option value="2">Most runs</option>
</select>

次に、検索すると、次のコードが実行されます。

if (isset($_GET['action']) and $_GET['action'] == 'search')
{
  include $_SERVER['DOCUMENT_ROOT'] . '/stats/includes/db.inc.php';

  $placeholders = array();

  if($_GET['record'] == '1'){
      $placeholders[':record'] = 'runs';
  } else if($_GET['record'] == '2'){
      $placeholders[':record'] = 'SUM(runs)';
  }

  $select = 'SELECT playerid, :record as record, user.usertitle';
  $from   = ' FROM cricket_performance p INNER JOIN user ON p.playerid = user.userid';
  $where  = ' WHERE TRUE';

  if ($_GET['team'] != '')
  {
    $where .= " AND team = :team";
    $placeholders[':team'] = $_GET['team'];
  }

  if ($_GET['record'] != '')
  {
    $where .= " ORDER BY :record DESC";
  }

  $where .= " LIMIT 10";

  try
  {
    $sql = $select . $from . $where;
    $s = $pdo->prepare($sql);
    $s->execute($placeholders);
  }
  catch (PDOException $e)
  {
    $error = 'Error fetching record';
    include 'form.html.php';
    exit();
  }

    foreach ($s as $row)
    {
    $records[] = array('playerid' => $row['playerid'], 'record' => $row['record'], 'usertitle' => $row['usertitle'], '1' => $row['1']);
    }
    include 'form.html.php';
    exit();
}

そして、それは1つのことを除いて完全にうまく機能します. これは、データベースからフィールドが選択される$placeholders[':record'] = 'runs';のではなく、文字通り「実行」としてSQLに出力されるため、テーブルから選択される番号ではなく、すべてのエントリに対して「実行」として出力されます。runs$record['record']

引用符が "" に置き換えられた場合は同じことが起こり、 `` に置き換えられた場合は何も起こりません (空の結果)

4

2 に答える 2

1

テーブル名またはフィールド名にプレースホルダーを使用しないでください。代わりに変数を使用してください。とにかく値をサニタイズする必要はありません。

"SELECT playerid, ".$field." as record, user.usertitle"
于 2013-08-10T01:11:15.150 に答える
0

PDO は、バインドされたパラメーターが WHERE 句などの値であると想定しています。したがって

$s = $pdo->prepare($sql);
$s->execute($placeholders);

期待どおりに動作しません。PDOはから作成します

SELECT playerid, :record as record, user.usertitle

何かのようなもの

SELECT playerid, 'runs' as record, user.usertitle

そして実行しようとします。

于 2013-08-10T01:19:11.180 に答える