web-dev-qa-db-ja.com

$ wpdb-> insert - 複数行を挿入する

複数の行を挿入するために$wpdb->insertを使用する方法これが私のコードです。

for($i=0; $i<=$urlCount; $i++) {
   $stat = $wpdb->insert(
        'WP_URLS',
        array(
            'POSTID' => $post->ID,
            'URL' =>   $_POST['url'.$i]
        )
    );
}

このコードは最初の挿入に対してのみ機能します(すなわち、$i = 0の場合、valueがurl_0の場合)。 URL数が100を超えることもあれば、ゼロになることもあります。そのため、100回コードを書くのではなく、任意の数のレコードに対して機能する単純なループを作成したいだけです。私がループした理由はそれだけです。

お手伝いありがとう。

テーブル構造は

CREATE TABLE WP_URLS (
   POSTID BIGINT NOT NULL,
   URL VARCHAR(254)
);
1
Albin Joseph

問題はかなり単純なものだと思います。コード全体を見せたわけではありませんが、問題は、何らかの理由で挿入をstringとして$statという名前のvarに保存していることにあると思います。 varに新しいクエリを入力するたびに、varが上書きされます。代わりに$stat .= $wpdb->insert( ...etc... )を使うべきです。あなたの文字列に追加する。 varを空の文字列 before ループに設定することを忘れないでください。したがって、$stat = ''を追加できます。


もう1つの方法 - より良い方法 - 配列を使用することです。理由:コードを簡単にデバッグできます。そしてplsはコメントのI/Tコードを読みます。

$stats = array();
for( $i = 0; $i <= $urlCount; $i++ ) 
{
    $stats[] = array(
        'POSTID' => $post->ID,
        // are you really retrieving **ALL** your urls as "url1", "url2", etc. 
        // via some $_POST-ed form?
        'URL' =>   filter_var(
            $_POST["url{$i}"], 
            FILTER_VALIDATE_URL, 
            FILTER_FLAG_SCHEME_REQUIRED
        )
    );
}

foreach ( $stats as $stat )
    $wpdb->insert( 'WP_URLS', $stat );
2
kaiser

受け入れられた答えがあっても、それは各挿入物のための別々のクエリで動作します。

これはたった一つの問い合わせにデータを挿入するためのより良い解決策になるでしょう。

/**
 * A method for inserting multiple rows into the specified table
 * 
 *  Usage Example: 
 *
 *  $insert_arrays = array();
 *  foreach($assets as $asset) {
 *
 *  $insert_arrays[] = array(
 *  'type' => "multiple_row_insert",
 *  'status' => 1,
 *  'name'=>$asset,
 *  'added_date' => current_time( 'mysql' ),
 *  'last_update' => current_time( 'mysql' ));
 *
 *  }
 *
 *  wp_insert_rows($insert_arrays);
 *
 *
 * @param array $row_arrays
 * @param string $wp_table_name
 * @return false|int
 *
 * @author  Ugur Mirza ZEYREK
 * @source http://stackoverflow.com/a/12374838/1194797
 */

function wp_insert_rows($row_arrays = array(), $wp_table_name) {
    global $wpdb;
    $wp_table_name = esc_sql($wp_table_name);
    // Setup arrays for Actual Values, and Placeholders
    $values = array();
    $place_holders = array();
    $query = "";
    $query_columns = "";

    $query .= "INSERT INTO {$wp_table_name} (";

            foreach($row_arrays as $count => $row_array)
            {

                foreach($row_array as $key => $value) {

                    if($count == 0) {
                        if($query_columns) {
                        $query_columns .= ",".$key."";
                        } else {
                        $query_columns .= "".$key."";
                        }
                    }

                    $values[] =  $value;

                    if(is_numeric($value)) {
                        if(isset($place_holders[$count])) {
                        $place_holders[$count] .= ", '%d'";
                        } else {
                        $place_holders[$count] .= "( '%d'";
                        }
                    } else {
                        if(isset($place_holders[$count])) {
                        $place_holders[$count] .= ", '%s'";
                        } else {
                        $place_holders[$count] .= "( '%s'";
                        }
                    }
                }
                        // mind closing the GAP
                        $place_holders[$count] .= ")";
            }

    $query .= " $query_columns ) VALUES ";

    $query .= implode(', ', $place_holders);

    if($wpdb->query($wpdb->prepare($query, $values))){
        return true;
    } else {
        return false;
    }

}

ソース: https://github.com/mirzazeyrek/wp-multiple-insert

1
motto