Inserire dati nel database utilizzando un form
Sto scrivendo un semplice plugin che crea una tabella chiamata "newsletter" nel database e fornisce uno shortcode per inserire un form di registrazione nelle pagine. Il form contiene "nome" e "email". Ho problemi con l'inserimento dei dati del form (nome+email) nel database. Ho scritto questo codice:
<?php
$name = $_POST['name'];
$email = $_POST['email'];
function insertuser(){
global $wpdb;
$table_name = $wpdb->prefix . "newsletter";
$wpdb->insert($table_name, array('name' => $name, 'email' => $email) );
}
?>
ma non funziona. Cosa devo fare per ottenere i dati dal form e inserirli nella tabella?
Le due variabili $name e $email non sono riconosciute all'interno della funzione. Devi renderle disponibili globalmente al suo interno cambiando global $wpdb in global $wpdb, $name, $email:
require_once('../../../wp-load.php');
/**
* Dopo il commento di t f riguardo all'uso di global prima della variabile.
* Non necessario (http://php.net/manual/en/language.variables.scope.php)
*/
global $name = $_POST['name'];
global $email = $_POST['email'];
function insertuser(){
global $wpdb, $name, $email;
$table_name = $wpdb->prefix . "newsletter";
$wpdb->insert($table_name, array('name' => $name, 'email' => $email) );
}
insertuser();
Oppure, puoi passare le variabili come argomenti della funzione:
require_once('../../../wp-load.php');
$name = $_POST['name'];
$email = $_POST['email']
function insertuser( $name, $email ) {
global $wpdb;
$table_name = $wpdb->prefix . 'newsletter';
$wpdb->insert( $table_name, array(
'name' => $name,
'email' => $email
) );
}
insertuser( $name, $email );
Oppure, senza funzione:
require_once('../../../wp-load.php');
global $wpdb;
$name = $_POST['name'];
$email = $_POST['email'];
$table_name = $wpdb->prefix . "newsletter";
$wpdb->insert( $table_name, array(
'name' => $name,
'email' => $email
) );
Questo è quello che ho scritto. ;) Ho ancora problemi a capire quando scrivere un commento e quando è sufficiente una risposta. ;) Le variabili devono comunque essere dichiarate global al di fuori della funzione.
tfrommen
Haha, sì ho visto il tuo commento dopo aver pubblicato la mia risposta :-) La mia regola per commentare/rispondere è: se OP deve modificare più di una regola nel codice, rispondi sempre ;-) Aggiungerò global alle variabili $name e $email
Mike Madern
Ah, okay, sembri avere ragione riguardo allo scope (perché in questo caso, al di fuori della funzione è lo scope globale, e non una classe). Tuttavia, se dichiari le variabili global (come hai deciso di fare ora), devi prima dichiararle e poi (nella riga successiva, o dopo un punto e virgola) assegnare un valore.
tfrommen
quando l'utente clicca sul pulsante di invio del form, l'azione del form fa riferimento a un file chiamato: regiostration-form.php in questo file ho questo codice ora:
`<?php $name = $_POST['name']; $email = $_POST['email'];
function insertuser(){ global $wpdb, $name, $email; $table_name = $wpdb->prefix . "newsletter"; $wpdb->insert($table_name, array('name' => $name, 'email' => $email) ); } ?> `
ma non funziona ancora. c'è qualcosa di sbagliato?
pixelweb
Hai chiamato la funzione insertuser() dopo aver dichiarato la funzione?
Mike Madern
definire una funzione non la esegue automaticamente. Devi chiamare la funzione per eseguirla. Vedi il codice nella mia risposta ;-)
Mike Madern
ho usato il tuo codice ma ho ottenuto due errori: Notice: Trying to get property of non-object in line 8 e Fatal error: Call to a member function insert() on a non-object in line 9
pixelweb
Non è un file caricato da WordPress, vero? Includi il file wp-load.php all'inizio del tuo script per caricare la libreria di WordPress.
Mike Madern
ho usato questo codice e ha funzionato bene: <?php
require_once('../../../wp-load.php');
global $wpdb;
$name = $_POST['name'];
$email = $_POST['email'];
$table_name = $wpdb->prefix . "newsletter";
$wpdb->insert( $table_name, array( 'name' => $name, 'email' => $email ) );
?> Grazie a tutti ragazzi, in particolare a Mike Madern
pixelweb
sì, per favore aggiorna la risposta con una soluzione completa, poi la accetterò. Cordiali saluti
pixelweb