script per l'inserimento SELETTIVO di record

megarospo

Utente Attivo
25 Set 2007
147
0
0
Ciao a tutti.
Devo realizzare uno script che mi permetta di inserire, per esempio, 1000 record automaticamente, ma che prima di inserire il singolo record, controlli che già non esista nel database.
(per esempio: inserisco 3 prodotti tipo scarpa marrone, scarpa nera e scarpa rossa. Se nella banca dati esiste già scarpa rossa, il record non viene inserito e si salta al successivo)

Vorrei sapere secondo voi quali sono i passi logici che dovrei seguire nel progettare lo script.

Grazie mille!!!
 
Qualsiasi tipo di ciclo e controllo all'interno del ciclo stesso per verifica la (non) esistenza del record nel database. Semplicissimo!
 
condivido a pieno Jan!
Fai un ciclo dei record da inserire e per ognuno verfichi se è già nel DB:
Codice:
SELECT COUNT(*) FROM ... WHERE ...
se il risultato della select è diverso da zero significa che il record è già presente... in caso contrario farai una INSERT...
 
ciao
dipende anche da come inserisci i dati se prelevati da altro db, da file txt.
io per inserire molti indirizzi email nella lista delle newsletter copio/incollo l'idirizzo in word campip ^p in * e quando ho 1000 indirizzi salvo in formato txt
prima di immettere nel db da form carico il file txt
$indirizzi=explode('*'*, $testo);
foreah ($indirizzi as value){
faccio la select come ha indi cato max e se esite annulla la var
}
poi inserisco avendo ripulito da eventuali ripetizioni
 
bozza

Vi trascrivo una bozza buttata giù velocemente tanto per iniziare a capire se seguo la strada giusta: :book:

Creare form con campo di testo dove incollare tutti i record da inserire.
Come divido i diversi record se sono del tipo:
record1 - campo1, campo2, campo3
record2 - campo1, campo2, campo3 ?
$db = mysql_connect($db_host, $db_user, $db_password);
$record=explode('*', $testo); //da modificare
foreach ($indirizzi as value){
mysql_select_db($db_name, $db)
or die ("Errore nella selezione del database.");
$query = "SELECT * FROM prodotti WHERE nome='$nome' AND nome2='$nome2'”;
if ($query == 0) {
eseguo il programma:
$query="insert into prodotti(nome,nome2) values('$nome','$nome2')";
echo "record $nome, $nome2, inserito ";
}
else {
esco e ricomincio il ciclo
}
 
Ultima modifica:
ciao
da quello che ho capito tu hai un record con tre o piu campi, quindi il sistema che ti avevo suggerito non credo che vada bene (dal tuo primo post avevo capito che tu avessi un campo solo)
probabilmente non devi separare solo i campi ma un record dall'altro
ci penso un momento poi ti so dire (forse:rolleyes:)
 
ciao, prova così

dovresti suddividere il testo in record ed ogni record in campi
es. avendo una tabella con i campi nome, citta, email
dovresti preparare in txt del tipo

pinco*palermo*[email protected]|pallino*padova*[email protected]|pancrazio*livorno*[email protected]
eccetera


PHP:
$db = mysql_connect($db_host, $db_user, $db_password);
mysql_select_db($db_name, $db)
or die ("Errore nella selezione del database.");

//la variabile $testo puo venire da un form o dalla lettura di un file.txt
//da verificare quanto è la lunehezza massima di una stringa php, non so se ci sono dei limiti
//eventualmenti si può spezzare il txt in tanti txt più corti
$testo="pinco*palermo*[email protected]|pallino*padova*[email protected]|pancrazio*livorno*[email protected]";

$record=explode("|",$testo);//divido i record
foreach($record as $value){//comincio a ciclare i record
    $campo=explode("*", $value); //suddivido il record in campi
    //verifico se il record esiste
   $esiste=mysql_num_rows(mysql_query("SELECT * FROM mia_tabella WHERE campo3='$campo[2]'"))
   if($esiste == 0){//non esiste e quindi inserisco
     //devo trimmare i valori (vedi sotto)
     $campo[0]=trim($campo[0]);
     $campo[1]=trim($campo[1]);
     $campo[2]=trim($campo[2]);
     $query="INSERT INTO mia_tabella(campo1,campo2,campo3) VALUES(campo1='$campo[0]', campo2='$campo[1]',campo3='$campo[2]'";
     mysql_query($query);
   }//fine if esiste
}//fine forech


difetto del sistema che bisogna essere precisi nella preparazione del testo e che non possono essere saltati "campi"
es se la citta per un record non esite non si può scrivere
..|toni*[email protected]|....
ma
..|toni* *[email protected]|....
 
Ultima modifica:
Ho creato un database con nome "prova", con tre campi.
1) id auto incrementante
2) nome
3) descrizione

