-1

首先,我有这个小的 PDO 代码片段,它可以让我获得服务器上所有可用的数据库以及表的另一个函数:

每当我从数据库列表中选择并提交一个选项时,我都需要在下面的选择菜单中显示其相应的表。我设法用 foreach 显示数据库,但我有点错过了为什么这不起作用。

提前感谢任何答案/解决方案:)

4

1 回答 1

1

请参阅下面的代码修订,以实现您正在寻找的内容。

<form method='post' action="<?php $_SERVER['PHP_SELF']; ?>">
<?php

define('PDO_USER', 'root');
define('PDO_PASS', '');

function getDatabases(PDO $pdo) {
    $stmt = $pdo->query('SHOW DATABASES');
    $result = $stmt->fetchAll();

    $dbs = array();
    foreach($result as $row) {
        $dbs[] = $row['Database'];
    }

    return $dbs;
}

$pdo = new PDO('mysql:host=localhost', PDO_USER, PDO_PASS);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
$databases = getDatabases($pdo);


// Table code
$selectedDB = (!empty($_POST['database'])) ? $_POST['database'] : null;
function getTables(PDO $pdo, $databaseName) {
    if(!in_array($databaseName, getDatabases($pdo))) {
        return array();
    }

    $stmt = $pdo->query('SHOW TABLES FROM '.$databaseName);
    $result = $stmt->fetchAll();

    $tables = array();
    foreach($result as $row) {
        $tables[] = $row['Tables_in_'.$databaseName];
    }

    return $tables;
}

$tables = array();
if(!empty($selectedDB)) {
    $tables = getTables($pdo, $selectedDB);
}


?>
Database: 
<select name='database'>
    <?php foreach($databases as $row): ?>
        <option value="<?php echo $row; ?>"><?php echo $row; ?></option>
    <?php endforeach; ?>
</select>&#160;
<input type='submit' name='formSubmit' value='Submit'></form>
UPDATE
<select name='formTable1'>
  <?php foreach($tables as $tbName): ?>
   <option value='<?php echo $tbName; ?>'><?php echo $tbName; ?></option>
  <?php endforeach; ?>
</select>

几点注意事项:

  1. 您需要在表单标签中包含“action”属性,以便为表单提供提交的目标 URL。

  2. 在您最初的选择中,您有 2 个名称属性(name='formDatabases[]' name='database')。每个表单元素应该只有一个名称,该名称被确定用作该特定字段的 $_POST 数组中的键。

  3. 如果您希望特定的 POST 项目在 PHP 中是一个数组,您应该只在 HTML 中使用“name='var[]'”格式。否则你可以使用“name='var'”

  4. 这可能超出了您原始问题的范围,但您可能需要考虑将数据库业务逻辑分离到一个单独的类中,以保持 HTML 干净。至少现在,我更新了代码以在文件顶部添加逻辑,以便将来可以更轻松地将 in 提取到类中。这避免了进入 PHP Spaghetti 字符串代码的危险路径!
于 2013-08-16T02:23:45.847 回答