Cum să inserezi mai multe rânduri cu $wpdb->insert în WordPress
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)
);

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

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

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
.
