web-dev-qa-db-fra.com

$ wpdb-> insert - insertion de plusieurs lignes

Comment utiliser $wpdb->insert pour insérer plusieurs lignes. Voici mon code.

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

Ce code ne fonctionne que pour la première insertion (c'est-à-dire lorsque $i = 0, lorsque la valeur esturl_0). Parfois, le nombre d'URL sera supérieur à 100 et parfois, il sera nul. Ainsi, au lieu d'écrire le code 100 fois, je souhaite simplement disposer d'une boucle simple qui fonctionne pour un nombre quelconque d'enregistrements. C'est la raison pour laquelle je suis allé pour la boucle.

Merci pour l'aide.

La structure de la table est

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

Je suppose que le problème est assez simple. Vous n'avez pas affiché tout le code, mais je suppose que le problème est que vous enregistrez l'insertion pour une raison inconnue sous le nom string dans une var nommée $stat. Chaque fois que vous remplissez le var avec une nouvelle requête, vous écrasez votre var. Vous devriez utiliser $stat .= $wpdb->insert( ...etc... ) à la place. ajouter à votre chaîne. N'oubliez pas de définir la variable var sur une chaîne vide before the loop afin de pouvoir ajouter: $stat = ''.


Une autre meilleure façon, serait d'utiliser un tableau. Raison: vous pouvez plus facilement déboguer le code. Et les pls lisent le code de commentaire 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

Même s'il existe une réponse acceptée, cela fonctionne avec des requêtes distinctes pour chaque insertion.

Cela pourrait être une meilleure solution pour insérer des données dans une seule requête:

/**
 * 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;
    }

}

Source: https://github.com/mirzazeyrek/wp-multiple-insert

1
motto