Utilizzo di $wpdb->update ma confuso su WHERE e SET

13 feb 2019, 14:32:41
Visualizzazioni: 15.2K
Voti: 2

Sono confuso sull'uso della clausola WHERE in $wpdb->update :/ Queste ultime righe del mio codice dovrebbero aggiornare una tabella con un indirizzo IP quando il software viene attivato. Se l'IP cambia, registra il secondo indirizzo IP. Ora si attiva ma non registra gli IP nella tabella e genera un errore nel log. So che sto fraintendendo l'uso di $wpdb->update. Prima usavo codice MySQL in uno script separato e funzionava, ma ora l'errore è semplicemente una query malformata. L'errore dice: Unknown column '0' in 'where clause' for query UPDATE ma1n_ipn_data_tbl SET 0 = '118.210.134.xxx' WHERE 0 = '1' CODICE: Ecco le righe più chiaramente se il codice sotto è incollato male: http://prntscr.com/mkiukd

Ho bisogno di aiuto, se poteste fornire un esempio di: aggiorna tabella impostando IP a $variabile da getip.php dove item_name = ecc... Grazie :P CODICE:

                          //TUTTO FUNZIONA SOPRA// 
        if ($row->ip_address_01 == 0){ 
         $wpdb->update($ipn_table, array( $row->ip_address_01 = $ipONactivate ),array(($row->payer_email = $serial) && ($row->item_name = $product)));  
    //  $sql=( "UPDATE $ipn_table SET ip_address_01 = $ipONactivate WHERE payer_email = $serial && item_name = $product" ); //VECCHIO CODICE
     } else { 
        if ($row->ip_address_01 !== $ipONactivate && $row->ip_address_02 == 0){
        $wpdb->update($ipn_table, array( $row->ip_address_02 = $ipONactivate),array($row->payer_email = $serial && $row->item_name = $product));    
    //  $sql=( "UPDATE $ipn_table SET ip_address_02 = $ipONactivate WHERE payer_email = $serial && item_name = $product" ); //VECCHIO CODICE
        } else {    
            echo false;
        }
       }                                                        //ERRORE
                        //Unknown column '0' in 'where clause' for query UPDATE `ma1n_ipn_data_tbl` SET `0` = '118.210.134.xxx' WHERE `0` = '1'
0
Tutte le risposte alla domanda 1
2

Devi consultare la documentazione per la funzione, disponibile qui.

La funzione accetta i seguenti argomenti:

  • $table Il nome della tabella.
  • $data Un array PHP dove le chiavi sono le colonne e i valori sono i valori da inserire in quelle colonne.
  • $where Un array PHP dove la chiave è il nome della colonna e il valore è il valore da verificare.

E altri due argomenti opzionali che possono essere usati per forzare i valori del 2° e 3° argomento a essere di certi tipi. Consulta la documentazione per maggiori informazioni su questi.

Quello che hai fatto è mischiare la sintassi PHP e SQL per il 2° e 3° argomento ($row->ip_address_01 = $ipONactivate sta assegnando $ipONactivate a $row->ip_address_01, non creando un array). Stai anche cercando di usare il valore di una colonna di una query precedente (es. $row->ip_address_01) come nome della colonna.

Devi formattare i tuoi argomenti in questo modo:

$wpdb->update(
    $ipn_table,
    array( 
        'ip_address_01' => $ipONactivate
    ),
    array(
        'payer_email' => $serial,
        'item_name'   => $product,
    )
);

Questa funzione aggiornerà la colonna ip_address_01, di qualsiasi riga dove payer_email è $serial e item_name è $product. L'SQL equivalente sarebbe:

$sql = "UPDATE {$ipn_table} SET ip_address_01='{$ipONactivate}' WHERE payer_email='{$serial}' AND item_name='{$product}'";

Il vantaggio della funzione è che ti evita di dover scrivere l'intera query (hai bisogno solo dei nomi delle colonne e dei valori) e inoltre prepara e protegge correttamente i valori per te, così non sarai vulnerabile a SQL injection (cosa che accadrebbe se usassi il mio esempio SQL così com'è).

13 feb 2019 14:52:39
Commenti

Grazie per la spiegazione Jacob. Sia tu che Krzysiek siete stati molto pazienti e utili con chi impara lentamente, e penso che apprezziamo ancora di più le spiegazioni semplicemente perché, credo, la documentazione a volte può sembrare un po' "greca", a seconda della fonte (senza offesa) e i diversi modi di fare la stessa cosa da persone diverse può creare confusione sul web ma tu l'hai spiegato bene.

Non proverò nemmeno il codice finché non lo leggerò, confronterò e capirò. Ancora, grazie. :)

Schmutly Schmutly
14 feb 2019 00:37:58

Wow. Che spiegazione bellissima. Grazie

melvin melvin
10 lug 2023 13:12:35