Cum verific dacă inserarea cu $wpdb->insert() a avut succes?

20 iul. 2016, 22:10:47
Vizualizări: 16.5K
Voturi: 3

Încerc să scriu un mic script în footer.php (pe care ulterior îl voi transforma într-un plugin) care trimite două câmpuri de formular către o tabelă personalizată (wp_newsletter). Deja trimit formularul și scriu în tabelă corect, dar nu știu cum pot trimite înapoi utilizatorului un mesaj de succes sau eșec. Codul meu actual este următorul:

<form method="post">
  <input type="text" name="user_name">Nume
  <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 = "Abonamentul tău a fost trimis.";
    }
  }
  else {
    if ( !is_email($email) ) {
        $message = "Adresă de email invalidă.";
    } elseif ( !isset($name) ) {
        $message = "Câmpul nume este obligatoriu.";
    } else {
        $message = "Atât numele cât și emailul sunt obligatorii.";
    }
  }
} else {
    $message = "Te rugăm să încerci mai târziu.";
}
?>


<?php wp_footer(); ?>

</body>
</html>

Cred că testez corect, conform documentației $wpdb care spune că:

Această funcție returnează false dacă rândul nu a putut fi inserat. Altfel, returnează numărul de rânduri afectate (care va fi întotdeauna 1).

3
Comentarii

Unde doreai să apară mesajul? Ai echo $message înainte ca $message să fie creată.

czerspalace czerspalace
20 iul. 2016 22:22:24

Hm, nu eram sigur dacă pot să o folosesc înainte de declarare... Dar voiam să o afișez sub formular.

vcamargo vcamargo
20 iul. 2016 23:03:10

folosește !== FALSE și încearcă

User User
21 iul. 2016 05:24:07
Toate răspunsurile la întrebare 3
0

Returnează fie numărul de rânduri inserate, fie false în caz de eroare.

Poți obține ID-ul înregistrării inserate sau false dacă inserarea eșuează:

link referință: https://developer.wordpress.org/reference/classes/wpdb/insert/#return

Deci poți verifica astfel:

$result_check = $wpdb->insert( $table, array("name"  => $name, "email" => $email));
if($result_check){
   //inserare reușită
}else{
  //ceva nu a funcționat
}
12 apr. 2019 14:57:56
6

Când am realizat că PHP este un acronim pentru „PHP Hypertext Preprocessor” (Procesor Prehypertext PHP) – cu accent pe „preprocessor” – am înțeles în sfârșit că nu pot amesteca PHP și HTML și să mă aștept la vreo formă de interactivitate cu utilizatorul. Când o pagină web este servită, PHP generează HTML-ul, iar apoi HTML-ul este afișat de browser. Dacă utilizatorul face ceva la care PHP trebuie să răspundă, acesta trebuie să declanșeze o nouă pagină PHP/HTML pentru a oferi un răspuns. (O alternativă ar fi utilizarea AJAX pentru a trimite date în ambele direcții fără a încărca o pagină nouă. WordPress funcționează bine cu AJAX și există tutoriale la distanță de o căutare pe Google.)

Pentru un formular simplu ca al tău, aș folosi JavaScript pentru verificarea erorilor. Dacă formularul nu este completat, împiedică trimiterea acestuia cu JavaScript. Dacă formularul este complet, acțiunea formularului poate fi un fișier .php care inserează datele în baza de date și afișează mesajul de succes/eroare în HTML.

21 iul. 2016 01:04:59
Comentarii

Mulțumesc pentru pont, Scott. Cum aș putea crea un fișier .php care să afișeze utilizatorului mesajul de succes/eroare?

vcamargo vcamargo
21 iul. 2016 03:52:00

Îmi cer scuze pentru răspunsul întârziat. Într-un mediu web, aș seta acțiunea formularului să trimită către un fișier .php. Datele sunt trimise via GET către fișierul țintă. Apoi datele sunt parsate și introduse în baza de date. Fișierul .php apoi generează HTML într-un nou document web care indică succesul sau eșecul. Rețineți că această abordare nu oferă utilizatorului prea multe oportunități de a corecta erorile pentru a obține un rezultat mai bun odată ce noua pagină web este încărcată.

scott scott
25 iul. 2016 19:38:09

În WordPress, totuși, aș considera utilizarea AJAX. Există multe tutoriale bune, și aș căuta și în Codex, dar iată două care au funcționat pentru mine: https://www.smashingmagazine.com/2011/10/how-to-use-ajax-in-wordpress/ și https://premium.wpmudev.org/blog/using-ajax-with-wordpress/

AJAX permite accesul la baza de date fără a încărca o nouă pagină web. Așadar, ai putea avea un element care nu conține HTML până când AJAX returnează rezultatul de succes/eroare: document.getElementById("results-div").innerHTML = content.result;

scott scott
25 iul. 2016 19:42:15

Logica care gestionează formularul se află în același fișier ca și formularul: footer.php. Încerc doar să fac să funcționeze în acest fel, apoi o voi separa mai bine când voi termina testele. Cu toate acestea, nu vreau să trimit datele formularului meu prin metoda GET.

vcamargo vcamargo
25 iul. 2016 23:09:00

Greșeala mea. Poți folosi POST. Se pare că vrei să folosești AJAX în interiorul footer.php pentru a evita reîncărcarea paginii. Va trebui să folosești JavaScript pentru a trimite/primi datele AJAX, dar poți crea un nou fișier .php pentru a gestiona cererea AJAX. (Eu îmi plasez fișierele .php în interiorul unui plugin, astfel încât toate dependențele sunt gestionate de sistemul WP.)

scott scott
25 iul. 2016 23:13:42

Mulțumesc, Scott. Voi citi despre cum ar trebui să postez cu AJAX în WordPress. Nu am nicio idee.

vcamargo vcamargo
25 iul. 2016 23:15:26
Arată celelalte 1 comentarii
0

Am ajuns aici prin Google și ceea ce m-a ajutat a fost utilizarea proprietăților obiectului $wpdb:

$wpdb->last_error 

afișează ultima eroare, dacă există

$wpdb->last_query 

afișează ultima interogare care a generat eroarea menționată mai sus

17 ian. 2018 15:17:17