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

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

新規登録して質問してみよう
ただいま回答率
85.47%
MySQL

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

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

WordPress

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

PHP

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

Q&A

0回答

1865閲覧

$wpdb->insert()でfalseが返り、エラーを出力しても内容がありません

yakan

総合スコア19

MySQL

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

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

WordPress

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

PHP

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

0グッド

0クリップ

投稿2020/05/22 01:17

###前提・実現したいこと
当方WordPress初心者で、オリジナルのテーブルへのINSERTを試みています。
以下のソースコードにおいて、$wpdb->insertfalseを返し、解決策を見つけることができません。
ご指南頂けましたら幸いです。

###発生している問題
以下ソースコードで
$rows = $wpdb->insert( $table_name, $update_info, $format_arr );
$rowsfalseとなります。

該当のソースコード

実行部分ですが、header.php で下記の流れを組んでいます。

php

1<div class="phptest"> 2 3<?php 4$update_info = [ 5 'ip'=> '10.0.00.0', 6 'kinds_ID'=> 2, 7 'sentence'=> "hello", 8 'slug'=> "abc", 9 'users_ID'=> 1 10]; 11 12$format_arr; 13foreach ( $update_info as $v ) { 14 $format_arr[] = my_get_sql_format($v); 15} 16var_dump($format_arr); 17 18$insert_id = my_insert_sql_row( 'wp_breads', $update_info ); 19var_dump($insert_id); 20?> 21 22</div><!-- .phptest -->

上記には型を判定する関数my_get_sql_format()と、挿入する関数my_insert_sql_row()が含まれているので順に以下提示します。

まず型を判定する関数は下記です。(これは問題ございません。)

php

1function my_get_sql_format( $v ){ 2 $format; 3 $type = gettype( $v ); 4 if ( $type == 'string' ) { 5 $format = '%s'; 6 } elseif ( $type == 'integer' ) { 7 $format = '%d'; 8 } 9 return $format; 10}

そして挿入する関数は下記です。
この関数の冒頭で戻り値$resultを定義しており、エラーの際はこの$result
$result['error_wrapper']['error_info']['エラー箇所'] = エラー内容;
のように入ることでエラー内容を検出する意図です。

今回の件では$rowsfalseになりますので
$result['error_wrapper']['error_info']['$rows'] = false;
が戻ることが問題となっています。

php

