質問編集履歴

4 現在の問題点をより詳細に書きました。

SoraSue

SoraSue score 24

2016/12/31 18:01  投稿

wordpressでのデータベースの操作のエラー
###前提・実現したいこと
現在、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
<?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>
```
###試したこと
エラーにあったように、
```php
$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に分けました。今まで出ていたデータベースエラーはなくなりましたが、まだうまくいきません。以下がそのコードです。
Ajaxを使ってコードを書き直してみました。また、ファイルをjsとphpに分けました。今まで出ていたデータベースエラーはなくなりましたが、まだ
データベースからデータを取得・削除したり、データベースに入力されたデータを追加したりできません。以下がそのコードです。
```javascript
<!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>
```
```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 );
   $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' );
```
  • PHP

    24437 questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • MySQL

    7107 questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

  • WordPress

    9090 questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

3 ファイルをjavascriptとphpに分けて、ajaxを利用しました。

SoraSue

SoraSue score 24

2016/12/31 17:13  投稿

wordpressでのデータベースの操作のエラー
###前提・実現したいこと
現在、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
<?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>
```
###試したこと
エラーにあったように、
```php
$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/30 23:34
HTMLが2回表示される問題は、whileループの位置を変えることで解決しました。教えてくださったmizさん、ありがとうございます。
以下が変更したコードです。whileループを<script>の前に持って行きました。
```php
<?php
ini_set( 'display_errors', 1 );
if ( bp_has_members( bp_ajax_querystring( 'members' ) ) ) :
   while ( bp_members() ) : bp_the_member();
global $wpdb;
global $bp;
$wpdb->show_errors();
$wpdb->print_error();
/*$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)"
       );*/
//$wpdb->query( "SELECT user_id, meta_key, meta_value FROM $wpdb->usermeta "
 //     . "WHERE meta_key IN ('total_friend_count','bp_latest_update') AND user_id IN (1,3)"
//$MyUserID = $bp->loggedin_user->id;
/*$prepared_sql = $wpdb->prepare(
”INSERT INTO $wpdb->usermeta
( user_id, user_key, user_value )
VALUES ( %d, %s, %s )“,
$MyUserID,
$userkey,
$uservalue
);*/
?>
<!doctype html>
###修正2016/12/31 16:56
Ajaxを使ってコードを書き直してみました。また、ファイルをjsとphpに分けました。今まで出ていたデータベースエラーはなくなりましたが、まだうまくいきません。以下がそのコードです。
```javascript
<!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リスト</h4>
       <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>
   <script type="text/javascript" src=jquery1.10.1.min.js></script>
<?php while ( bp_members() ) : bp_the_member();
       $MyUserID = bp_displayed_user_id();
       $memo = filter_input(INPUT_POST,'memo');
 ?>
   <script type="text/javascript" >
 
 $(function () {
     
   function MakeLi(){
   <?php
 </body>
</html>
```
```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’
   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,
   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'
              ) 
                '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,
   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
                            ),
                              'meta_value' => '".this."'
                            ),
                       array( '%d', '%s', '%s') );
               ?>
   MakeLi();
   });
             
   }
 </script>
 </body>
</html>
<?php endwhile ; ?>
<?php else : ?>
<?php endif ; ?>
```
   die();
   endwhile ;
   endif;
}
add_action( 'wp_ajax_DeleteMyToDo', 'DeleteMyToDo' );
```
  • PHP

    24437 questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • MySQL

    7107 questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

  • WordPress

    9090 questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

2 修正2016/12/30 23:34  HTMLが2度表示される問題が解決しました。

SoraSue

SoraSue score 24

2016/12/30 23:44  投稿

