Inserire dati nel database utilizzando un form

14 mar 2013, 15:16:20
Visualizzazioni: 94K
Voti: 6

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?

7
Commenti

Hai aggiunto qualche prefisso alla tabella della newsletter?

Vinod Dalvi Vinod Dalvi
14 mar 2013 15:20:48

aggiungere il prefisso esattamente dove? La tabella nel database ha già un prefisso

pixelweb pixelweb
14 mar 2013 15:22:13

prima del nome della tabella perché hai usato questo $table_name = $wpdb->prefix . "newsletter"; nel tuo codice che aggiunge il prefisso di WordPress prima del nome della tabella newsletter, quindi se non hai aggiunto alcun prefisso al nome della tabella usa semplicemente il nome della tabella così $table_name = "newsletter";

Vinod Dalvi Vinod Dalvi
14 mar 2013 15:35:29

Le due variabili name e email sono sconosciute all'interno della funzione. Devi definirle all'interno della funzione oppure, se sono necessarie altrove, dichiararle come global (sia fuori che dentro la funzione).

tfrommen tfrommen
14 mar 2013 15:37:56

@VinodDalvi : ho aggiunto il prefisso per la tabella nel database.

pixelweb pixelweb
14 mar 2013 15:46:58

Ho definito name e email all'interno della funzione ma non succede nulla.

pixelweb pixelweb
14 mar 2013 15:49:22

Qual è il prefisso che hai aggiunto alla tabella? Dimmi il nome completo della tabella con prefisso.

Vinod Dalvi Vinod Dalvi
15 mar 2013 06:09:50
Mostra i restanti 2 commenti
Tutte le risposte alla domanda 1
12

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
) );
14 mar 2013 15:38:28
Commenti

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 tfrommen
14 mar 2013 15:40:52

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 Mike Madern
14 mar 2013 15:44:03

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 tfrommen
14 mar 2013 15:55:42

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 pixelweb
14 mar 2013 16:00:01

Hai chiamato la funzione insertuser() dopo aver dichiarato la funzione?

Mike Madern Mike Madern
14 mar 2013 16:02:00

@MikeMadern devo scrivere: 'insertuser()' dopo la funzione?

pixelweb pixelweb
14 mar 2013 16:30:32

definire una funzione non la esegue automaticamente. Devi chiamare la funzione per eseguirla. Vedi il codice nella mia risposta ;-)

Mike Madern Mike Madern
14 mar 2013 16:44:46

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 pixelweb
14 mar 2013 16:53:35

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 Mike Madern
14 mar 2013 17:16:01

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 pixelweb
14 mar 2013 17:23:04

sì, per favore aggiorna la risposta con una soluzione completa, poi la accetterò. Cordiali saluti

pixelweb pixelweb
14 mar 2013 19:50:17

Ho aggiornato la mia risposta per te ;)

Mike Madern Mike Madern
15 mar 2013 09:43:38
Mostra i restanti 7 commenti