Comando mysql

  • Creatore Discussione Creatore Discussione marcomg
  • Data di inizio Data di inizio

marcomg

Utente Attivo
19 Nov 2011
204
0
16
Che comando posso lanciare tramite mysql in modo che vengono cancellate tutte le righe di una determinata tabella a condizione che il valore numerico sia minore di un tot?

Es:
tabella:"lil_urls"
[table="width: 500"]
[tr]
[td]id[/td]
[td]url[/td]
[td]date[/td]
[/tr]
[tr]
[td]0[/td]
[td]www.ciao.it[/td]
[td]2012-01-28 10:02:48[/td]
[/tr]
[/table]
L'ultima colonna è un timestamp.
Come faccio a cancellare tutte le righe che hanno un timestamp minore di uno che genero tramite php?

Per adesso ho scritto:
PHP:
<?php
// Script per eliminare tutto dal database
$indirizzo_del_server = '';
$nome_utente_mysql    = '';
$password_mysql       = '';
$nome_database_mysql  = '';



//Mi connetto al MySql Server
$myconn = mysql_connect($indirizzo_del_server, $nome_utente_mysql, $password_mysql) or die('Errore...');

//Mi connetto al database
mysql_select_db($nome_database_mysql, $myconn) or die('Errore...');


//Imposto ed eseguo la query
$query = "DELETE FROM lil_urls";
$result = mysql_query($query, $myconn) or die('Errore...');
print "Le tabelle sono state troncate con successo.";
?>
 
ciao
se non ho capito male tu vuoi eliminare le righe con una data minore di una che vuoi tu, giusto?
se è così ti do un esempio
PHP:
<?php
$giorni=30;
$adesso=time();//data di oggi del server in secondi
$allora=$adesso-(30*24*60*60); //tolgo 30 giorni alla data attuale gg*ore*minuti*secondi
$query = "DELETE FROM lil_urls WHERE date < '$allora'";
//..ecc...
?>
oppure se vuoi impostare una data completa es. precedenti al 12/05/2011
prima trasformi la data in timestamp
PHP:
<?php
$anno=2011;
$mese=5;
$giorno=12;
$ore=9;
$min=5;
$sec=39;
$allora= mktime($ore, $min, $sec, $mese, $giorno, $anno);//se non interessano ore/min/sec mktime(0, 0, 0, $mese, $giorno, $anno)
$query = "DELETE FROM lil_urls WHERE date < '$allora'";
//..ecc...
?>
 
Credo di aver sbagliato qualcosa ...


Il file troncate.php raggiungibile a http://iliurl.comeze.com/troncate.php
PHP:
<?php
// Variabili da impostare:

// Giorni dopo quanto rimuovere il tutto
$giorni_da_rimovere=0;

// Da qui in poi non è necessario modificare per il corretto funzionamento dello script

// Includo il file di configurazione
include("./includes/conf.php");

//Mi connetto al MySql Server
$myconn = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS) or die('Errore...');

//Mi connetto al database
mysql_select_db(MYSQL_DB, $myconn) or die('Errore...');

//Imposto ed eseguo la query
$timestamp=time();//data di oggi del server in secondi
$MYSQL_DB=MYSQL_DB;
$to_remove_from_data=$timestamp-($giorni_da_rimovere*24*60*60); //tolgo 30 giorni alla data attuale gg*ore*minuti*secondi
$query = "DELETE FROM $MYSQL_DB WHERE date < '$to_remove_from_data'";
?>


il file ./includes/conf.php

PHP:
<?php /* conf.php ( config file ) */

// page title
define('PAGE_TITLE', 'lilURL; URL Generator');

// MySQL connection info
define('MYSQL_USER', 'user');
define('MYSQL_PASS', 'password');
define('MYSQL_DB', 'database');
define('MYSQL_HOST', 'host');

// MySQL tables
define('URL_TABLE', 'lil_urls');

// use mod_rewrite?
define('REWRITE', false);

// allow urls that begin with these strings
$allowed_protocols = array('http:', 'https:', 'mailto:');

// uncomment the line below to skip the protocol check
// $allowed_procotols = array();

?>

Cosa sbaglio?
 
ciao
l'istruzione
PHP:
$query = "DELETE FROM $MYSQL_DB WHERE date < '$to_remove_from_data'";
valorizza solo una stringa affinche questa operi sulla tabella ci vuole l'istruzione

PHP:
mysql_query($query);
io avevo messo //ecc.. perchè mi sembrava evidente
non so se è quello che vuoi, ma mettendo
PHP:
$giorni_da_rimovere=0;
la moltiplicazione ($giorni_da_rimovere*24*60*60) è zero
quindi in pratica avresti anche potuto scrivere
PHP:
$to_remove_from_data=time();
 
Che intendi dire per valorizza la stringa?
Mettergli gli apici?
Oppure?
Comunque ho messo 0 per vedere se funziona subito!

PHP:
<?php
// Variabili da impostare:

// Giorni dopo quanto rimuovere il tutto
$giorni_da_rimovere=0;

// Da qui in poi non è necessario modificare per il corretto funzionamento dello script

// Includo il file di configurazione
include("./includes/conf.php");

//Mi connetto al MySql Server
$myconn = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS) or die('Errore...');

//Mi connetto al database
mysql_select_db(MYSQL_DB, $myconn) or die('Errore...');

