0

MySQLクエリでテーブルを動的に選択することは悪い習慣であり、すべてを1つのテーブルにまとめる以外に、現在のコードに代わる方法を見つけることができないと言われています。それが意味をなさない場合は、おそらく私の現在のコードがより意味をなすでしょう。

$where = $_GET['section'];
$mysqli = mysqli_connect("localhost", "root", "", "test");

if ($stmt = mysqli_prepare($mysqli, "SELECT title, img, active, price FROM ? ORDER by ID limit 5 ")) {
    mysqli_stmt_bind_param($stmt, 's', $where);

    while ($row = mysqli_fetch_assoc($stmt)) {
        if ($row['active'] == "yes") {
            echo'

プリペアドステートメントを使用してテーブルを選択できないことはわかっていますが、これに取り組む方法がわかりません。

次のようになります:

$where = $_GET['section'];
$mysqli = mysqli_connect("localhost", "root", "", "test");
if ($where == "sets") {
    $query = "SELECT title, img, active, price FROM sets;"
}

if ($stmt = mysqli_prepare($mysqli, $query)) {
    while ($row = mysqli_fetch_assoc($stmt)) {
        if ($row['active'] == "yes") {
            echo'do stuff here';
        }

しかし、それも悪い習慣だと確信しています。私がこれをどの方向に向けるべきかについてのポインタはありがたいです、私は長いポストをお詫びします。

4

1 に答える 1

4

許容値のホワイトリストを使用してテーブル名の有効性を確認する場合は、テーブル名を動的に選択できます。ご存知のように、テーブル名にプリペアドステートメントのプレースホルダーを使用することはできないため、これが最も安全な代替手段です。

// Build an array of table names you will permit in this query
$valid_tables = array('sets', 'othertable', 'othertable2');

// Verfiy that $_GET['section'] is one of your permitted table strings
// by using in_array()
if (in_array($_GET['section'], $valid_tables)) {
  // Build and execute your query
  $where = $_GET['section']
  $query = "SELECT title, img, active, price FROM $where;";
  // etc...
}
else {
  // Invalid table name submitted.  Don't query!!!
}
于 2012-05-25T02:02:51.617 に答える