wordpressでのデータベースの操作のエラー
###前提・実現したいこと
現在、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
<?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>
```
###試したこと
エラーにあったように、
```php
$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/30 22:44
mizさんの回答を受けてコードを修正しました。
まだデータベースからうまく情報を取り出せません。
しかし、「保存」ボタンを押した時に"user_id"と"meta_key"は正しく保存されるようになりました。(ただし、meta_valueは必ずnullになります。)
また、html全体が上下に2回表示されるようになりました。つまり、ToDoリストのテキストボックスやボタンなどが全て2個表示されています。
###修正2016/12/30 23:34
 HTMLが2回表示される問題は、whileループの位置を変えることで解決しました。教えてくださったmizさん、ありがとうございます。
 以下が変更したコードです。whileループを<script>の前に持って行きました。
```php
<?php
ini_set( 'display_errors', 1 );
if ( bp_has_members( bp_ajax_querystring( 'members' ) ) ) :
   while ( bp_members() ) : bp_the_member();
global $wpdb;
global $bp;
$wpdb->show_errors();
$wpdb->print_error();
/*$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)"
       );*/
//$wpdb->query( "SELECT user_id, meta_key, meta_value FROM $wpdb->usermeta "
 //     . "WHERE meta_key IN ('total_friend_count','bp_latest_update') AND user_id IN (1,3)"
//$MyUserID = $bp->loggedin_user->id;
$MyUserID = bp_displayed_user_id();  
$memo = filter_input(INPUT_POST,'memo');  
/*$prepared_sql = $wpdb->prepare(
”INSERT INTO $wpdb->usermeta
( user_id, user_key, user_value )
VALUES ( %d, %s, %s )“,
$MyUserID,
$userkey,
$uservalue
);*/
?>
<!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 () {
<?php while ( bp_members() ) : bp_the_member();
       $MyUserID = bp_displayed_user_id();
       $memo = filter_input(INPUT_POST,'memo');
 ?>
   <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,
        'meta_key' => 'ToDoList',
                'meta_value' => $memo,
          ),
          array(
            '%d', '%s', '%s'
          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>
<?php endwhile ; ?>
<?php else : ?>
<?php endif ; ?>
```
```
  • PHP

    24437 questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • MySQL

    7107 questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

  • WordPress

    9090 questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

1 2016/12/30 22:44 mizさんの回答を受けてコードを修正しました。詳しくは最後の「修正」をみてください。

SoraSue

SoraSue score 24

2016/12/30 22:57  投稿

wordpressでのデータベースの操作のエラー
###前提・実現したいこと
現在、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
<?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>
```
###試したこと
エラーにあったように、
```php
$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/30 22:44
mizさんの回答を受けてコードを修正しました。
まだデータベースからうまく情報を取り出せません。
しかし、「保存」ボタンを押した時に"user_id"と"meta_key"は正しく保存されるようになりました。(ただし、meta_valueは必ずnullになります。)
また、html全体が上下に2回表示されるようになりました。つまり、ToDoリストのテキストボックスやボタンなどが全て2個表示されています。
```php
<?php
ini_set( 'display_errors', 1 );
if ( bp_has_members( bp_ajax_querystring( 'members' ) ) ) :
   while ( bp_members() ) : bp_the_member();
global $wpdb;
global $bp;
$wpdb->show_errors();
$wpdb->print_error();
/*$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)"
       );*/
//$wpdb->query( "SELECT user_id, meta_key, meta_value FROM $wpdb->usermeta "
 //     . "WHERE meta_key IN ('total_friend_count','bp_latest_update') AND user_id IN (1,3)"
//$MyUserID = $bp->loggedin_user->id;
$MyUserID = bp_displayed_user_id();
$memo = filter_input(INPUT_POST,'memo');
/*$prepared_sql = $wpdb->prepare(
”INSERT INTO $wpdb->usermeta
( user_id, user_key, user_value )
VALUES ( %d, %s, %s )“,
$MyUserID,
$userkey,
$uservalue
);*/
?>
<!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>
<?php endwhile ; ?>
<?php else : ?>
<?php endif ; ?>
```
  • PHP

    24437 questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • MySQL

    7107 questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

  • WordPress

    9090 questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る