Come utilizzare $wpdb->insert per inserire più righe
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)
);

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 );

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

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
.
