web-dev-qa-db-ja.com

データベースにフォーム値を挿入する際のエラー

こんにちは、私はいくつかの値を別のテーブルに保存することを決めたので、それを作成し、値を保存するためにフォームを使用しましたが、そのフォームを処理するとエラーTrying to get property of non-objectおよびCall to a member function insert() on a non-objectが発生しますglobal $wpdb;を宣言しました

こちらがフォームです

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

エラーによると、$ wpdbはオブジェクトではありませんが、グローバルを使用しましたが、このコードのバグは何ですか?私は正しくやっていますか?

1
sun

WordPressはロードされず、formaction.phpに格納されているデータベースAPI(これがエラーの原因となっている)を含むそのAPIのいずれにもアクセスできないため、あなたはglobal $wpdbに直接投稿しています。私はすべてをWordPressに保存することをお勧めします...そしてフォーム処理のための便利な方法はadmin-post.phpを使うことです(もしあなたがWordPressのajax処理に慣れているなら - これも同様の考えです)。

アイデアはあなたがURLに投稿するということです

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

これはadmin_url('admin-post.php');経由で取得できます。そして、あなたは、どんなデータやナンスも含めて - 変数actionuniqueの値をポストします。 (wpse111797_form_submittedと言いましょう)。フォームがadmin-post.phpに送信されると、WordPressはフックを起動します。

  • admin_post_wpse111797_form_submitted - ログインしている場合in
  • admin_post_nopriv_wpse111797_form_submitted - ログインしている場合out

だからあなたのフォームはこんな感じになるでしょう:

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

意図を検証するために ノンス を使うことを忘れないでください

ログインしたユーザー、ゲスト、またはその両方からのフォーム送信を処理するかどうかに応じて、上記のいずれかのフック(またはその両方)にフックできます。

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