TableEdit – jednoduchá úprava tabulek v MySQL

30. července 2003

Pokud máme upravit nějaký seznam nahraný do MySQL tabulky, je systém typu phpMyAdmin jako kanón na vrabce. Nejlepší by bylo si tabulku otevřít třeba v Excelu a jednoduše změnit potřebné údaje. To se nám sice nepodaří, ale obdobný způsob editace umožní PHP skript s názvem TableEdit.

TableEdit je jednoduchá PHP aplikace, která se vejde do jednoho souboru. Po jeho spuštění se zobrazí formulářové menu, kde vybereme databázi, v dalším kroku zvolíme název tabulky a pak už se nám zobrazí samotné rozhraní.

<!DOCTYPE HTML PUBLIC „-//W3C//DTD HTML 4.0 Transitional//EN“>
<html>
<head>
  <title>Table Edit 1.0</title>
</head>
<body><h1>Table Edit 1.0<?php echo(“ – “ . $edit_db . “ – “ . $edit_tb); ?></h1>

Na každé stránce se bude zobrazovat nadpis, obsahující název zvolené databáze $edit_db a název zvolené tabulky $edit_tb. Pokud databáze nebo tabulka ještě zvolena není, bude prostor mezi pomlčkami prázdný.

<?php mysql_connect(„localhost“,“uzivatel“,“heslo“);
if (isset($edit_tb)) {
if ($odeslano==“ano“) {
mysql_select_db($edit_db);
if(!mysql_query(„DELETE FROM “ . $edit_tb)) echo(„Selhalo vymazání starých dat.“); else
  for($i=0;$i<Count($data);$i++) {
    $dotaz=’INSERT INTO ‚ . $edit_tb . ‚ (‚ . $hlavicky . ‚) VALUES (‚;
      for($j=0;$j<Count($data[$i]);$j++) {
        if($j != 0) $dotaz.=‘, ‚;
        $dotaz.=“‚“ . AddSlashes($data[$i][$j]) . „‚“;
      }
    $dotaz.=‘)‘;
    if(!mysql_query($dotaz)) echo(„Selhalo zapsání řádku “ . $i . „. “ . $dotaz . „<br>\n“);
  }
}

Základem všeho je samozřejmě připojení k databázi. Tato verze počítá s tím, že se bude vždy přihlašovat jeden uživatel, takže jsou přihlašovací údaje natvrdo nahrány do souboru. Pokud je zvolena tabulka a byl odeslán formulář s novými údaji, nejprve se vymaže obsah staré tabulky a pak se do ní postupně nahrají nová data. Jednotlivé položky formuláře odpovídají položkám dvojrozměrného pole $data, takže princip zápisu do databáze tkví v obyčejné kombinaci dvou cyklů.

mysql_select_db($edit_db);
$result=mysql_query(„SELECT * FROM “ . $edit_tb);
if ($result == 0):
  echo(„<B>Error “ . mysql_errno() . „: “ . mysql_error() . „</B>“);
// elseif (mysql_num_rows($result) == 0):
// echo(„<B>Tabulka neobsahuje žádná data, nelze ji editovat.</B>“);
else:
?><form method=“post“><input type=“hidden“ name=“edit_db“ value=“<?php echo($edit_db); ?>“><input
type=“hidden“ name=“edit_tb“ value=“<?php echo($edit_tb); ?>“>
<input type=“hidden“ name=“odeslano“ value=“ano“>
<TABLE BORDER=1>
  <THEAD>
    <TR>
      <?php
        $hlavicky=“;
        for ($i = 0; $i < mysql_num_fields($result); $i++) {
          echo(„<TH>“ . mysql_field_name($result,$i) . „</TH>“);
          if($i != 0) $hlavicky.=‘, ‚;
          $hlavicky.=mysql_field_name($result,$i);
        }
      ?>
    </TR>
  </THEAD>
  <TBODY>
    <?php
      for ($i = 0; $i < mysql_num_rows($result); $i++) {
        echo(„<TR>“);
        $row_array = mysql_fetch_row($result);
        for ($j = 0; $j < mysql_num_fields($result); $j++) {
          echo(‚<TD><input type=“text“ name=“data[‚ . $i . ‚][‚ . $j . ‚]“ value=“‚ . HTMLSpecialChars(stripslashes($row_array[$j])) . ‚“></TD>‘);
        }
        echo(„</TR>“);
      }
      if ($pridat) { $i = mysql_num_rows($result);
        echo(„<TR>“);
        for ($j = 0; $j < mysql_num_fields($result); $j++) {
          echo(‚<TD><input type=“text“ name=“data[‚ . $i . ‚][‚ . $j . ‚]“ value=““></TD>‘);
        }
        echo(„</TR>“);
     }
    ?>
  </TBODY>
</TABLE>
<input type=“hidden“ name=“hlavicky“ value=“<?php echo($hlavicky); ?>“>
<input type=“checkbox“ name=“pridat“ value=“true“> Přidat další řádek<br />
<input type=“submit“></form>
<?php
endif;

I když nebyl formulář odeslán, stejně se musí (pokud je zvolena tabulka) vykreslit položky pro editaci. Aby bylo alespoň trochu možné upravovat délku pole, je přidán checkbox, který po zaškrtnutí při příštím odeslání formuláře přidá jednu volnou řádku na konci seznamu. Nový řádek se při dalším odeslání projeví i v samotné databázové tabulce.

} elseif (isset($edit_db)) {
?><form method=“post“><input type=“hidden“ name=“edit_db“ value=“<?php echo($edit_db); ?>“><select
name=“edit_tb“><?php
  mysql_select_db($edit_db);
  $tables = mysql_list_tables($edit_db);
  $num_tables = mysql_num_rows($tables);
  if($num_tables == 0) echo(„Databáze neobsahuje žádné tabulky !“);
  for($j=0; $j<$num_tables; $j++)
  {
    $table = mysql_fetch_row($tables);
    ?><option value=“<?php echo($table[0]); ?>“><?php echo($table[0]); ?></option>
    <?php
  }
?></select><input type=“submit“></form><?php

Pokud není nastavena tabulka, ale je zvolena databáze, je třeba vypsat seznam tabulek ve zvolené databázi, které později bude možno editovat.

} else {
?><form method=“post“><select name=“edit_db“><?php
if (!($listOfDbs = mysql_list_dbs())) {
  printf(„<BR> error in mysql_list_dbs, error %s <BR>\n“, mysql_error());
  exit();
}
$noOfDbs = 0;
while ($noOfDbs < mysql_num_rows($listOfDbs)) {
  $row=mysql_fetch_row($listOfDbs);
  echo(‚<option value=“‚ . $row[0] . ‚“>‘ . $row[0] . ‚</option><br>\n‘);
// printf(‚<option value=“%s“>%s</option><br>\n‘, mysql_tablename($listOfDbs));
  $noOfDbs++;
}
mysql_free_result($listOfDbs);
?></select><input type=“submit“></form><?php

A pokud není zvolena ani databáze, vypíšeme nejprve seznam všech dostupných databází.

} ?><br><br><form><input type=“submit“ value=“Na začátek“></form></body>
</html>

Na úplný konec ještě umístíme prázdný formulář, po jehož potvrzení se nahraje stránka bez parametrů, jinak řečeno, vrátíme se zpátky k volbě databáze. Samozřejmě, že místo formuláře by zde stačil i obyčejný odkaz.

Malé upozornění na závěr – tato metoda se nehodí k editování velkých tabulek ani tabulek, se kterými pracuje více uživatelů zároveň, protože by mohlo dojít ke kolizi a případné ztrátě všech dat.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Předchozí článek fotbal.cz
Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *