Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [MySQL] controllo dati esistenti prima di INSERT

    Ciao, mi date qualche dritta su come posso effettuare un controllo prima di inserire dei dati in una tabella?

    In pratica ho una form con 2 select:
    - NOMI (paolo, gianni,etc.)
    - COLORI(giallo, rosso, etc.)

    Per ogni nome è possibile attribuire i più colori preferiti.

    Però vorrei evitare di avere avere record duplicati, quindi se ho già inserito "PAOLO" e "ROSSO", vorrei aprire un alert "attenzione, già inserito!".

    La tabella Nomi_Colori è fatta così:
    ID | NOME | COLORE


    Attualmente inserisco i dati passandoli dal form ad una pagina php che effettua:

    codice:
    $sql = "INSERT INTO nomi_colori ( nome , colore)
     VALUES ( '$nome_scelto', '$colore_scelto')";
    		
    $mysql_result=mysql_query($sql,$db_conn) or die(mysql_error());


    Grazie
    1,2,3,4,5,10,100 passi!

  2. #2
    Non e' che hai molto da scegliere. Fai una query select preventiva e se gia' esiste l'accoppiata non la inserisci piu'.

    SELECT *
    FROM nome_colori
    WHERE nome = '$nome_scelto'
    AND colore = '$colore_scelto'

    verifichi con una if il numero delle righe presenti e se zero inserisci, altrimenti no. Usa mysql_num_rows($resourse)

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  3. #3
    Ok, grazie!

    Ho aggiunto l'if così:
    codice:
    $mysql_result=mysql_query($sql1,$db_conn) or die(mysql_error());
    		
    if (mysql_num_rows($mysql_result)){
    	echo "ci sta";
          
             $sql2 = "INSERT INTO nomi_colori ( nome , colore)
             VALUES ( '$nome_scelto', '$colore_scelto')";
    	
             $mysql_result=mysql_query($sql2,$db_conn)
             or die(mysql_error()); 
    
    
    }else{
    	echo "non ci sta";
    }
    1,2,3,4,5,10,100 passi!

  4. #4
    Una domanda.. dal form mando i dati ad una pagina secondaria PHP (ad es: inserisci.php) che fa la query, poi con javascript history.back torno indietro alla pagina principale.

    Come posso evitare il passaggio alla pagina secondaria e rimanere nella pagina principale?



    tnx
    1,2,3,4,5,10,100 passi!

  5. #5
    concordo con piero.mac, anche io ho avuto questa problematica e nn ho trovato soluzioni differenti e piu' ottimizzate. Mi permetto di postare due righe di codice che, forse, rendono la cosa piu' precisa (scritta cosi' di getto, necessita di un po' di type control):

    Codice PHP:

    class TableInfo{

    private 
    $_campi;

    public function 
    __construct($get){

    if(!(
    $get instanceof mysqli_result)) return false;
    $this->_campi $get->fetch_fields();

    }

    public function 
    getUniqueKeyFieldList(){
               
    $uniquekeyfields = array();
                   
    foreach(
    $this->_campi as $field){
     if(
    $field->flags MYSQLI_UNIQUE_KEY_FLAGarray_push($uniquekeyfields$field->name);
    }
    return 
    $uniquekeyfields;
    }

    // End:class 
    Puoi usarla ad esempio cosi':
    Codice PHP:

    $db 
    = new mysqli($host$user$password$database);
    $res $db->query("SELECT * FROM $table LIMIT 0");

    if(
    $info = new TableInfo($res)){
     echo 
    "Campi obbligatori: " join(", "$info->getUniqueFieldList());

    (codice nn testato, un po' di pazienza ^^)

    spero ti possa essere utile! ^_^
    Gabriele B. - http://9thcircle.it

  6. #6
    Originariamente inviato da i_am_antipop
    Una domanda.. dal form mando i dati ad una pagina secondaria PHP (ad es: inserisci.php) che fa la query, poi con javascript history.back torno indietro alla pagina principale.

    Come posso evitare il passaggio alla pagina secondaria e rimanere nella pagina principale?
    ci sono sicuramente metodi migliori, ma questo e' quello cher uso per le pagine piu' semplici. Aggiungi un campo hidden di "controllo" al tuo form, ad esempio:

    codice:
    <input type="hidden" name="controllo" value="modifica">
    Nella pagina php

    Codice PHP:

    switch(@($_REQUEST["controllo"]))){

    "modifica":
    // qui tutte le operazioni da effettuare

    header(Location" . $_SERVER["PHP_SELF"] . "?controllo=ok);
    break:

    "ok":
    echo 
    "operazione eseguita!";

    "":
    default:
    // contenuto normale della pagina
    // ad esempio il form

    Gabriele B. - http://9thcircle.it

  7. #7
    Originariamente inviato da TheClue/Nash
    grazie x le dritte, a prima vista mi sembra codice un po' difficile per me che son alle prime armi.. ma facendo delle prove spero di capirlo meglio!

    ciao!
    1,2,3,4,5,10,100 passi!

  8. #8
    Utente di HTML.it L'avatar di fabi080
    Registrato dal
    Mar 2002
    Messaggi
    442
    Io lo farei in questo modo, metterei il vincolo UNIQUE(nome, colore) nella tabella, e farei comunque l'inserimento con
    @ $r = mysql_query($query);
    Per verificare se l'inserimento è avvenuto oppure no basta un controllo con
    codice:
     
    if (1 == mysql_affected_rows())  {
      // avvenuto
    }
    else {
      // non avvenuto
    }
    D'altronde la clausola UNIQUE serve proprio a questo, inoltre la cosa è più performante in quanto il DBMS si crea un indice sui campi proprio per evitare duplicati.

    Mai fare in in un linguaggio di programmazione quello che può essere implementeto a livello database.


  9. #9
    Originariamente inviato da fabi080
    Io lo farei in questo modo, metterei il vincolo UNIQUE(nome, colore) nella tabella, e farei comunque l'inserimento con

    D'altronde la clausola UNIQUE serve proprio a questo, inoltre la cosa è più performante in quanto il DBMS si crea un indice sui campi proprio per evitare duplicati.

    Mai fare in in un linguaggio di programmazione quello che può essere implementeto a livello database.

    Beh! dissento...

    Se tenti di inserire un doppione in un campo UNIQUE questo rende un errore. Cosa da non fare MAI in un linguaggio di programmmazione. Provocare in modo conscio una segnalazione di errore e' un bug dello script.

    L'errore va sempre evitato e/o prevenuto.

    Fai il campo UNIQUE anche per prevenire intrusioni ed errori di gestione e per avere un indice unico oltre alla chiave primaria. Non per ricevere un errore sistematico in caso di duplicato da script.




    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  10. #10
    Utente di HTML.it L'avatar di fabi080
    Registrato dal
    Mar 2002
    Messaggi
    442
    Originariamente inviato da piero.mac
    Beh! dissento...
    Beh! Permettimi di dissentire dal tuo dissenso...

    Premesso che su vincoo UNIQUE siamo d'accordo, qui invece non mi trovi d'accordo:
    Se tenti di inserire un doppione in un campo UNIQUE questo rende un errore. Cosa da non fare MAI in un linguaggio di programmmazione. Provocare in modo conscio una segnalazione di errore e' un bug dello script.

    L'errore va sempre evitato e/o prevenuto.
    Considera linguaggi di programmazione come il java, o comunque fortemente orientati agli oggetti, una caratteristica quasi immancabile in questi linguaggi sono le eccezioni, un codice del tipo
    codice:
    try {
      oggetto.metodo();
      return 'ok';  
    }
    catch Exception e {
      return 'Fallito';
    }
    è perfettamente normale, anzi è consigliabile in molti casi, quindi che ci vedi di male nel gestire una situazione di errore come condizione di fallimento?

    Per come la vedo io l'operatore @ può essere visto come l'equivalente del try di java, pertanto non vedo cosa c'è di così sbagliato nel codice che ho postato.

    Questione di punti di vista.


Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.