Come verificare se $wpdb->insert() ha avuto successo in WordPress?

20 lug 2016, 22:10:47
Visualizzazioni: 16.5K
Voti: 3

Sto cercando di scrivere un piccolo script all'interno del mio footer.php (che trasformerò successivamente in un plugin) che invia due campi di un form a una tabella personalizzata (wp_newsletter). Riesco già a inviare il form e scrivere nella tabella correttamente, ma non so come posso inviare un messaggio di successo o errore all'utente. Il mio codice attuale è il seguente:

<form method="post">
  <input type="text" name="user_name">Nome
  <input type="text" name="user_email">Email
  <input type="submit">
  <?php echo $message;  ?>
</form>

<?php
global $wpdb;
$table   = $wpdb->prefix . "newsletter";
$name    = sanitize_text_field( $_POST["user_name"] );
$email   = sanitize_email( $_POST["user_email"] );
$message = "";


if( isset($_POST["submit"]) ) {
  if ( is_email($email) && isset($name)) {
    if ( $wpdb->insert( $table, array("name"  => $name, "email" => $email)) != false ) {
      $message = "La tua iscrizione è stata inviata.";
    }
  }
  else {
    if ( !is_email($email) ) {
        $message = "Indirizzo email non valido.";
    } elseif ( !isset($name) ) {
        $message = "Il campo nome è obbligatorio.";
    } else {
        $message = "Entrambi i campi nome ed email sono obbligatori.";
    }
  }
} else {
    $message = "Per favore, riprova più tardi.";
}
?>


<?php wp_footer(); ?>

</body>
</html>

Penso di stare testando correttamente, come indicato dalla documentazione di $wpdb che afferma:

Questa funzione restituisce false se la riga non può essere inserita. Altrimenti, restituisce il numero di righe interessate (che sarà sempre 1).

3
Commenti

Dove volevi che apparisse il messaggio? Hai il tuo echo $message prima che $message venga creato.

czerspalace czerspalace
20 lug 2016 22:22:24

Hm, non ero sicuro se potessi usarlo prima della dichiarazione... Ma volevo mostrarlo sotto il form.

vcamargo vcamargo
20 lug 2016 23:03:10

usa questo !== FALSE e prova

User User
21 lug 2016 05:24:07
Tutte le risposte alla domanda 3
0

Restituisce il numero di righe inserite oppure false in caso di errore.

Puoi ottenere l'id del record inserito oppure false se l'inserimento fallisce:

link di riferimento: https://developer.wordpress.org/reference/classes/wpdb/insert/#return

Quindi puoi verificare come mostrato di seguito:

$result_check = $wpdb->insert( $table, array("name"  => $name, "email" => $email));
if($result_check){
   //inserimento avvenuto con successo
}else{
  //qualcosa è andato storto
}
12 apr 2019 14:57:56
6

Quando ho capito che PHP è un acronimo per "PHP Hypertext Preprocessor" – con enfasi su "preprocessor" – ho finalmente realizzato che non posso mescolare PHP e HTML e aspettarmi una qualsiasi forma di interattività con l'utente. Quando una pagina web viene servita, il PHP genera l'HTML che poi viene visualizzato dal browser. Se l'utente compie un'azione a cui il PHP deve rispondere, deve necessariamente attivare una nuova pagina PHP/HTML per fornire una risposta. (Un'alternativa sarebbe usare AJAX per inviare dati avanti e indietro senza caricare una nuova pagina. WordPress funziona bene con AJAX e ci sono tutorial a portata di una ricerca su Google.)

Per un modulo semplice come il tuo, userei JavaScript per il controllo degli errori. Se il modulo non è compilato, impedisci l'invio con JS. Se il modulo è completo, l'azione del modulo può puntare a un file .php che si occupa dell'inserimento nel database e mostra il messaggio di successo/fallimento in HTML.

21 lug 2016 01:04:59
Commenti

Grazie per il consiglio, scott. Come potrei creare un file .php che mostri all'utente un messaggio di successo/fallimento?

vcamargo vcamargo
21 lug 2016 03:52:00

Scusa per il ritardo nella risposta. In un ambiente web, farei in modo che l'action del form punti a un file .php. I dati vengono inviati via GET al file di destinazione. I dati vengono poi analizzati e inseriti nel DB. Quindi il file .php genera HTML in un nuovo documento web che indica successo o fallimento. Nota che questo non dà all'utente molte opportunità di correggere gli errori per ottenere un risultato migliore una volta che la nuova pagina web è stata caricata.

scott scott
25 lug 2016 19:38:09

In WordPress, tuttavia, considererei di provare AJAX. Ci sono molti buoni tutorial, e darei un'occhiata anche al Codex, ma ecco due che hanno funzionato per me: https://www.smashingmagazine.com/2011/10/how-to-use-ajax-in-wordpress/ e https://premium.wpmudev.org/blog/using-ajax-with-wordpress/

AJAX consente l'accesso al DB senza caricare una nuova pagina web. Quindi avresti un elemento che non ha contenuto HTML fino a quando AJAX non restituisce successo/fallimento: document.getElementById("results-div").innerHTML = content.result;

scott scott
25 lug 2016 19:42:15

La logica che gestisce il modulo si trova nello stesso file del modulo: il footer.php. Sto solo cercando di farlo funzionare in questo modo, poi posso separarlo meglio quando avrò finito con i test. Nonostante ciò, non voglio inviare i dati del mio modulo tramite GET.

vcamargo vcamargo
25 lug 2016 23:09:00

Mio errore. Puoi usare POST. Sembra che tu voglia fare AJAX all'interno di footer.php in modo da non causare un ricaricamento della pagina. Dovrai usare javascript per inviare/ricevere i dati AJAX, ma puoi creare un nuovo file .php per gestire la chiamata AJAX. (Io metto i miei file .php all'interno di un plugin in modo che tutte le dipendenze siano gestite dal sistema WP.)

scott scott
25 lug 2016 23:13:42

Grazie, scott. Leggerò come dovrei fare il POST con AJAX all'interno di WP. Non ne ho idea.

vcamargo vcamargo
25 lug 2016 23:15:26
Mostra i restanti 1 commenti
0

Sono arrivato qui tramite Google e ciò che mi ha aiutato è stato utilizzare le proprietà dell'oggetto $wpdb:

$wpdb->last_error

mostra l'ultimo errore se presente

$wpdb->last_query

mostra l'ultima query che ha generato l'errore sopra

17 gen 2018 15:17:17