una pagina form con questo codice:

form.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Documento senza titolo</title>
</head>

<body>
<p>inserimento di massa</p>
<form id="form1" name="form1" method="post" action="inserisci.php">
<label>inserisci il Testo:<br />
<textarea name="textfield" cols="100" rows="10"></textarea>
</label>
<p>ATTENZIONE: PRIMA DI CLICCARE CONTROLLA ACCURATAMENTE SE NO FAI UN GRAN CASINO!!</p>
<p>
<label>
<input type="submit" name="Submit" value="PERICOLO DI MORTE" />
</label>
</p>
</form>
<p>&nbsp;</p>
</body>
</html>

/////////////////////////////////////////////////////////////////

e poi il nostro file per l'inserimento di massa - inserisci.php



<?php
if (!isset($_SESSION)) {
session_start();
}
require_once('database.php');

//inserire codice per limitare l'accesso se non è stato fatto il login

//richiamo e creo la variabile $testo dal form.
if (isset($_SESSION['testo'])) {
$_SESSION['testo'];
}
else {
echo "variabile $testo non inizializzata. Controlla lo script";
}



$db = mysql_connect($db_host, $db_user, $db_password);
mysql_select_db($db_name, $db)
or die ("Errore nella selezione del database.");

//la variabile $testo puo venire da un form o dalla lettura di un file.txt. (in questo caso proviene da form)
//da verificare quanto è la lunehezza massima di una stringa php, non so se ci sono dei limiti (credo che non ci siano limiti se non in impostazioni del php.ini ma comunque altissime)
//eventualmenti si può spezzare il txt in tanti txt più corti

$record=explode("|",$testo);//divido i record
foreach($record as $value){//comincio a ciclare i record
$campo=explode("*", $value); //suddivido il record in campi
//verifico se il record esiste
$esiste=mysql_num_rows(mysql_query("SELECT * FROM prova WHERE nome='$campo[0]'"))
if($esiste == 0){//non esiste e quindi inserisco
//devo trimmare i valori (vedi sotto)
$campo[0]=trim($campo[0]);
$campo[1]=trim($campo[1]);
$query="INSERT INTO prodotti(nome,descrizione) VALUES(nome='$campo[0]', descrizione='$campo[1]'";
mysql_query($query);
}//fine if esiste
}//fine forech

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Documento senza titolo</title>
</head>

<body>
</body>
</html>

///////////////////////////////////////////////////////////

manca sicuramente qualcosa, ma per il momento il tempo a mia disposizione è finito :)

Intanto vi invio quello che ho potuto buttar giù. :book:

Ciao!
 
Ultima modifica:
ciao
ma per il momento il tempo a mia disposizione è finito

intanto guardo lo script (funzia) e quando hai tempo:book:


PHP:
<?php
/*tabella con 3 campi
1) id auto incrementante
2) nome
3) descrizione
l'id non va nell'insert quindi il testo da preparare è del tipo
pinco*molto alto|pallino*con capelli biondi|tizio*va in bici|caio*va in auto|sempronio*va in bianco
*/
/*
qui tutto quello che serve per il db e sicurezza (che non metto)
simulo l'insert al database con un echo
*/

