Pagina 1 di 4 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 39
  1. #1

    ON DUPLICATE KEY UPDATE e PDO non funziona

    Salve a tutti, non capisco il perchè ma la funzione ON DUPLICATE KEY UPDATE con PDO non funziona.
    Ho provato già anche REPLACE INTO ma ogni volta i valori vengono riaggiunti al database preesistente. Ciò che vorrei ottenere è che nel caso in cui all'interno della tabella sia gia presente lo stesso prodotto vengano solamente aggiornati i valori degli altri campi (specialmente il valore quantita). Ho cercato su internet ed ho visto che è un problema comune a molti. Ho tentato vari metodi ma non ho ottenuto risultati. Dove sbaglio? Grazie


    codice:
    $products = [];
        foreach (array_keys($match[2]) as $idx) {
    		
    		$taglia = substr($match[2][$idx],1); // 1 e' il numero di caratteri da rimuovere
            	$products[] = [
                'prodotto'  => $taglia,
                'quantita' => $match[3][$idx],
                'terminale'   => $match[4][$idx]
            ];
        }
    
    
        $pdo = new PDO("mysql:host=$host;dbname=$db_name", $username, $password);
        $query = $pdo->prepare('
        INSERT INTO tabella 
        (prodotto, quantita, terminale) 
        VALUES 
        (:prodotto, :quantita, :terminale)
        ON DUPLICATE KEY UPDATE 
        quantita= :quantita, terminale= :terminale');
    
    
    
    
        $query->bindParam(':prodotto', $prodotto);  
        $query->bindParam(':quantita', $quantita, PDO::PARAM_STR);
        $query->bindParam(':terminale', $terminale, PDO::PARAM_STR);
        $query->execute();
    	
    	
        foreach ($products as $product) {
            $query->execute($product);
        }
    Ultima modifica di supersqualo; 13-09-2017 a 14:36

  2. #2
    mi viene il dubbio sul campo :terminale messo due volte nella query ed uno solo nei bindParam.

    giusto per fare una prova se puoi:
    Codice PHP:
      $pdo = new PDO("mysql:host=$host;dbname=$db_name"$username$password); 
        
    $query $pdo->prepare(
        INSERT INTO tabella  
        (prodotto, quantita, terminale)  
        VALUES  
        (:prodotto, :quantita, :terminale) 
        ON DUPLICATE KEY UPDATE  
        quantita= :quantita2, terminale= :terminale2'
    ); 
     
     
        
    $query->bindParam(':prodotto'$prodotto);   
        
    $query->bindParam(':quantita'$quantitaPDO::PARAM_STR); 
        
    $query->bindParam(':terminale'$terminalePDO::PARAM_STR); 
        
    $query->bindParam(':quantita2'$quantitaPDO::PARAM_STR); 
        
    $query->bindParam(':terminale2'$terminalePDO::PARAM_STR); 
    cmq, a prescindere, che errori hai??

  3. #3
    Grazie fermat per la risposta!

    RETTIFICO in entrambi i casi sia con il mio codice che con il tuo ho quest'errore
    Column 'prodotto' cannot be null
    Ma io non capisco la logica del bind... come funziona? Come puoi vedere io non ho nessuna variabile che si chiami $prodotto, $quantita o $terminale...

    https://stackoverflow.com/questions/...h-named-placeh

    Qui è spiegato ma io non lo riesco a capire...
    Ultima modifica di supersqualo; 13-09-2017 a 17:57

  4. #4
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    Ma quantità é una stringa o un numero ?
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  5. #5
    numero di 5 cifre del tipo 00001 00002 etc.... ma penso che verrà inserito come stringa
    Ultima modifica di supersqualo; 13-09-2017 a 18:38

  6. #6
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    Quote Originariamente inviata da supersqualo Visualizza il messaggio
    Grazie fermat per la risposta!

    RETTIFICO in entrambi i casi sia con il mio codice che con il tuo ho quest'errore
    Column 'prodotto' cannot be null
    Ma io non capisco la logica del bind... come funziona? Come puoi vedere io non ho nessuna variabile che si chiami $prodotto, $quantita o $terminale...

    https://stackoverflow.com/questions/...h-named-placeh

    Qui è spiegato ma io non lo riesco a capire...
    Hai controllato il valore di $prodotto ?
    il bindParam rimpiazza il la pseudo variabile che comincia da : dal valore della variabile php. Potresti anche mettere $pippo se volessu.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2016
    Messaggi
    783
    Prova così:

    Codice PHP:
    foreach (array_keys($match[2]) as $idx) {
            
            
    $taglia substr($match[2][$idx],1); // 1 e' il numero di caratteri da rimuovere
                
    $products[] = [
                
    ':prodotto'  => $taglia,
                
    ':quantita' => $match[3][$idx],
                
    ':terminale'   => $match[4][$idx]
            ];
        } 

    Nell'array che passi ad execute() non hai messo i ":" prima dei nomi.

    Però poi a quel punto questo va tolto:

    Codice PHP:
    $query->bindParam(':prodotto'$prodotto);  
        
    $query->bindParam(':quantita'$quantitaPDO::PARAM_STR);
        
    $query->bindParam(':terminale'$terminalePDO::PARAM_STR);
        
    $query->execute(); 
    Dopo con calma ti scrivo un codice che funzioni, ora sono di corsa.
    Ultima modifica di M4V1; 13-09-2017 a 19:32

  8. #8
    Il forum non mi permette di modificare il messaggio... come mi irrita
    Ultima modifica di supersqualo; 13-09-2017 a 19:52

  9. #9
    Grazie ragazzi...allora:
    Quote Originariamente inviata da badaze Visualizza il messaggio
    Hai controllato il valore di $prodotto ?
    il bindParam rimpiazza il la pseudo variabile che comincia da : dal valore della variabile php. Potresti anche mettere $pippo se volessu.

    Mmm ma io non ho assegnato nessun valore a:
    $prodotto $quantita $terminale $quantita2 $terminale2


    Comunque ho risolto l'errore
    codice:
     Column 'prodotto' cannot be null
    andando a cambiare la struttura delle colonne nel database (poichè, una volta impostato NULL alla colonna prodotto, l'errore compariva anche su le altre 2 colonne).


    Adesso vi spiego meglio la situazione se io uso questo
    codice:
    $products = [];
        foreach (array_keys($match[2]) as $idx) {
            $products[] = [
                'prodotto'  => $match[2][$idx],
                'quantita' => $match[3][$idx],
                'terminale'   => $match[4][$idx]
            ];
        }
    
    
    
    
    
    
    
    
        $pdo = new PDO("mysql:host=$host;dbname=$db_name", $username, $password);
        $query = $pdo->prepare('INSERT INTO tabella (prodotto, quantita, terminale) VALUES (:prodotto, :quantita, :terminale)');
    
    
    
    
        foreach ($products as $product) {
            $query->execute($product);
        }
        ?>
    ?>
    Ovviamente funziona bene ma ogni volta che viene riaperta la pagina tutti i valori vengono reinseriti (anche se già presenti)
    Io invece vorrei che ogni volta che la pagina viene aperta venga aggiornato tutto il db ovvero se sono gia presenti prodotti uguali aggiorna i valori (quantita e terminale) mentre se non ce ne sono li aggiunge




    Quote Originariamente inviata da M4V1 Visualizza il messaggio
    Prova così:


    Codice PHP:
    foreach (array_keys($match[2]) as $idx) {                $taglia substr($match[2][$idx],1); // 1 e' il numero di caratteri da rimuovere            $products[] = [            ':prodotto'  => $taglia,            ':quantita' => $match[3][$idx],            ':terminale'   => $match[4][$idx]        ];    } 



    Nell'array che passi ad execute() non hai messo i ":" prima dei nomi.


    Però poi a quel punto questo va tolto:


    Codice PHP:
    $query->bindParam(':prodotto'$prodotto);      $query->bindParam(':quantita'$quantitaPDO::PARAM_STR);    $query->bindParam(':terminale'$terminalePDO::PARAM_STR);    $query->execute(); 

    Dopo con calma ti scrivo un codice che funzioni, ora sono di corsa.

    Il problema non dovrebbero essere i due punti. Ma se mi scrivi un codice che funziona ti voglio bene lo stesso :P

  10. #10
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    Mmm ma io non ho assegnato nessun valore a:
    $prodotto $quantita $terminale ...
    Appunto. È per questo che non andava bene.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

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.