Inserare date în baza de date folosind un formular

14 mar. 2013, 15:16:20
Vizualizări: 94K
Voturi: 6

Scriu un plugin simplu care creează un tabel numit "newsletter" în baza de date și oferă un shortcode pentru a pune un formular de înregistrare în pagini. Formularul conține câmpurile "nume" și "email". Am o problemă cu inserarea datelor din formular (nume+email) în baza de date. Am scris asta:

<?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) ); 
}
?> 

dar nu funcționează. Ce ar trebui să fac pentru a obține datele din formular și a le insera în tabel?

7
Comentarii

Ai adăugat vreun prefix la tabela de newsletter?

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

unde anume să adaug prefixul? tabela din baza de date are deja prefix

pixelweb pixelweb
14 mar. 2013 15:22:13

înaintea numelui tabelei, pentru că ai folosit în codul tău $table_name = $wpdb->prefix . "newsletter"; care adaugă prefixul WordPress înaintea numelui tabelei newsletter. Dacă nu ai adăugat niciun prefix la numele tabelei, atunci folosește doar numele tabelei astfel: $table_name = "newsletter";

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

Cele două variabile name și email sunt necunoscute în interiorul funcției. Trebuie fie să le definiți în interiorul funcției, fie, dacă sunt necesare în altă parte, să le declarați ca global (atât în afara cât și în interiorul funcției).

tfrommen tfrommen
14 mar. 2013 15:37:56

@VinodDalvi : am adăugat prefixul pentru tabel în baza de date.

pixelweb pixelweb
14 mar. 2013 15:46:58

Am definit name și email în interiorul funcției dar nu s-a întâmplat nimic.

pixelweb pixelweb
14 mar. 2013 15:49:22

Care este prefixul pe care l-ai adăugat la tabel? Spune-mi numele complet al tabelului cu prefix.

Vinod Dalvi Vinod Dalvi
15 mar. 2013 06:09:50
Arată celelalte 2 comentarii
Toate răspunsurile la întrebare 1
12

Cele două variabile $name și $email sunt necunoscute în interiorul funcției. Trebuie să le faci disponibile global în interiorul ei schimbând global $wpdb în global $wpdb, $name, $email:

require_once('../../../wp-load.php');

/**
 * După comentariul lui t f despre folosirea global înaintea variabilei.
 * Nu este necesar (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();

Sau, poți pune variabilele ca argumente ale funcției:

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 );

Sau, fără funcție:

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
Comentarii

Asta am scris și eu. ;) Încă am probleme să decid când să scriu un comentariu și când e suficient un răspuns. ;) Dar variabilele tot trebuie declarate global în afara funcției.

tfrommen tfrommen
14 mar. 2013 15:40:52

Haha, da, am văzut comentariul tău după ce am postat răspunsul :-) Regula mea pentru comentarii/răspunsuri este: dacă OP trebuie să schimbe mai mult de o regulă în cod, mereu răspund ;-) Voi adăuga global la variabilele $name și $email

Mike Madern Mike Madern
14 mar. 2013 15:44:03

Ah, bine, se pare că ai dreptate cu scopul (pentru că în acest caz, în afara funcției este domeniul global, nu o clasă). Totuși, dacă declari variabilele globale (ceea ce ai decis să faci acum), mai întâi trebuie să le declari și apoi (în următoarea linie sau după punct și virgulă) să le setezi o valoare.

tfrommen tfrommen
14 mar. 2013 15:55:42

când utilizatorul apasă pe butonul de trimitere a formularului, acțiunea formularului se referă la un fișier numit: regiostration-form.php în acest fișier am acest cod acum:

`<?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) ); } ?> `

dar nu funcționează din nou. ceva greșit?

pixelweb pixelweb
14 mar. 2013 16:00:01

Ai apelat funcția insertuser() după ce ai declarat funcția?

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

@MikeMadern trebuie să scriu: 'insertuser()' după funcție?

pixelweb pixelweb
14 mar. 2013 16:30:32

definirea unei funcții nu o execută automat. Trebuie să apelezi funcția pentru a o executa. Vezi codul din răspunsul meu ;-)

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

am folosit codul tău dar am primit două erori: Notice: Trying to get property of non-object in line 8 și Fatal error: Call to a member function insert() on a non-object in line 9

pixelweb pixelweb
14 mar. 2013 16:53:35

Nu este un fișier încărcat de WordPress, corect? Folosește require pentru fișierul wp-load.php în partea de sus a scriptului tău pentru a încărca biblioteca WordPress.

Mike Madern Mike Madern
14 mar. 2013 17:16:01

am folosit acest cod și a funcționat perfect: <?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 ) ); ?> Mulțumesc tuturor, în special lui Mike Madern

pixelweb pixelweb
14 mar. 2013 17:23:04

da, te rog actualizează răspunsul cu un răspuns complet și apoi îl voi accepta. Cu sinceritate

pixelweb pixelweb
14 mar. 2013 19:50:17

Ți-am actualizat răspunsul ;)

Mike Madern Mike Madern
15 mar. 2013 09:43:38
Arată celelalte 7 comentarii