web-dev-qa-db-fra.com

Erreur lors de l'insertion d'une valeur de formulaire dans la base de données

salut j'ai décidé de stocker quelques valeurs dans un tableau séparé, donc je l'ai créé et maintenant j'ai utilisé un formulaire pour stocker des valeurs mais quand je traite ce formulaire je reçois une erreur Trying to get property of non-object et Call to a member function insert() on a non-object Même si j'ai déclaré global $wpdb;

Voici le formulaire

<form action="formaction.php" method="post">
    <input type="text" name="name1" value="">
    <input type="text" name="name2" value="">
    <input type="submit" name="submit" value="add">
</form>

formaction.php

if(isset($_POST['name1']))
{
    $db_data1=$_POST['name1'];
}
if(isset($_POST['name2']))
{
    $db_data2=$_POST['name2'];
}
function res()
{
 global $wpdb,$db_data1,$db_data2;
        $my_table_name=$wpdb->prefix."my_table";
        $name1=$db_data1;
        $name2=$db_data2;
        $rows_affected = $wpdb->insert( $my_table_name, array( 'first' => $name1, 'last' => $name2 ) );
}

res();

selon l'erreur $ wpdb n'est pas un objet mais j'ai utilisé global, quel est le bogue dans ce code? Est-ce que je me débrouille correctement?

1
sun

Vous publiez directement sur formaction.php. En tant que tel, WordPress n'est jamais chargé et vous n'avez accès à aucune de ses API, y compris celle de la base de données stockée dans global $wpdb (à l'origine de l'erreur). Je recommande de tout conserver dans WordPress ... et une méthode utile pour la gestion de formulaire consiste à utiliser admin-post.php (si vous connaissez bien la gestion ajax de WordPress, il s'agit d'une idée similaire).

L'idée est que vous postez à l'URL

 .../wp-admin/admin-post.php

que vous pouvez obtenir via admin_url('admin-post.php');. Et vous postez - avec toutes les données et tous les nonces - une uniquevaleur pour la variable action. (Disons wpse111797_form_submitted). Lorsque le formulaire est soumis à admin-post.php, WordPress déclenche le raccordement:

  • admin_post_wpse111797_form_submitted - si vous êtes connecté dans
  • admin_post_nopriv_wpse111797_form_submitted - si vous êtes connecté à la sortie

Donc, votre formulaire pourrait ressembler à:

<form action="<?php echo admin_url('admin-post.php'); ?>" method="post">
    <input type="hidden" name="action" value="wpse111797_form_submitted">

    <input type="text" name="name1" value="">
    <input type="text" name="name2" value="">

    <input type="submit" name="submit" value="add">

</form>

N'oubliez pas d'utiliser des nonces pour vérifier l'intention .

Vous pouvez ensuite accrocher l'un des crochets ci-dessus (ou les deux) selon que vous souhaitez gérer les soumissions de formulaires à partir d'utilisateurs connectés, d'invités ou des deux.

function wpse111797_form_handler(){

   global $wpdb;
   $name1 = isset( $_POST['name1'] ) ? $_POST['name1'] : null;
   $name2 = isset( $_POST['name2'] ) ? $_POST['name2'] : null;

   //TODO Check nonces & permissions first!

   $my_table_name=$wpdb->prefix."my_table";

   $rows_affected = $wpdb->insert( $my_table_name, array( 'first' => $name1, 'last' => $name2 ) );

   //Redirect user to a 'success' page, or from back whence they came!
}

//Attach callback to hook (in this case, the hook for logged-in users)
add_action( 'admin_post_wpse111797_form_submitted', 'wpse111797_form_handler' );
1
Stephen Harris