1function my_insert_sql_row( $table_name, $update_info ){ 2 global $wpdb; 3 4 // エラー 5 $result = [ 6 'error_wrapper'=>[ 7 'func' => 'my_insert_sql_row()' 8 ,'args' => [ '$table_name'=>$table_name, '$update_info'=>$update_info ] 9 ,'error_info' => [] 10 ] 11 ]; 12 13 // 型を判定 14 foreach ( $update_info as $v ) { 15 $format_arr[] = my_get_sql_format($v); 16 } 17 18 // 挿入を実行 19 $rows = $wpdb->insert( $table_name, $update_info, $format_arr ); 20 21 // エラーがあれば取得して戻す 22 if( ! $rows ){ 23 $result['error_wrapper']['error_info']['$rows'] = $rows; 24 $result['error_wrapper']['error_info']['last_query'] = $wpdb->last_query; 25 $result['error_wrapper']['error_info']['last_error'] = $wpdb->last_error; 26 $result['error_wrapper']['error_info']['show_errors'] = $wpdb->show_errors(); 27 $result['error_wrapper']['error_info']['hide_errors'] = $wpdb->hide_errors(); 28 }else{ 29 $result = $wpdb->insert_id; 30 } 31 return $result; 32}

###試したこと
上記ソースコード後半のifが下記ですが、このように各種エラーを出力するように書いたつもりです。

php

1 $result['error_wrapper']['error_info']['$rows'] = $rows; 2 $result['error_wrapper']['error_info']['last_query'] = $wpdb->last_query; 3 $result['error_wrapper']['error_info']['last_error'] = $wpdb->last_error; 4 $result['error_wrapper']['error_info']['show_errors'] = $wpdb->show_errors(); 5 $result['error_wrapper']['error_info']['hide_errors'] = $wpdb->hide_errors();

そしてここまで書いた流れを実行した結果(先述したheader.phpの出力結果)が下記HTMLとなりました。
ご覧のように詳しいエラーを出力してくれない状態です。

唯一last_querySHOW FULL COLUMNS FROM 'wp_breads'という結果が出力されていますがこれも謎で、このようなSQL文はどこにも書いておらず困惑中です。

html

1<div class="phptest"> 2 3array(5) { 4 [0]=&gt; 5 string(2) "%s" 6 [1]=&gt; 7 string(2) "%d" 8 [2]=&gt; 9 string(2) "%s" 10 [3]=&gt; 11 string(2) "%s" 12 [4]=&gt; 13 string(2) "%d" 14} 15array(1) { 16 ["error_wrapper"]=&gt; 17 array(3) { 18 ["func"]=&gt; 19 string(19) "my_insert_sql_row()" 20 ["args"]=&gt; 21 array(2) { 22 ["$table_name"]=&gt; 23 string(9) "wp_breads" 24 ["$update_info"]=&gt; 25 array(5) { 26 ["ip"]=&gt; 27 string(9) "10.0.00.0" 28 ["kinds_ID"]=&gt; 29 int(2) 30 ["sentence"]=&gt; 31 string(5) "hello" 32 ["slug"]=&gt; 33 string(3) "abc" 34 ["users_ID"]=&gt; 35 int(1) 36 } 37 } 38 ["error_info"]=&gt; 39 array(5) { 40 ["$rows"]=&gt; 41 bool(false) 42 ["last_query"]=&gt; 43 string(34) "SHOW FULL COLUMNS FROM `wp_breads`" 44 ["last_error"]=&gt; 45 string(0) "" 46 ["show_errors"]=&gt; 47 bool(false) 48 ["hide_errors"]=&gt; 49 bool(true) 50 } 51 } 52} 53</div>

他にエラーを検出する方法をご存じの方や、ざっとソースコードをご覧になりあやしい原因を特定できる方がいらしたらご高察賜れますと幸甚に存じます。

自力ではここまでが限界で…なにとぞ、お力添え宜しくお願い申し上げます。

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yakan

2020/05/22 18:15

ありがとうございます。レンタルサーバーからの制限があるためwp-config.phpを修正できませんでしたが、参考になりました。
hayato7

2020/05/23 12:07 編集

そうなんですね、サーバーにもよるかもしれませんが、ファイル権限は変えることができるので、サーバー名+ファイル権限などで調べてみるのありかもしれません。 SQLのエラーを調べるなら、こちらの方法も使えると思います。 http://hono-wp.seesaa.net/article/422447099.html また問題なければ、wp_breadsテーブルの詳細な情報(テーブル名やデータ型)がみたいです。
yakan

2020/05/23 19:39

ご指摘のようにwp_breadsを確認し原因がわかりました。sentenceのカラムがvarchar(1)になっていたため「hello」という5文字がINSERTできなかったようです。しかし偶然見つけたからいいものの、「varchar(1)に5文字は入りません」などのエラーは何処かで確認できないものなのでしょうか。
yakan

2020/05/23 19:40

>SQLのエラーを調べるなら、こちらの方法も使えると思います。 そちらのエラー一覧はとても参考になりますね。ありがとうございます。
hayato7

2020/05/24 01:48

WordPressの初期設定ではエラーが表示されないようになっています。(ログにも残らない)DBMS側のエラーログには残っているかもしれませんので、そちらを確認する方法もあるかと思います。 今後こちらを参考にする方もいると思うので、解答を書き、ベストアンサーにするのが良いと思います。
yakan

2020/05/24 02:40

偶然では話にならないので、エラーログの出し方を見つけたいと思います。
hayato7

2020/06/04 17:02

ふと思ったのですが、お使いのレンタルサーバはどこのものなのでしょうか。
YT0014

2020/06/06 15:52

insert()の前にshow_errors()を実行して、エラー表示を有効にしておくべきではないでしょうか? エラー情報でshow_erros()でfalseが返っていますから、insert()実行時は、エラー表示が無効になっていると思われます。 また、SHOW FULL COLUMSN ~ ですが、insert()の処理中に、カラムの型チェックのために呼ばれている可能性と、接続確認のためのSQLの可能性が考えられます。
yakan

2020/07/06 15:42

ありがとうございます。show_errorsをtrueにしてもやはりlast_errorは空でした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問