Come utilizzare $wpdb->insert per inserire più righe

2 set 2011, 08:38:38
Visualizzazioni: 13.8K
Voti: 1

Come posso utilizzare $wpdb->insert per inserire più righe. Ecco il mio codice.

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

Questo codice funziona solo per il primo inserimento (cioè quando $i = 0, quando il valore è url_0). A volte il conteggio degli URL sarà maggiore di 100 e altre volte sarà zero. Quindi invece di scrivere il codice 100 volte, voglio semplicemente avere un ciclo che funzioni per qualsiasi numero di record. Questo è il motivo per cui ho optato per un ciclo.

Grazie per l'aiuto.

La struttura della tabella è

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

Qual è la struttura della tua tabella? Non vedo problemi nel tuo codice.

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

Potresti voler usare $wpdb->prepare() per motivi di sicurezza. Vedi il Codex.

kaiser kaiser
2 set 2011 16:26:29

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

Albin Joseph Albin Joseph
3 set 2011 07:27:24

@kaiser la funzione $wpdb->insert() effettua l'escape dei dati come da documentazione. È comunque necessario utilizzare $wpdb->prepare()?

Albin Joseph Albin Joseph
3 set 2011 07:34:35

@Albin Joseph Hai ragione. Ho appena controllato il core e sia insert che replace utilizzano la funzione prepare.

kaiser kaiser
4 set 2011 00:52:17
Tutte le risposte alla domanda 2
2

Immagino che il problema sia piuttosto semplice. Non hai mostrato tutto il codice, ma credo che il problema sia che stai salvando l'inserimento per qualche motivo sconosciuto come string in una variabile chiamata $stat. Ogni volta che riempi la variabile con una nuova query stai sovrascrivendo la tua variabile. Dovresti usare $stat .= $wpdb->insert( ...etc... ) invece, per aggiungere alla tua stringa. Non dimenticare di impostare la variabile a una stringa vuota prima del ciclo, così puoi aggiungere: $stat = ''.


Un altro modo - secondo me migliore - sarebbe usare un array. Motivo: Puoi debuggarre il codice più facilmente. E per favore leggi il commento nel codice.

$stats = array();
for( $i = 0; $i <= $urlCount; $i++ ) 
{
    $stats[] = array(
        'POSTID' => $post->ID,
        // stai davvero recuperando **TUTTI** i tuoi URL come "url1", "url2", ecc. 
        // tramite qualche form inviato 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 set 2011 00:55:36
Commenti

Volevo solo verificare se l'inserimento fosse avvenuto con successo o meno ed è per questo che ho memorizzato $stat. Solo per stampare il valore.

Albin Joseph Albin Joseph
5 set 2011 09:44:24

Grazie per il metodo migliore. Ho stampato $_POST e contiene valori per url1, url2 ecc.

Albin Joseph Albin Joseph
5 set 2011 09:47:03
2

Anche se esiste una risposta accettata, funziona con query separate per ogni inserimento.

Questa potrebbe essere una soluzione migliore per inserire i dati in una sola query:

<?php
 
    
    /**
     * Un metodo per inserire più righe nella tabella specificata
     * 
     *  Esempio di utilizzo: 
     *
     *  $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);
        // Prepara gli array per i Valori Effettivi e per i Segnaposto
        $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;
        }
    }

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

20 nov 2015 14:16:58
Commenti

Suggerirei di invertire l'ordine degli argomenti e impostare per primo l'argomento implicitamente richiesto: $table_name. Inoltre, nella maggior parte dei casi puoi usare direttamente $wpdb->table_name. Inoltre, dal punto di vista della leggibilità, potresti voler impostare INSERT INTO {$wp_table_name} ( dopo il ciclo foreach in modo che sia chiaro cosa avviene in quale ordine (ciclo, righe della query, costruzione dell'array VALUES, poi assegnazione e inserimento. Per quanto riguarda i tuoi argomenti di prinft: C'è più di string/int. Inoltre potrebbero esserci problemi con righe non predefinite e la modalità SQL strict.

kaiser kaiser
15 gen 2016 11:37:19

Sono abbastanza sicuro che la tua concatenazione di stringhe nel ciclo foreach con separazione ,/virgola non funzionerà. Produrrà virgole doppie all'inizio della stringa. Comunque +1 per il link.

kaiser kaiser
15 gen 2016 11:40:39