Я пытаюсь позволить пользователю запросить базу данных, используя комбинированные поля. В первом поле со списком отображается список таблиц в базе данных. Когда пользователь выбирает таблицу, запускается другой запрос, который должен заполнять второе поле со списком с именами столбцов в этой таблице (это будет использоваться как выбор для запроса). У меня есть первый комбинированный блок, но я не могу получить второй - для заполнения. Может кто-нибудь помочь с этим? Большое спасибо
вот мой html-код
<form id="ownQueryForm" name="ownQueryForm" method="POST" action="">
<div id = "tableSelect_div">
<P> Select table to Query: </P>
<select name = "Tables" id = "Tables" onchange = 'this.form.submit()'>
<option value = "blank"> Please choose a Table</option>
<?php foreach (($tableContent) as $row) : ?>
<option value = "<?php echo $row['Tables_in_DB_EXECUTION_MANAGER_TEST']; ?>"><?php echo $row['Tables_in_DB_EXECUTION_MANAGER_TEST'];?></option>
<?php endforeach ?>
</select>
</div>
<div id = "columnSelect_div">
<p>SELECT</p>
<select name = "Columns" id = "Columns">
<?php foreach (($columnContent) as $row) : ?>
<option value = "<?php echo $row['COLUMN_NAME']; ?>"><?php echo $row['COLUMN_NAME'];?></option>
<?php endforeach ?>
</select>
</div>
</form>
и вот мои два вопроса до сих пор
public static function getTables(){
global $db;
$st = $db->prepare("show tables");
$st ->execute();
$table = $st->fetchAll(PDO::FETCH_ASSOC);
return $table;
}
public static function getColumns(){
global $db;
$st = $db->prepare("SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = :value ");
$st->bindParam(':value', $_POST['Tables'], PDO::PARAM_STR);
$st -> execute();
$column = $st -> fetchAll(PDO::FETCH_ASSOC);
return $column;
//print_r($column);
}
}
Я использую контроллер, который используется для рендеринга getTable (который находится в модели), а также для getColumns как две отдельные функции на одном контроллере. это можно сделать?
У меня это в контроллере, но он никогда не запускается (если я не вынимаю оператор if), а затем он запускается при загрузке страницы
if (isset ( $_POST ['Tables'] )) {
$c = new ownQueryController();
$c ->queryRequest();
}
Вы можете использовать:
'DESCRIBE ' . $_POST[ 'Tables' ]
Скорее, чем
"SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = :value "
Это должно возвращать массив столбцов с их именем, типом, лимитом и т.д. Затем вы можете прокручивать каждый столбец и отображать его.
ПРЕДУПРЕЖДЕНИЕ
Вам нужно будет убедиться, что ваши данные POST безопасны для ввода запроса. Поскольку @andy предположил, что ваша таблица потенциально может быть удалена, если вы просто используете это.
{'Tables' => "*tablename*; DROP TABLE *tablename*"}
то он просто отбросил бы эту конкретную таблицу.