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

    Strano comportamento script PHP con SQL UPDATE

    Ragazzi sto lavorando ad un sito ed ho un problema stranissimo con lo script di modifica di un prodotto presente nel database!
    In pratica lo script funziona benissimo se modifico anche solo uno dei campi del form, ad esempio cambio una vocale nel nome, insomma l'update avviene senza problemi, se invece non cambio nulla, nemmeno una virgola nei campi del form, allora l'UPDATE fallisce! La cosa strana e che se eseguo la stessa query sul database direttamente dal client "mysql" l'update sulla riga avviene senza errori anche se i valori sono esattamente gli stessi, insomma non c'è alcun errore SQL ma la funzione mysql_affected_rows() mi torna comunque 0 invece che 1.

    Lo script è questo:
    Codice PHP:
        require('./database.inc.php');
        
    /* Lettura parametri dal form */
        
    $nome $_POST['nomeProdotto'];
        
    $desc $_POST['descrProdotto'];
        
    $ma $_POST['macro_area'];
        
    $modificato false;
        
    /* Memorizza informazioni sulla categoria */
        
    if (isset($_POST['cbAddCat'])) {
            
    $ncat $_POST['nCategoria'];
            
    $query "SELECT id FROM categoria WHERE descr = '$ncat'";
            
    $result mysql_query($query$conn);
            if (
    mysql_num_rows($result) == 1) {
                
    $row mysql_fetch_array($result);
                
    $cat $row['id'];
            } else {
                
    $cat = -1;
            }
            
    mysql_free_result($result);
        } else {
            
    $cat intval($_POST['categoria']);
            
    $ncat "";
        }
        
    /* Memorizza informazioni sulla sub-categoria */
        
    if (isset($_POST['cbAddSubCat'])) {
            
    $nsub $_POST['nSubCategoria'];
            
    $query "SELECT id FROM sub_categoria WHERE descr = '$nsub'";
            
    $result mysql_query($query$conn);
            if (
    mysql_num_rows($result) == 1) {
                
    $row mysql_fetch_array($result);
                
    $sub $row['id'];
            } else {
                
    $sub = -1;
            }
            
    mysql_free_result($result);
        } else {
            
    $sub = (isset($_POST['sub_categoria'])) ? intval($_POST['sub_categoria']) : 0;
            
    $nsub "";
        }
        
    /* Memorizza le informazioni relative al prezzo del prodotto! */
        
    $przz = (isset($_POST['cbAddPrezzo']) || isset($_POST['prezzoProdotto'])) ? doubleval($_POST['prezzoProdotto']) : 0;
        
        
    /* Escuzione della query di modifica di un prodotto nella base di dati! */
        
    if (isset($_POST['modProdotto'])) {
            
    $idProdotto $_POST['idProdotto'];
            
           if (
    $cat == -1) {
                
    $query "INSERT INTO categoria (descr, idma) VALUES ('$ncat',$ma)";
                
    mysql_query($query$conn);
                
    $query "SELECT LAST_INSERT_ID()";
                
    $result mysql_query($query,$conn);
                if (
    mysql_num_rows($result) == 1) {
                    
    $row mysql_fetch_row($result);
                    
    $cat $row[0];
                }
                
    mysql_free_result($result);
            }
      
            if (
    $sub == -1) {
                
    $query "INSERT INTO sub_categoria (descr, idma, idcat) VALUES ('$nsub',$ma$cat)";
                
    mysql_query($query$conn);
                
    $query "SELECT LAST_INSERT_ID()";
                
    $result mysql_query($query,$conn);
                if (
    mysql_num_rows($result) == 1) {
                    
    $row mysql_fetch_row($result);
                    
    $sub $row[0];
                }
                
    mysql_free_result($result);
            }
            
            if (
    $sub == 0) {
                
    $sub "null";
            }
            
            
    $query "UPDATE prodotto SET nome = '$nome', descr = '$desc', price = $przz
                      idma = 
    $ma, idcat = $cat, idsubcat = $sub WHERE id = $idProdotto";
            
    mysql_query($query,$conn);
            
            if (
    mysql_affected_rows() == 1) {
                
    $url "Location: ./insert.php?modificato=true";
                
    $modificato true;
            } else {
                
    $url "Location: ./insert.php?modificato=false";    
            }
        } 
    Non so se lo script è abbastanza chiaro.. ma comunque la modifica alla flag "$modificato" avviene nell'ultimo if, i controlli sopra sono necessari per la corretta impostazione delle variabili e stampando la query i valori sono corretti.
    Non riesco proprio a capire il perché l'UPDATE non va a buon fine se non modifico alcun parametro del form....

    Qualcuno mi sa dare qualche consiglio? Ci sbatto la testa da ore ma niente da fare non riesco a capire cosa possa essere...

    Saluti, Carlo.

  2. #2
    Utente di HTML.it L'avatar di m4rko80
    Registrato dal
    Aug 2008
    residenza
    Milano
    Messaggi
    2,655
    Perche' affected_row torna il numero di record modificati e anche se la query viene eseguita ma i valori non cambiano le modifiche effettive non ci sono state perche' i dati sono identici.

    Se non error torna 0 se non ci sono modifiche e potresti usarlo al posto di 1 o cmq nell if controlli che sia 0 o superiore.

    se -1(fallisce allora fai il resto)

    edit http://www.php.net/manual/en/functio...ected-rows.php se guardi qui alla fine lo dice. In caso di nessun cambiamento puo' non tornare il numero di record

  3. #3
    Ah quindi il problema dovrebbe essere questo? Io ho provato la query con Toad MySQL e mi diceva dopo la query, anche se i dati sono identici, "1 rows affected" e quindi pensavo che quindi anche la funzione mysq_affected_rows() ritornasse lo stesso valore!

    Controllando il ritorno della funzione nelle API, l'errore è solo quando torna -1, altrimenti torna il numero di query modificate. A questo punto dovrebbe essere come dici tu e quindi torna 0 perché non c'è un effettiva modifica! Metto il controlla con "<> -1" e dovrei aver risolto.

    Grazie mille, non sai da quanto tempo ci pensavo ma Toad mi aveva fregato con il suo output e non ci ho proprio pensato a controllare la funzione...

    Saluti, Carlo.

  4. #4
    Utente di HTML.it L'avatar di m4rko80
    Registrato dal
    Aug 2008
    residenza
    Milano
    Messaggi
    2,655
    Non so se -1 viene confrontato come intero prova!

    cmq al massimo sai che con -1 e' fallita e == 0 o > 0 ha fatto qualcosa. Il client db probabilmenta funziona a modo suo.

  5. #5
    Provato adesso m4rko80!
    Sembra andare, nel senso che ho messo come condizione dell'if (mysql_affected_rows() != -1) e pare che vada, magari creo casino nella query così vedo se mi da l'altro output, quello dell'else insomma, se va bene lascio così altrimenti faccio come dici con un AND.

    Grazie ancora! Ciao.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.