Insertar datos en la base de datos usando un formulario

14 mar 2013, 15:16:20
Vistas: 94K
Votos: 6

Estoy escribiendo un plugin simple que crea una tabla llamada "newsletter" en la base de datos y proporciona un shortcode para colocar un formulario de registro en las páginas. El formulario contiene "nombre" y "email". Tengo problemas con la inserción de los datos del formulario (nombre+email) en la base de datos. Escribí esto:

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

pero no funciona. ¿Qué debo hacer para obtener los datos del formulario e insertarlos en la tabla?

7
Comentarios

¿Has añadido algún prefijo a la tabla de newsletter?

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

¿añadiendo prefijo exactamente dónde? La tabla en la base de datos tiene prefijo

pixelweb pixelweb
14 mar 2013 15:22:13

antes del nombre de la tabla porque has usado esto $table_name = $wpdb->prefix . "newsletter"; en tu código lo cual añade el prefijo de wordpress antes del nombre de la tabla newsletter, así que si no has añadido ningún prefijo al nombre de la tabla entonces solo usa el nombre de la tabla así: $table_name = "newsletter";

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

Las dos variables name y email son desconocidas dentro de la función. Tienes que definirlas dentro de la función o, si se necesitan en otro lugar, declararlas como global (tanto fuera como dentro de la función).

tfrommen tfrommen
14 mar 2013 15:37:56

@VinodDalvi: agregué el prefijo para la tabla en la base de datos.

pixelweb pixelweb
14 mar 2013 15:46:58

Definí el name y email dentro de la función pero no pasa nada.

pixelweb pixelweb
14 mar 2013 15:49:22

¿Qué prefijo has añadido a la tabla? Dime el nombre completo de la tabla con el prefijo.

Vinod Dalvi Vinod Dalvi
15 mar 2013 06:09:50
Mostrar los 2 comentarios restantes
Todas las respuestas a la pregunta 1
12

Las dos variables $name y $email son desconocidas dentro de la función. Debes hacerlas disponibles globalmente dentro de ella cambiando global $wpdb por global $wpdb, $name, $email:

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

/**
 * Después del comentario de t f sobre poner global antes de la variable.
 * No es necesario (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();

O bien, puedes colocar las variables en los argumentos de la función:

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

O bien, sin función:

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
Comentarios

Eso es lo que escribí. ;) Todavía tengo dudas sobre cuándo escribir un comentario y cuándo es suficiente con una respuesta. ;) Sin embargo, las variables aún deben declararse como global fuera de la función.

tfrommen tfrommen
14 mar 2013 15:40:52

Jaja, sí vi tu comentario después de publicar mi respuesta :-) Mi regla para comentar/responder es: si el OP tiene que cambiar más de una cosa en el código, siempre responder ;-) Añadiré global a las variables $name y $email

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

Ah, vale, parece que tienes razón con el alcance (porque en este caso, fuera de la función es el alcance global, y no una clase). Sin embargo, si declaras las variables como globales (lo que has decidido hacer ahora), primero debes declararlas y luego (en la siguiente línea, o después de un punto y coma) asignar un valor.

tfrommen tfrommen
14 mar 2013 15:55:42

cuando el usuario hace clic en enviar formulario, la acción del formulario hace referencia a un archivo llamado: regiostration-form.php en este archivo tengo este código ahora:

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

pero no funciona de nuevo. ¿hay algo mal?

pixelweb pixelweb
14 mar 2013 16:00:01

¿Estás llamando a la función insertuser() después de declarar la función?

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

@MikeMadern ¿tengo que escribir: 'insertuser()' después de la función?

pixelweb pixelweb
14 mar 2013 16:30:32

definir una función no la ejecuta automáticamente. Tienes que llamar a la función para que se ejecute. Mira el código en mi respuesta ;-)

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

usé tu código pero obtuve dos errores: Notice: Trying to get property of non-object in line 8 y Fatal error: Call to a member function insert() on a non-object in line 9

pixelweb pixelweb
14 mar 2013 16:53:35

¿No es un archivo cargado por WordPress, verdad? Haz require del archivo wp-load.php al principio de tu script para cargar la biblioteca de WordPress.

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

usé este código y funcionó bien: <?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 ) ); ?> Gracias a todos, especialmente a Mike Madern

pixelweb pixelweb
14 mar 2013 17:23:04

sí, por favor actualiza la respuesta con la solución completa y entonces la aceptaré. Sinceramente

pixelweb pixelweb
14 mar 2013 19:50:17

Actualicé mi respuesta para ti ;)

Mike Madern Mike Madern
15 mar 2013 09:43:38
Mostrar los 7 comentarios restantes