3

このメソッドを使用して、指定したテーブルからキーの配列 (プライマリ、外部など) を取得したい:

public function getTableKeys($table){
    //OBTAIN TABLE KEYS
    try {
        $conn = $this->db->_pdo;    
        $conn->beginTransaction();

        $query = $this->db->_pdo->prepare('SHOW KEYS FROM :table');
        $query->bindParam(':table', $table, PDO::PARAM_STR);
        $query->execute();
        $keys = $query->fetchAll(PDO::FETCH_ASSOC);

        $conn->commit();
        return $keys;
    }catch (Exception $e) {
        $conn->rollback();
        echo 'Caught exception: ',  $e->getMessage(), "\n";
        return false;
    }
}

問題は、スローされるエラーがあることです:

キャッチされた例外: SQLSTATE[42000]: 構文エラーまたはアクセス違反: 1064 SQL 構文にエラーがあります。1 行目の ''ps_customer'' 付近で使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。

PHPMyAdmin で SQL を手動で実行すると、一連のキーが正常に返されます。問題は、次の形式でなければならないことです。

SHOW KEYS FROM ps_customers

この形式ではありません(引用符付き):

SHOW KEYS FROM "ps_customers"

私の質問は次のとおりです。bindParam引用符なしでSQLに挿入する必要があるが、高速な文字列であるパラメーターをどのようにすればよいですか(の使用はPDO::PARAM_INT機能しません)。

可能な提案をありがとう、皆さん。

4

1 に答える 1

2

ベンが言ったように、準備されたステートメントでテーブル名をバインドすることはできません。ホワイトリストに登録することで、テーブル名をサニタイズできます。

許可されたテーブル名の配列を使用して、ホワイトリストにあるものだけを使用できるようにします。

$table = "table1";//Your table name
$allowed_tables = array('table1', 'table2');//Array of allowed tables to sanatise query
if (in_array($table, $allowed_tables)) {
    getTableKeys($table);
}   

table1 がリストにある場合にのみ、SQLSHOW KEYS FROM $tableが照会されます。

public function getTableKeys($table){
    //OBTAIN TABLE KEYS
    try {
        $conn = $this->db->_pdo;    
        $conn->beginTransaction();
        $query = $this->db->_pdo->prepare('SHOW KEYS FROM $table');
        $query->execute();
        $keys = $query->fetchAll(PDO::FETCH_ASSOC);

        $conn->commit();
        return $keys;
    }catch (Exception $e) {
        $conn->rollback();
        echo 'Caught exception: ',  $e->getMessage(), "\n";
        return false;
    }
}
于 2013-11-06T19:46:50.123 に答える