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

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

ただいまの
回答率

88.36%

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

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 674

yakan

score 17

前提・実現したいこと

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

発生している問題

以下ソースコードで
$rows = $wpdb->insert( $table_name, $update_info, $format_arr );
$rowsfalseとなります。

該当のソースコード

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

<div class="phptest">

<?php
$update_info = [
    'ip'=> '10.0.00.0',
    'kinds_ID'=> 2,
    'sentence'=> "hello",
    'slug'=> "abc",
    'users_ID'=> 1
];        

$format_arr;
foreach ( $update_info as $v ) {
    $format_arr[] = my_get_sql_format($v);
}    
var_dump($format_arr);

$insert_id = my_insert_sql_row( 'wp_breads', $update_info );
var_dump($insert_id);
?>

</div><!-- .phptest -->


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

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

function my_get_sql_format( $v ){
    $format;
    $type = gettype( $v );
    if ( $type == 'string' ) {
        $format = '%s';
    } elseif ( $type == 'integer' ) {
        $format = '%d';
    }    
    return $format;
}


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

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

function my_insert_sql_row( $table_name, $update_info ){ 
    global $wpdb;

    // エラー
    $result = [
        'error_wrapper'=>[
             'func'       => 'my_insert_sql_row()'
            ,'args'       => [ '$table_name'=>$table_name, '$update_info'=>$update_info ]
            ,'error_info' => []
        ]
    ];

    // 型を判定
    foreach ( $update_info as $v ) {
        $format_arr[] = my_get_sql_format($v);
    }    

    // 挿入を実行    
    $rows = $wpdb->insert( $table_name, $update_info, $format_arr );    

    // エラーがあれば取得して戻す
    if( ! $rows ){
        $result['error_wrapper']['error_info']['$rows'] = $rows;
        $result['error_wrapper']['error_info']['last_query'] = $wpdb->last_query;
        $result['error_wrapper']['error_info']['last_error'] = $wpdb->last_error;        
        $result['error_wrapper']['error_info']['show_errors'] = $wpdb->show_errors(); 
        $result['error_wrapper']['error_info']['hide_errors'] = $wpdb->hide_errors();
    }else{
        $result = $wpdb->insert_id;
    }
    return $result;
}

試したこと

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

        $result['error_wrapper']['error_info']['$rows'] = $rows;
        $result['error_wrapper']['error_info']['last_query'] = $wpdb->last_query;
        $result['error_wrapper']['error_info']['last_error'] = $wpdb->last_error;        
        $result['error_wrapper']['error_info']['show_errors'] = $wpdb->show_errors(); 
        $result['error_wrapper']['error_info']['hide_errors'] = $wpdb->hide_errors();


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

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

<div class="phptest">

array(5) {
  [0]=&gt;
  string(2) "%s"
  [1]=&gt;
  string(2) "%d"
  [2]=&gt;
  string(2) "%s"
  [3]=&gt;
  string(2) "%s"
  [4]=&gt;
  string(2) "%d"
}
array(1) {
  ["error_wrapper"]=&gt;
  array(3) {
    ["func"]=&gt;
    string(19) "my_insert_sql_row()"
    ["args"]=&gt;
    array(2) {
      ["$table_name"]=&gt;
      string(9) "wp_breads"
      ["$update_info"]=&gt;
      array(5) {
        ["ip"]=&gt;
        string(9) "10.0.00.0"
        ["kinds_ID"]=&gt;
        int(2)
        ["sentence"]=&gt;
        string(5) "hello"
        ["slug"]=&gt;
        string(3) "abc"
        ["users_ID"]=&gt;
        int(1)
      }
    }
    ["error_info"]=&gt;
    array(5) {
      ["$rows"]=&gt;
      bool(false)
      ["last_query"]=&gt;
      string(34) "SHOW FULL COLUMNS FROM `wp_breads`"
      ["last_error"]=&gt;
      string(0) ""
      ["show_errors"]=&gt;
      bool(false)
      ["hide_errors"]=&gt;
      bool(true)
    }
  }
}
</div>


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

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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正の依頼

  • hayato7

    2020/06/05 02:02

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

    キャンセル

  • YT0014

    2020/06/07 00:52

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

    キャンセル

  • yakan

    2020/07/07 00:42

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

    キャンセル

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

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

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

関連した質問

同じタグがついた質問を見る