if(isset($_POST['Submit']) && $_POST['Submit']=="PERICOLO DI MORTE" ){
	$testo=$_POST['textfield'];//leggo il testo dal form
	$record=explode("|",$testo);//divido i record in base a |
	foreach($record as $value){//comincio a ciclare i record 
		$campo=explode("*", $value); //suddivido il record in campi secondo *
		//verifico se il record esiste NON lo faccio perchè non ho il db
		//$esiste=mysql_num_rows(mysql_query("SELECT * FROM mia_tabella WHERE campo3='$campo[2]'")) 
		//if($esiste == 0){//non esiste e quindi inserisco NON lo faccio non ho fatto num rows
		//devo trimmare i valori 
     	$campo[0]=trim($campo[0]); 
     	$campo[1]=trim($campo[1]); 
		//non faccio la query ne l'insert
		//$query="INSERT INTO mia_tabella(campo1,campo2,campo3) VALUES(campo1='$campo[0]', campo2='$campo[1]',campo3='$campo[2]'"; 
     	//mysql_query($query); 
		//provo il testo di prova, simulo l'insert
		echo "inserisco nome: $campo[0] - descrizione: $campo[1]<br>";
		//}//fine if esiste
	}//fine foreach
}//fine if submit
?>
<p>inserimento di massa</p>
<p>pinco*molto alto|pallino*con capelli biondi|tizio*va in bici|caio*va in auto|sempronio*va in bianco</p>
<form id="form1" name="form1" method="post" action="provaMEGAROSPO.php">
<label>inserisci il Testo:<br />
<textarea name="textfield" cols="100" rows="10"></textarea>
</label>
<p>ATTENZIONE: PRIMA DI CLICCARE CONTROLLA ACCURATAMENTE SE NO FAI UN GRAN CASINO!!</p>
<p>
<label>
<input type="submit" name="Submit" value="PERICOLO DI MORTE" />
</label>
</p>
</form>
<p>&nbsp;</p>
 
Questo è il piccolo script mysql per creare velocemente il database per chi volesse testarlo.

