Имена таблиц и столбцов не могут быть связаны с использованием PDO -> bindParam (), но я уверен, что больше, чем кто-либо хотел бы иметь возможность. Немного поздно, но я написал это раньше, и пока это работает. Я как бы новичок в php и хотел бы знать, что вы думаете и если это безопасно.
$type = "defaultTableName"; $sortBy = "defaultColumnName"; $orderBy = "ASC"; //whitelisting unsafe input if(isset($_GET['orderBy'])&&($_GET['orderBy']=="ASC"||$_GET['orderBy']=="DESC")) $orderBy = $_GET['orderBy']; $tableNames = array("defaultTableName", "tableName2", "tableName3"); $unsafeType= $_GET['type']; <---unsafe input $unsafeSortBy = $_GET['sortBy']; <---unsafe input try { $pdo = new PDO("mysql:host=$hostname;dbname=$database", $username, $password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //if input is not valid this will use default table to render a table in html. $stmt = $pdo->prepare("DESCRIBE $type"); $stmt->execute(); $table_fields = $stmt->fetchAll(PDO::FETCH_COLUMN); //Whitelisting user input against table names (will require table names updates) if (in_array($unsafeType, $tableNames)) { $stmt = $pdo->prepare("DESCRIBE $unsafeType"); $stmt->execute(); $table_fields = $stmt->fetchAll(PDO::FETCH_COLUMN); ///Whitelisting the column name to sort by against the description of the table. if (in_array($unsafeSortBy, $table_fields)) { $stmt = $pdo->prepare("SELECT * FROM $unsafeType ORDER BY $unsafeSortBy $orderBy"); } else { $stmt = $pdo->prepare("SELECT * FROM $type ORDER BY $sortBy $orderBy"); } } else { $stmt = $pdo->prepare("SELECT * FROM $type ORDER BY $sortBy $orderBy"); } $stmt->execute(); $result = $stmt->fetchAll(PDO::FETCH_ASSOC); } catch(PDOException $e) { echo 'ERROR: ' . $e->getMessage(); }
Только проблема, которую я вижу, заключается в том, что при изменении таблиц вам нужно будет добавить / удалить / изменить массив имен таблиц. Я имею небольшое / среднее приложение в виду, не очень сложное.
Примечание. Я также ужасно редактируюсь в stackoverflow, поэтому, если вы знаете способ сделать это лучше, продолжайте и редактируйте или дайте мне знать.