//Imposto ed eseguo la query
$timestamp=time();//data di oggi del server in secondi
$MYSQL_DB=MYSQL_DB;
$to_remove_from_data=$timestamp-($giorni_da_rimovere*24*60*60); //tolgo 30 giorni alla data attuale gg*ore*minuti*secondi
$query = "DELETE FROM $MYSQL_DB WHERE date < '$to_remove_from_data'";
mysql_query($query);
print("ok");
?>


Ma non è che mi sono sbagliato?
Ho esportato il database in pdf, ma non mi da il timestamp, ma la data!!
http://www.autistici.org/mmarcoggue...adfile&filename=a5887057_data.pdf&directory=&

Però nel phpmyadmin mi dice che il tipo è di tipo timestamp
 
Ultima modifica:
ciao
con valorizza intendo riassumere un dicitura più tecnica
l'istruzione
PHP:
$query = "DELETE FROM $MYSQL_DB WHERE date < '$to_remove_from_data'";
assega alla variabile $query il valore "DELETE......"
il fatto di assegnare quella stringa non fa eseguire nulla, per fare l'interrogazione/inserimento/uppaggio necessita l'istruzione
mysql_query($query);

poi
Ma non è che mi sono sbagliato?
dipende da come hai settato il campo.
per utilizzare il formato timestamp, che è un numero intero, il campo data va settato es int(15), se lo setti in qualche formato tipo date ti trasforma il timestamp in data.
in tutti i miei db il campo data lo setto a int(15), poi eventualmente lo trasformo tramite script dove mi serve
es.
PHP:
echo date("d-m-Y H:i:s", $data_in_timestamp);
che strasforma il timestamp nel formato leggibile giorno-mese-anno ore:minuti:secondi
secondo me salvare la data in timestamp facilita sia l'ordinamento per data che eventuali calcoli

se come sembra tu hai settato la data del campo in un formato date, l'errore è nel where perchè il confronto tra una data è un numero intero è come sommare le pere con le mele.

es se nel campo date hai 2012-01-30
e nella variabile $to_remove_from_data hai il time stamp (non sto a calcolarlo metto un valore a caso) = 123456789 la condizione
WHERE date < '$to_remove_from_data'
non sarà mai verificata perchè
2012-01-30 > 123456789
 
Ho risolto. Devo ringraziarti moltissimo!!!

Alla fine il codice è questo:

PHP:
<?php
// Variabili da impostare:

// Giorni dopo quanto rimuovere il tutto
$giorni_da_rimovere=0;

// Da qui in poi non è necessario modificare per il corretto funzionamento dello script

// Includo il file di configurazione
include("./includes/conf.php");

//Mi connetto al MySql Server
$myconn = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS) or die('Errore...');

//Mi connetto al database
mysql_select_db(MYSQL_DB, $myconn) or die('Errore...');

//Imposto ed eseguo la query
$timestamp=time();//data di oggi del server in secondi
$URL_TABLE=URL_TABLE;
$to_remove_from_data=$timestamp-($giorni_da_rimovere*24*60*60); //tolgo 30 giorni alla data attuale gg*ore*minuti*secondi
$to_remove_from_data=date('Y-m-d H:i:s', $to_remove_from_data);
$query = "DELETE FROM $URL_TABLE WHERE date < '$to_remove_from_data'";
//$query = "DELETE FROM $URL_TABLE WHERE date > '0'";
//$query = "DELETE FROM $URL_TABLE WHERE date < '2012-01-30 09:23:30'";
mysql_query($query);
?>
 
E' possibile anche direttamente con mysql

PHP:
$query = "DELETE FROM $URL_TABLE WHERE date < DATE_SUB(CURDATE(),INTERVAL 30 DAY)";

Meglio sempre fare prima una select per assicurarsi di eliminare i record giusti

PHP:
$query = "SELECT * FROM $URL_TABLE WHERE date < DATE_SUB(CURDATE(),INTERVAL 30 DAY)";
 
E come si fa ad aggiungere un controllo?
Cioè che esegue quell'operazione solo se in un'altra colonna c'è 1? Se c'è 0 non lo cancella, mentre se c'è 1 fa il controllo?
 
Codice:
$query = "DELETE FROM $URL_TABLE WHERE date < DATE_SUB(CURDATE(),INTERVAL 30 DAY) && altracolonna = 1";
 
Grazie mille!

Ditemi se secondo voi questo codice va bene! (sembra funzionare)
Lo ho fatto per stikked. Non c'è verso di fargli cancellare automaticamente i pastes.


PHP:
<?php
// Definisco la variabile con una stringa a vaso per permettere l'inclusione del file di configurazione del database
define('BASEPATH', "STRINGA INUTILE");

// Includo il file di configurazione del database
include("./system/application/config/database.php");

// Assegno le variabili dal file di configurazione
$MYSQL_HOST = $db['default']['hostname'];
$MYSQL_USER = $db['default']['username'];
$MYSQL_PASS = $db['default']['password'];
$MYSQL_DB = $db['default']['database'];
$URL_TABLE = $db['default']['dbprefix'];
$URL_TABLE = "$URL_TABLE"."pastes";

//Mi connetto al MySql Server
$myconn = mysql_connect($MYSQL_HOST, $MYSQL_USER, $MYSQL_PASS) or die('Errore...');

//Mi connetto al database
mysql_select_db($MYSQL_DB, $myconn) or die('Errore...');

//Imposto ed eseguo la query
$timestamp=time();
// $query = "DELETE FROM $URL_TABLE WHERE date < '$to_remove_from_data'";
$query = "DELETE FROM $URL_TABLE WHERE expire < '$timestamp' && toexpire = 1";
mysql_query($query);
?>
 

Discussioni simili