Cum să inserezi mai multe rânduri cu $wpdb->insert în WordPress

2 sept. 2011, 08:38:38
Vizualizări: 13.8K
Voturi: 1

Cum pot folosi $wpdb->insert pentru a insera mai multe rânduri. Iată codul meu.

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

Acest cod funcționează doar pentru prima inserare (adică când $i = 0, când valoarea este url_0). Uneori numărul de URL-uri va fi mai mare de 100 și alteori va fi zero. Deci, în loc să scriu codul de 100 de ori, vreau doar să am o buclă simplă care funcționează pentru orice număr de înregistrări. Acesta este motivul pentru care am ales bucla.

Vă mulțumesc pentru ajutor.

Structura tabelului este

CREATE TABLE WP_URLS (
   POSTID BIGINT NOT NULL,
   URL VARCHAR(254)
);
5
Comentarii

Care este structura tabelului tău? Nu văd nicio problemă în codul tău.

Ján Bočínec Ján Bočínec
2 sept. 2011 09:52:01

Pentru motive de securitate, ai putea folosi $wpdb->prepare(). Vezi Codex.

kaiser kaiser
2 sept. 2011 16:26:29

CREATE TABLE WP_URLS ( POSTID BIGINT NOT NULL, URL VARCHAR(254) ); @johnnyPea

Albin Joseph Albin Joseph
3 sept. 2011 07:27:24

@kaiser $wpdb->insert() scapă datele conform documentației. Mai trebuie să folosim $wpdb->prepare() ?

Albin Joseph Albin Joseph
3 sept. 2011 07:34:35

@Albin Joseph Ai dreptate. Tocmai am verificat în core și atât insert cât și replace folosesc funcția prepare.

kaiser kaiser
4 sept. 2011 00:52:17
Toate răspunsurile la întrebare 2
2

Presupun că problema este una destul de simplă. Nu ai afișat întregul cod, dar cred că problema este că salvezi inserarea din nu știu ce motiv ca string într-o variabilă numită $stat. De fiecare dată când completezi variabila cu o nouă interogare, suprascrii variabila ta. Ar trebui să folosești $stat .= $wpdb->insert( ...etc... ) pentru a adăuga la șirul tău. Nu uita să setezi variabila la un șir gol înainte de buclă, astfel încât să poți adăuga: $stat = ''.


O altă metodă - care este mai bună în opinia mea - ar fi să folosești un array. Motivul: poți depana codul mai ușor. Și te rog să citești comentariul din cod.

$stats = array();
for( $i = 0; $i <= $urlCount; $i++ ) 
{
    $stats[] = array(
        'POSTID' => $post->ID,
        // chiar recuperezi **TOATE** URL-urile tale ca "url1", "url2", etc. 
        // printr-un formular trimis via $_POST?
        'URL' =>   filter_var(
            $_POST["url{$i}"], 
            FILTER_VALIDATE_URL, 
            FILTER_FLAG_SCHEME_REQUIRED
        )
    );
}

foreach ( $stats as $stat )
    $wpdb->insert( 'WP_URLS', $stat );
4 sept. 2011 00:55:36
Comentarii

Voiam doar să văd dacă inserarea a avut succes sau nu și de aceea am stocat $stat. Doar pentru a afișa valoarea.

Albin Joseph Albin Joseph
5 sept. 2011 09:44:24

Mulțumesc pentru metoda mai bună. Am afișat $_POST și are valori pentru url1, url2 etc.

Albin Joseph Albin Joseph
5 sept. 2011 09:47:03
2

Chiar dacă există un răspuns acceptat, acesta funcționează cu interogări separate pentru fiecare inserare.

Aceasta ar putea fi o soluție mai bună pentru inserarea datelor într-o singură interogare:

<?php
 
    
    /**
     * O metodă pentru inserarea mai multor rânduri în tabelul specificat
     * 
     *  Exemplu de utilizare: 
     *
     *  $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);
        // Setează array-uri pentru Valorile Reale și pentru Placeholders
        $place_holders = [];
        $row = implode(', ', array_keys($row_arrays));
        $values = array_values($row_arrays);

        foreach (array_values($row_arrays) as $key => $param) {
        
            if(is_numeric($param)) {
                if($key == 0){
                    array_push($place_holders, " '%d'");
                } else {
                    array_push($place_holders, ", '%d'");
                }
                
            } else {
                if($key == 0){
                    array_push($place_holders, " '%s'");
                } else {
                    array_push($place_holders, ", '%s'");
                }
            }
        }

        $params = implode('', $place_holders);
    
        $query = "INSERT INTO {$wp_table_name} (" . $row . ") VALUES (" . $params . ")";

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

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

20 nov. 2015 14:16:58
Comentarii

Aș sugera să schimbi ordinea argumentelor și să pui mai întâi argumentul implicit cerut: $table_name. De asemenea, în majoritatea cazurilor poți folosi direct $wpdb->table_name. Mai mult, din punct de vedere al lizibilității, ai putea să pui INSERT INTO {$wp_table_name} ( după bucla foreach, astfel încât să fie clar ce se întâmplă în ce ordine (buclă, interogare rânduri, construiește array VALUES, apoi atribuie și inserează. Referitor la argumentele tale prinft: Există mai mult decât string/int. De asemenea, pot apărea probleme cu rândurile non-standard și modul SQL strict.

kaiser kaiser
15 ian. 2016 11:37:19

Sunt foarte sigur că concatenarea string-ului în bucla foreach cu separare prin ,/virgulă nu va funcționa. Va produce virgule duble la începutul string-ului. Totuși +1 pentru link.

kaiser kaiser
15 ian. 2016 11:40:39