CREATE TABLE `prodotti` (
`id` int(11) NOT NULL auto_increment,
`nome` varchar(20) default NULL,
`descrizione` varchar(100) default NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
 
Ho fatto la prova su database. Questo è l'errore che ricevo

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in c:\programmi\easyphp1-8\www\test\inserisci.php on line 25

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in c:\programmi\easyphp1-8\www\test\inserisci.php on line 25


riporto il file "inserisci.php" così come l'ho usato:
(ho messo in grassetto la riga 25 segnalata in errore)

<?php
if (!isset($_SESSION)) {
session_start();
}
require_once('database.php');

//inserire codice per limitare l'accesso se non è stato fatto il login

$db = mysql_connect($db_host, $db_user, $db_password);
mysql_select_db($db_name, $db)
or die ("Errore nella selezione del database.");


//richiamo e creo la variabile $testo dal form.
if(isset($_POST['Submit']) && $_POST['Submit']=="PERICOLO DI MORTE" ){
$testo=$_POST['textfield'];// leggo il testo dal form
//la variabile $testo puo venire da un form o dalla lettura di un file.txt. (in questo caso proviene da form)



$record=explode("|",$testo);//divido i record
foreach($record as $value){//comincio a ciclare i record
$campo=explode("*", $value); //suddivido il record in campi
//verifico se il record esiste
$esiste=mysql_num_rows(mysql_query("SELECT * FROM prova WHERE nome='$campo[0]' AND descrizione='$campo[1]'")); if($esiste == 0){//non esiste e quindi inserisco
//devo trimmare i valori (vedi sotto)
$campo[0]=trim($campo[0]);
$campo[1]=trim($campo[1]);
$query="INSERT INTO prodotti(nome,descrizione) VALUES(nome='$campo[0]', descrizione='$campo[1]'";
mysql_query($query);
}//fine if esiste
}//fine forech

}
else {
echo "variabile $testo non inizializzata. Controlla lo script";
}
?>
 
ciao
se hai creato la tabello con lo script che hai postato

CREATE TABLE `prodotti` (ecc......

e poi fai la quary su

...mysql_query("SELECT * FROM prova WHERE nome...:D
 
ops!!! :D
Ho corretto quello che dicevi e altre piccole cose qua e la.
Ora non ricevo errori e tramite un echo stampo i nomi inseriti.
fatto stà che la stampa a video funziona bene ma nel database non viene inserito nulla. :book:
 
ciao
se la stampa a video funzia e hai sostituito echo con insert.... vuol dire, secondo me, che l'errore sta o nella tabella o nella connessione
subito dopo
$query="INSERT INTO prodotti(nome,descrizione) VALUES(nome='$campo[0]', descrizione='$campo[1]'";
var_dump($query);
mysql_query($query);
var_dump(mysql_query($query));
il primo vardump ti fa vedere se hai scritto bene la query, il secondo se restituisce bool(TRUE) ha inserito se boo(FALSE) no

ocio guardando meglio chiudi la query con )

VALUES(nome='$campo[0]', descrizione='$campo[1]')";
 
prova un semplice:
PHP:
mysql_query($query) or die (mysql_error());
se c'è un errore te lo stampa
 
Funziona!

mmm. mi correggo. Non funziona ancora bene ma abbiamo fatto comunque un altro bel passo avanti. Ho aggiunto la parentesi ed ora crea il record sulla tavella con "id" progressivo ma non riporta i valori "nome" e "descrizione"!
Altra questione è che non riconosce la presenza di record identici già inseriti e quindi inserisce doppioni.
Ecco il codice ultima versione. Faccio delle prove intanto:

<?php
if (!isset($_SESSION)) {
session_start();
}
require_once('database.php');

//inserire codice per limitare l'accesso se non è stato fatto il login

$db = mysql_connect($db_host, $db_user, $db_password);
mysql_select_db($db_name, $db)
or die ("Errore nella selezione del database.");


//richiamo e creo la variabile $testo dal form.
if(isset($_POST['Submit']) && $_POST['Submit']=="PERICOLO DI MORTE" ){
$testo=$_POST['textfield'];// leggo il testo dal form
//la variabile $testo puo venire da un form o dalla lettura di un file.txt. (in questo caso proviene da form)



$record=explode("|",$testo);//divido i record
foreach($record as $value){//comincio a ciclare i record
$campo=explode("*", $value); //suddivido il record in campi
//verifico se il record esiste
$esiste=mysql_num_rows(mysql_query("SELECT * FROM prodotti WHERE nome='$campo[0]' AND descrizione='$campo[1]'"));
if($esiste == 0){//non esiste e quindi inserisco
//devo trimmare i valori (vedi sotto)
$campo[0]=trim($campo[0]);
$campo[1]=trim($campo[1]);
$query="INSERT INTO prodotti(nome,descrizione) VALUES(nome='$campo[0]', descrizione='$campo[1]')";
mysql_query($query);
echo "INSERIMENTO DI $campo[0] OK ---------";}//fine if esiste
}//fine forech

}
else {
echo "variabile $testo non inizializzata. Controlla lo script";
}
?>
 
Ultima modifica:
stampati $campo[0] e $campo[1] per vedere se sono valorizzati, poi prova:
PHP:
$query="INSERT INTO prodotti(nome,descrizione) VALUES(nome='".$campo[0]."', descrizione='".$campo[1]."')";
 
Come prima, anche con le modifiche che ha suggerito Eliox, lo script stampa correttamente a video i valori di $campo[0] e $campo[1], ma non li inserisce nelle celle.

PHP:
$query="INSERT INTO prodotti(nome,descrizione) VALUES(nome='".$campo[0]."', descrizione='".$campo[1]."')";
mysql_query($query) or die (mysql_error());   
echo "INSERIMENTO DI $campo[0] OK ---------";}
:book:

ecco il messaggio che ottengo con le VARDUMP:
string(81) "INSERT INTO prodotti(nome,descrizione) VALUES(nome='pippo2', descrizione='bello')" bool(true) INSERIMENTO DI pippo2 OK ---------string(80) "INSERT INTO prodotti(nome,descrizione) VALUES(nome='topo2', descrizione='basso')" bool(true) INSERIMENTO DI topo2 OK ---------

nota: nel database vengono inseriti 4 record.
 
Ultima modifica:
mmm!!! Non riesco a capire dove sbagliamo. Ho provato a verificare il database, a leggere e rileggere il codice e a fare anche cambiamenti "improbabili" nella speranza di "imbroccare" la soluzione del problema. Più lo rilego e più mi sembra corretto. :confused:
Se avete suggerimenti sono tutto orecchie!
 

Discussioni simili