Visualizzazione risultati 1 fino 7 di 7

Discussione: [MySQL] Cercasi script per eliminare tabelle che iniziano con un determinato prefisso

  1. #1
    L'avatar di darkwolf
    darkwolf non è connesso Salvatore Noschese
    Data registrazione
    18-04-2007
    Residenza
    Reggiolo (RE)
    Messaggi
    6,558

    Predefinito [MySQL] Cercasi script per eliminare tabelle che iniziano con un determinato prefisso

    Come da oggetto del topic: sto facendo dei test continui con una board e mi servirebbe uno script "rapido e sicuro (che non vada a cancellarmi altre tabelle)" per eliminare un gruppo di tabelle dal mio database (es: quelle che iniziano con "nomespecifico_") :)
    Grazie anticipatamente, DarkWolf.

  2. #2
    Guest

    Predefinito

    Con il LIKE, però in questo modo.

    N.B. Non ho provato lo script.

  3. #3
    L'avatar di darkwolf
    darkwolf non è connesso Salvatore Noschese
    Data registrazione
    18-04-2007
    Residenza
    Reggiolo (RE)
    Messaggi
    6,558

    Predefinito

    L'ho eseguita (in locale), viene accettata e sembra sia tutto ok ma le tabelle rimangono li
    Codice PHP:
    SELECT
    CONCAT
    (
    "DROP TABLE ",
    GROUP_CONCAT(TABLE_NAME)
    ) AS
    stmt
    FROM information_schema
    .TABLES
    WHERE TABLE_SCHEMA
    = "my_dbname" AND TABLE_NAME LIKE "mytablename_%";
    SELECT CONCAT( "DROP TABLE ", GROUP_CONCAT( TABLE_NAME ) ) AS stmt
    FROM information_schema.TABLES
    WHERE TABLE_SCHEMA = "my_dbname"
    AND TABLE_NAME LIKE "mytablename_%"
    LIMIT 0 , 30
    Ultima modifica di darkwolf : 14-08-2010 alle ore 17.25.37

  4. #4
    L'avatar di javascripter
    javascripter non è connesso Moderatore
    Data registrazione
    14-02-2010
    Messaggi
    1,114

    Predefinito

    A me quella query riporta questo errore:
    Codice:
    SELECT command denied to user 'user'@'localhost' for table 'TABLES'
    su altervista.

    In alternativa puoi usare questo script ( configura i dati e la variabile $prefix per impostare il prefisso delle tabelle )

    Codice PHP:
    <?php
    error_reporting
    (E_ALL);

    /* connessione al database, configurazione dei dati */
    $host = 'localhost';
    $user = '...';
    $pass = '';
    $dbName = 'my_...';

    /* configura il prefisso delle tabelle */
    $prefix = 'a';
    $pl = strlen($prefix); // lunghezza prefisso

    $db = mysql_connect($host, $user, $pass);
    mysql_select_db($dbName, $db);
    /* fine connessione al database */

    $q = mysql_query('SHOW TABLES FROM ' . $dbName, $db); // query per estrarre i nomi delle tabelle

    if(!$q) // se la query non viene eseguita esce dallo script e stampa l'errore
    die(mysql_error($db));

    $toDrop = ''; // tabelle da eliminare

    while($r = mysql_fetch_row($q)) {
    $name = $r[0]; // il nome della tabella
    $n = substr($name, 0, $pl); // taglia il nome dall'inizio fino alla lunghezza del prefisso

    if($n == $prefix) // se il prefisso corrisponde, aggiungo alla coda di eliminazione
    $toDrop .= $name . ',';
    }

    $toDrop = substr($toDrop, 0, strlen($toDrop) - 1); // rimuove la virgola finale
    $q = 'DROP TABLE ' . $toDrop;

    if(empty(
    $toDrop))
    echo
    'Nessuna tabella da eliminare!';
    else {
    echo
    'Provo ad eseguire la query: <em>', $q, '</em><br />';

    if(
    mysql_query($q, $db))
    echo
    'Tabelle eliminate con successo!';
    else
    echo
    'Errore: ', mysql_error($db);
    }

    mysql_close($db); // chiude la connessione al db
    ?>
    P.S. Usa solo 2 query, una per estrarre i nomi delle tabelle e una per eliminarle.
    Ultima modifica di javascripter : 14-08-2010 alle ore 18.09.18

  5. #5
    L'avatar di darkwolf
    darkwolf non è connesso Salvatore Noschese
    Data registrazione
    18-04-2007
    Residenza
    Reggiolo (RE)
    Messaggi
    6,558

    Predefinito

    Grazie mille ad entrambi :)
    Lo script in php funziona a dovere (testato in locale)!
    Ho apportato giusto un ritocco grafico:
    Prima:
    Codice PHP:
    echo 'Provo ad eseguire la query: <em>', $q, '</em><br />';
    Adesso:
    Codice PHP:
    $lista = str_replace(array("DROP TABLE", ","), array("Eliminazione Tabelle:<hr />", " | "), $q);
    echo
    'Provo ad eseguire la query &gt; <em>', $lista, '</em><hr />';

  6. #6
    Guest

    Predefinito

    Il motivo per cui non vi lascia fare quello dell'information schema è che state cercando di accedere ad un tablespace per il quale non avete i privilegi. La dentro ci sono informazioni che sarebbe meglio non poter usare. La combinazione di php con MySQL dovrebbe andare bene. Vi macella un casino di query orarie ma a parte questo tutto a posto xD

  7. #7
    L'avatar di darkwolf
    darkwolf non è connesso Salvatore Noschese
    Data registrazione
    18-04-2007
    Residenza
    Reggiolo (RE)
    Messaggi
    6,558

    Predefinito

    Scusate la riapertura del topic ma stavo apportando delle modifiche per "dinamicizzare" questo script (che ultimamente uso parecchio - sopratutto nel webserver locale) ed ho delle difficoltà nell'esecuzione del secondo form (che dovrebbe occuparsi dell'eliminazione):
    Codice PHP:
    <?php
    error_reporting
    (E_ALL);

    echo
    '<div style="margin: 10px;">';

    # Avvio la sessione
    session_start();

    # Imposto la sessione (tramite i dati presi dal form)
    $_SESSION['hostname'] = $_POST['hostname'];
    $_SESSION['username'] = $_POST['username'];
    $_SESSION['password'] = $_POST['password'];
    $_SESSION['dbName'] = $_POST['dbName'];
    $_SESSION['prefix'] = $_POST['prefix'];

    # Connessione al database, configurazione dei dati (ricavati dal form)
    $host = $_SESSION["hostname"];
    $user = $_SESSION["username"];
    $pass = $_SESSION["password"];
    $dbName = $_SESSION["dbName"];
    $prefix = $_SESSION["prefix"];

    # Creo il form
    echo '
    <form method="post" name="view">
    <input name="hostname" value="'
    .$host.'" type="text" style="margin: 5px 0"> &gt; DB_HOST (Usually localhost) <b>*</b><br />
    <input name="username" value="'
    .$user.'" type="text" style="margin: 5px 0"> &gt; DB_USER (Your MySQL username) <b>*</b><br />
    <input name="password" value="'
    .$pass.'" type="password" style="margin: 5px 0"> &gt; DB_PASSWORD (...and MySQL password) <b>*</b><br />
    <input name="dbName" value="'
    .$dbName.'" type="text" style="margin: 5px 0"> &gt; DB_NAME (Your database name) <b>*</b><br />
    <input name="prefix" value="'
    .$prefix.'" type="text" style="margin: 5px 0"> &gt; TB_PREFIX (eg: wp_)<br />
    <input value="View Table" name="view_now" type="submit" style="margin: 5px 0">
    </form>'
    ;



    # Controllo campi obbligatori
    if (empty($host) && empty($user) && empty($pass) && empty($dbName)) {
    echo
    "All fields marked with an asterisk (*) are required!";
    }
    elseif (empty(
    $host)) {
    echo
    "Hostname is required!";
    }
    elseif (empty(
    $user)) {
    echo
    "MySQL Username is required!";
    }
    elseif (empty(
    $pass)) {
    echo
    "MySQL Password is required!";
    }
    elseif (empty(
    $dbName)) {
    echo
    "Database Name is required!";
    }
    else {

    # Lunghezza prefisso
    $pl = strlen($prefix);

    # Inizio connessione al database
    $db = mysql_connect($host, $user, $pass) or die("Error: " . mysql_error());
    mysql_select_db($dbName, $db) or die("Error: " . mysql_error());

    # Query per estrarre i nomi delle tabelle
    $q = mysql_query('SHOW TABLES FROM ' . $dbName, $db) or die("Error: " . mysql_error());

    # Tabelle da eliminare
    $toDrop = '';
    while(
    $r = mysql_fetch_row($q)) {
    $name = $r[0]; # il nome della tabella
    $n = substr($name, 0, $pl); # taglia il nome dall'inizio fino alla lunghezza del prefisso
    if($n == $prefix) # se il prefisso corrisponde, aggiungo alla coda di eliminazione
    $toDrop .= $name . ',';
    }

    $toDrop = substr($toDrop, 0, strlen($toDrop) - 1); # rimuove la virgola finale
    $viewtables = $toDrop;
    $droptables = 'DROP TABLE ' . $toDrop;

    if(!empty(
    $viewtables)) {
    $viewtables = str_replace(",", " | ", $viewtables);
    echo
    '
    Table(s) found:
    <hr />
    <em>'
    , $viewtables, '</em>
    <hr />
    <form method="post" name="delete" style="margin: 25px 0">
    <input name="dropall" value="ok" type="hidden">
    Warning: "Drop all tables Permanently" &gt; <input value="Drop NOW!" name="drop_now" type="submit">
    </form>'
    ;
    }
    elseif(isset(
    $_POST["dropall"])) {
    $droptables = str_replace(array("DROP TABLE", ","), array("<br />", " | "), $droptables);
    echo
    '
    Provo ad eseguire la query:
    <hr />
    <em>'
    , $droptables, '</em>
    <hr />'
    ;
    if(
    mysql_query($droptables, $db))
    echo
    '
    Tabelle eliminate con successo!'
    ;
    else
    echo
    '
    Error: '
    , mysql_error();
    }
    else {
    echo
    'No table(s) found!';
    }
    }

    mysql_close($db); # Chiudo la connessione al db
    session_destroy(); # Distruggo la sessione

    echo '
    </div>'
    ;

    ?>
    Semplicemente mi ricarica la pagina e svuota tutti i campi (anziché avviare la corretta eliminazione delle tabelle interessate).
    Idee per risolvere (penso ci sia qualcosa nei form - non li ho mai digeriti granché)?
    Ultima modifica di darkwolf : 03-04-2011 alle ore 15.04.26

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •