質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.03%

wordpressでのデータベースの操作のエラー

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,951

SoraSue

score 28

前提・実現したいこと

現在、wordpressでプラグイン"BuddyPress"を使って、SNS制ToDoリストのwebアプリを作っています。ToDoリストでユーザーごとにToDoの表示・追加・削除をできるようにしたいです。今は、wordpressが作ったwp_usermetaテーブルの「user_idカラム」に「ToDoを作成したユーザーのID」を、「meta_keyカラム」に「"ToDoList"」を、「meta_valueカラム」に「ユーザーが入力したToDoリストの内容」を保存するようにしようと考えています。

発生している問題・エラーメッセージ

以下のようなエラーが出ました。

WordPress データベースエラー: []
SELECT id, user_id, field_id, value, last_updated FROM wp_bp_xprofile_data WHERE field_id = 1 AND user_id IN (1)

該当のソースコード

<?php
ini_set( 'display_errors', 1 );
global $wpdb;
$wpdb->show_errors();
$wpdb->print_error();
$MyUserID = bp_get_member_user_id();
$memo = filter_input(INPUT_POST,'memo');
?>
<!doctype html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
        #container{
            margin: 0 auto;
            width: 60%;
        }
        #memo{
            width: 100%;

        }
        .content{
            float: left;
            width: 90%;
            word-wrap: break-word;

        }

        h6{
            color: red;
        }
        li{
            list-style: decimal;
        }
        .MainWelcome{


        }
        .ExplainToDo{
                text-align: center;
        }


        </style>
    </head>
    <body>


    <div id="container">
        <h2 class="ExplainToDo">続くToDoリスト</h4>
        <h6 class="ExplainToDo">*クリックするとそのタスクは消えます。</h6>
        <textarea id="memo" name="memo"></textarea>
        <p>
            <input type="button" id="save" value="保存">
            <input type="button" id="clear" value="全消去">
        </p>
        <ul class="ToDo_Ul">

        </ul>
    </div>
    <script type="text/javascript" src=jquery1.10.1.min.js></script>
    <script type="text/javascript" >
  $(function () {
    function MakeLi(){
    <?php
    $MyToDo = $wpdb->get_results("
    SELECT meta_value
    FROM $wpdb->usermeta
    WHERE user_id = $MyUserID
    AND meta_key = ‘ToDoList’
    ", ARRAY_A );
    $MyToDoList = join(",",$MyToDo->meta_value);


    ?>
    var MyToDoList = "<?= $MyToDoList?>";
    var MyToDo = MyToDoList.split(",");
    $.each(MyToDo, function() {
      $(".ToDo_Ul").prepend("<li class='todo'>" + this + "</li>");
    });
    }
    MakeLi();

    $('#save').click(function(){
        var memo = $('#memo').val();
          if(!memo) return;
        <?php

        $wpdb->insert($wpdb->usermeta, 
           array( 
             'user_id' => $MyUserID, 
             'meta_key' => 'ToDoList',
             'meta_value' => $memo,
           ), 
           array( 
             '%d', '%s', '%s'
               )  
        );
        ?>
        MakeLi();
        $('memo').val('');

    }

    $('.ToDo_Ul').on('click', '.todo', function(){
          <?php
                $wpdb->delete( $wpdb->usermeta, 
                        array( 'user_id' => $MyUserID,
                               'meta_key' => 'ToDoList',
                               'meta_value' => this
                             ), 
                        array( '%d', '%s', '%s') );
          ?>
    MakeLi();
    });

    }
  </script>
</body>
</html>

試したこと

エラーにあったように、

$wpdb->get_results(
        "SELECT id, user_id, field_id, value, last_updated FROM $wpdb->bp_xprofile_data WHERE field_id = 1 AND user_id IN (1)"
        );


というのを追加してみましたが、エラーが出ました。

WordPress データベースエラー: []
SELECT id, user_id, field_id, value, last_updated FROM wp_bp_xprofile_data WHERE field_id = 1 AND user_id IN (1)


Notice: Undefined property: wpdb::$bp_xprofile_data in フォルダ名/wordpress/wp-includes/wp-db.php on line 684
WordPress データベースエラー: [You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE field_id = 1 AND user_id IN (1)' at line 1]
SELECT id, user_id, field_id, value, last_updated FROM WHERE field_id = 1 AND user_id IN (1)

補足情報

現在、ローカル開発環境でサイトを作っているので、サイトをそのまま見せることはできません。曖昧な部分が多いと思いますが、宜しくお願いします。

修正2016/12/31 16:56

Ajaxを使ってコードを書き直してみました。また、ファイルをjsとphpに分けました。今まで出ていたデータベースエラーはなくなりましたが、まだ
データベースからデータを取得・削除したり、データベースに入力されデータを追加したりできません。以下がそのコードです。

<!DOCTYPE HTML>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
        #container{
            margin: 0 auto;
            width: 60%;
        }
        #memo{
            width: 100%;

        }
        .content{
            float: left;
            width: 90%;
            word-wrap: break-word;

        }

        h6{
            color: red;
        }
        li{
            list-style: decimal;
        }
        .MainWelcome{


        }
        .ExplainToDo{
                text-align: center;
        }


        </style>
        <script type="text/javascript" src=jquery1.10.1.min.js></script>
        <script type="text/javascript" >

  (function () {
    function MakeLi(){



        $.ajax({
                type: 'POST',
                url: ajaxurl,
                data: {
                        'action' : 'GetMyToDo',

                      },
        success: function( response ){
                  var MyToDoList = response;
                  var MyToDo = MyToDoList.split(",");
                  $.each(MyToDo, function() {
                  $(".ToDo_Ul").prepend("<li class='todo'>" + this + "</li>");
                  });
                  },


        });


    };
    MakeLi();

    $('#save').click(function(){
        var memo = $('#memo').val();
          if(!memo) return;
        $.ajax({
                type: 'POST',
                url: ajaxurl,
                data: {
                        'action' : 'SaveMyToDo',

                      },
        success: function( response ){
                 }


        });
        MakeLi();
        $('memo').val('');

    });

    $('.ToDo_Ul').on('click', '.todo', function(){
        $.ajax({
                type: 'POST',
                url: ajaxurl,
                data: {
                        'action' : 'DeleteMyToDo',

                      },
       success: function( response ){
                 }


        });
    MakeLi();
    });

 }());
  </script>
    </head>
    <body>
    <div id="container">
        <h2 class="ExplainToDo">続くToDoリスト</h2>
        <h6 class="ExplainToDo">*クリックするとそのタスクは消えます。</h6>
    <form action="bp-custom.php" method="post">
        <textarea id="memo" name="memo"></textarea>
        <p>
            <input type="button" id="save" value="保存">
            <input type="button" id="clear" value="全消去">
        </p>
    </form>
        <ul class="ToDo_Ul">

        </ul>
    </div>
  </body>
</html>
function add_my_ajaxurl() {
?>
    <script>
        var ajaxurl = '<?php echo admin_url( 'admin-ajax.php'); ?>';
    </script>
<?php
}
add_action( 'wp_head', 'add_my_ajaxurl', 1 );

function GetMyToDo(){
    if ( bp_has_members( bp_ajax_querystring( 'members' ) ) ) :
    while ( bp_members() ) : bp_the_member();

    global $wpdb,$bp;
    $MyUserID = $bp->loggedin_user->id;
    $MyToDo = $wpdb->get_results("
    SELECT meta_value
    FROM $wpdb->usermeta
    WHERE user_id = '".$MyUserID."'
    AND meta_key = 'ToDoList'
    ", ARRAY_A );
    $MyToDoList = join(",",$MyToDo->meta_value);
    echo $MyToDoList;
    die();
    endwhile ;
    endif;
}
add_action( 'wp_ajax_GetMyToDo', 'GetMyToDo' );


function SaveMyToDo(){
    if ( bp_has_members( bp_ajax_querystring( 'members' ) ) ) :
    while ( bp_members() ) : bp_the_member();

    global $wpdb,$bp;
    $MyUserID = $bp->loggedin_user->id;
    $memo = filter_input(INPUT_POST, 'memo');
       $wpdb->insert($wpdb->usermeta,
           array(
             'user_id' => '".$MyUserID."',
         'meta_key' => 'ToDoList',
                 'meta_value' => '".$memo."'
           ),
           array(
             '%d',
         '%s',
                 '%s'
               )
        );
    die();
    endwhile ;
    endif;
}
add_action( 'wp_ajax_SaveMyToDo', 'SaveMyToDo' );


function DeleteMyToDo(){
    if ( bp_has_members( bp_ajax_querystring( 'members' ) ) ) :
    while ( bp_members() ) : bp_the_member();
    global $wpdb,$bp;
    $MyUserID = $bp->loggedin_user->id;
    $wpdb->delete( $wpdb->usermeta,
                        array( 'user_id' => '".$MyUserID."',
                               'meta_key' => 'ToDoList',
                               'meta_value' => '".this."'
                             ),
                        array( '%d', '%s', '%s') );
    die();
    endwhile ;
    endif;
}
add_action( 'wp_ajax_DeleteMyToDo', 'DeleteMyToDo' );
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+2

下記部分を「クリック時に $wpdb->insert / $wpdb->delete を実行する」とお考えでしょうか。

    $('#save').click(function(){
        var memo = $('#memo').val();
          if(!memo) return;
        <?php

        $wpdb->insert($wpdb->usermeta, 
           array( 
             'user_id' => $MyUserID, 
         'meta_key' => 'ToDoList',
                 'meta_value' => $memo,
           ), 
           array('%d', '%s', '%s'
               )  
        );

        ?>
        MakeLi();
        $('memo').val('');

    });

    $('.ToDo_Ul').on('click', '.todo', function(){
          <?php
                $wpdb->delete( $wpdb->usermeta, 
                        array( 'user_id' => $MyUserID,
                               'meta_key' => 'ToDoList',
                               'meta_value' => this
                             ), 
                        array( '%d', '%s', '%s') );
                ?>
    MakeLi();
    });

その場合誤りです。WordPressというより、PHPはブラウザからのアクセスで実行され、その結果をHTMLとしてブラウザに送ります。JavaScriptはそのブラウザ上で実行されるため、処理を混ぜるような書き方はできません。

WordPressでAjaxを使う方法は「wordpress ajax」で検索すれば下記のようなサイトが出てくるので、わかりやすいものを探されてはいかがでしょうか。

【WordPressでAjaxを使う方法の解説 | hijiriworld Web】
http://hijiriworld.com/web/wordpress-ajax/

【» wordpressで使ってみるajaxの基本】
http://unskilled.site/wordpressで使ってみるajaxの基本/

【WordPressでajaxを使う | FAIRWAY Engineer {Blog}】
http://dev.blog.fairway.ne.jp/wordpress-ajax/

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/31 17:26

    わざわざURLまで教えてくださりありがとうございます!
    Ajaxについて調べてみました。
    一度ファイルをajaxを使って書き換えてみたので、また上の質問の「修正」のところをご覧下さい。

    キャンセル

  • 2016/12/31 17:42

    「うまくいきません」という文言には、情報がありません。
    Ajaxで指定したな関数を呼び出し、そこからのレスポンスを正しく受け取れていますか?
    PHPの関数は変数部分を固定値に変えて、それ自身動きますか?
    それぞれの時点で変数を正しく取得できていますか?

    機能は分割して少しずつ作成したほうがいいですよ。

    キャンセル

checkベストアンサー

+1

$MyUserIDに値は入ってますか?
bp_get_member_user_id()はループの中で使う必要のある関数ですが、ループの中で使われていますか?

$MyUserID = bp_get_member_user_id();
?><pre><?php var_dump($MyUserID); ?></pre><?php

追記

「BuddyPressのループ」に関する参考URL
https://codex.buddypress.org/developer/loops-reference/
https://codex.buddypress.org/developer/loops-reference/the-members-loop/
https://codex.buddypress.org/developer/loops-reference/the-profile-fields-loop-bp_has_profile/

「WordPressのループ」に関する参考URL
https://wpdocs.osdn.jp/%E3%83%AB%E3%83%BC%E3%83%97

同じ問題で困っていた人のトピック
https://buddypress.org/support/topic/bp_get_member_user_id-returns-false/

追記

ようやく動いた。

functions.php

function add_my_ajaxurl() {
?>
    <script>
        var ajaxurl = '<?php echo admin_url( 'admin-ajax.php'); ?>';
    </script>
<?php
}
add_action( 'wp_head', 'add_my_ajaxurl', 1 );

function GetMyToDo(){
    if ( bp_has_members( bp_ajax_querystring( 'members' ) ) ) {
        while ( bp_members() ) {
            bp_the_member();
            global $wpdb,$bp;
            $MyUserID = $bp->loggedin_user->id;
            $MyToDo = $wpdb->get_results("
                        SELECT meta_value
                        FROM $wpdb->usermeta
                        WHERE user_id = $MyUserID
                        AND meta_key = 'ToDoList'
            ", ARRAY_A );

            foreach($MyToDo as $item) {
                $MyToDoList[] = $item['meta_value'] ? $item['meta_value'] : "NULL";
            }

            $MyToDoList = join(",",$MyToDoList);
            echo $MyToDoList;
            die();
        }
    }
}
add_action( 'wp_ajax_GetMyToDo', 'GetMyToDo' );

function SaveMyToDo(){
    if ( bp_has_members( bp_ajax_querystring( 'members' ) ) ){
        while ( bp_members() ){
            bp_the_member();
            global $wpdb,$bp;
            $MyUserID = $bp->loggedin_user->id;
            $memo = filter_input(INPUT_POST, 'memo');
            $wpdb->insert($wpdb->usermeta,
                array(
                    'user_id' => $MyUserID,
                    'meta_key' => 'ToDoList',
                    'meta_value' => $memo
                ),
                array(
                    '%d',
                    '%s',
                    '%s'
                )
            );
        }
    }
}
add_action( 'wp_ajax_SaveMyToDo', 'SaveMyToDo' );

function DeleteMyToDo(){
    if ( bp_has_members( bp_ajax_querystring( 'members' ) ) ){
        while ( bp_members() ){
            bp_the_member();
            global $wpdb,$bp;
            $MyUserID = $bp->loggedin_user->id;
            $memo = filter_input(INPUT_POST, 'memo');
            var_dump($MyUserID);
            var_dump($memo);
            $wpdb->delete( $wpdb->usermeta,
                array( 'user_id' => $MyUserID,
                    'meta_key' => 'ToDoList',
                    'meta_value' => $memo
                ),
                array(
                    '%d',
                    '%s',
                    '%s'
                )
            );
        }
    }
}
add_action( 'wp_ajax_DeleteMyToDo', 'DeleteMyToDo' );

index.php

<?php
    wp_head();
?>
<style type="text/css">
    #container{
        margin: 0 auto;
        width: 60%;
    }
    #memo{
        width: 100%;
    }
    .content{
        float: left;
        width: 90%;
        word-wrap: break-word;
    }
    h6{
        color: red;
    }
    li{
        list-style: decimal;
    }
    .MainWelcome{
    }
    .ExplainToDo{
        text-align: center;
    }
</style>
<script type="text/javascript">
jQuery(function() {
    function MakeLi(){
        jQuery.ajax({
            type: 'POST',
            url: ajaxurl,
            data: { 'action' : 'GetMyToDo',},
            success: function( response ){
                var MyToDoList = response;
                var MyToDo = MyToDoList.split(",");
                jQuery.each(MyToDo, function() {
                    jQuery(".ToDo_Ul").prepend("<li class='todo'>" + this + "</li>");
                });
            }
        });
    }
    MakeLi();

    jQuery('#save').on('click', function(){
        var memo = jQuery('#memo').val();
        if(!memo) return;
        jQuery.ajax({
            type: 'POST',
            url: ajaxurl,
            data: {
                'action' : 'SaveMyToDo',
                'memo' : memo
            },
            success: function( response ){
                jQuery(".ToDo_Ul").prepend("<li class='todo'>" + memo + "</li>");
                jQuery('#memo').val('');
            }
        });
    });

    jQuery('.ToDo_Ul').on('click', '.todo', function(){
        var item = this;
        jQuery.ajax({
            type: 'POST',
            url: ajaxurl,
            data: {
                'action' : 'DeleteMyToDo',
                'memo' : item.innerHTML
            },
            success: function( response ){
                item.remove();
            }
        });
    });
});
</script>


<div id="container">
    <h2 class="ExplainToDo">続くToDoリスト</h2>
    <h6 class="ExplainToDo">*クリックするとそのタスクは消えます。</h6>
    <form action="" method="post">
        <textarea id="memo" name="memo"></textarea>
        <p>
            <input type="button" id="save" value="保存">
            <input type="button" id="clear" value="全消去">
        </p>
    </form>
    <ul class="ToDo_Ul">

    </ul>
</div>

<?php wp_footer(); ?>

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/31 16:56

    すみません。確かにそうですね。
    Ajaxについて調べてみました。
    Ajaxを使って書き換えたコードを質問の修正に記しておきます。

    キャンセル

  • 2016/12/31 18:12

    各ボタンを押して対応する関数が呼び出されるかや、admin-ajax.phpが読み込まれているかなどは確認済みですか?

    キャンセル

  • 2016/12/31 23:54

    わざわざコードまで書いていただきありがとうございます!
    mizさんの意見を参考に自分でもコードを幾つか直してみました。
    データを保存・削除する機能をつけるのには成功したのですが、今まで作ったToDoを表示させる機能はできませんでした。
    mizさんの機能と比較させていただいたところ、
    $MyToDoList[] = $item['meta_value'] ? $item['meta_value'] : "NULL";
    の部分がないことが原因とわかりました。
    mizさんにはここまで本当にお世話になりました。とても感謝しています!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる