Sintaxa ALTER TABLE cu dbDelta în WordPress?
Din cauza unor modificări în baza de date, trebuie să modific o tabelă pentru a adăuga o coloană nouă, dar chiar dacă funcția rulează, tabela nu este modificată. Iată codul ALTER TABLE pe care l-am scris:
$sql = "ALTER TABLE " . $packagetable . " ADD COLUMN price decimal(14,2) NOT NULL AFTER description;";
dbDelta($sql);
Nu am reușit să găsesc nicăieri online sintaxa corectă pentru ALTER TABLE cu dbDelta. EDIT: După ce am analizat instrucțiunea ALTER TABLE din pluginul Gravity Forms, am actualizat instrucțiunea într-o singură linie.

Ai folosit funcția dbDelta
incorect.
Scopul acestei funcții este să îi transmiți o comandă SQL pentru crearea unei tabele.
Dacă tabela nu există, aceasta va fi creată.
Dacă tabela există dar nu se potrivește, va fi modificată până când va corespunde. Acest lucru include adăugarea și actualizarea coloanelor, indexurilor și altor aspecte.
Deci, ceea ce trebuie să faci este să apelezi dbDelta și să îi furnizezi SQL-ul pentru crearea tabelei, nu SQL-ul pentru modificarea acesteia.
Dar nu se oprește aici! dbDelta este o funcție pretențioasă, nu poți pune orice declarație SQL acolo, trebuie să fie formatată corespunzător
Iată ce spune Codex pe aceeași pagină:
- Trebuie să pui fiecare câmp pe propria linie în declarația ta SQL.
- Trebuie să ai două spații între cuvintele PRIMARY KEY și definiția cheii tale primare.
- Trebuie să folosești cuvântul cheie KEY în loc de sinonimul INDEX și trebuie să incluzi cel puțin un KEY.
- Nu trebuie să folosești apostroafe sau backtick-uri în jurul numelor de câmpuri.
Și de la altă sursă:
Funcția dbDelta
Așa cum am menționat într-unul din articolele mele, funcția dbDelta are abilitatea de a examina structura curentă a tabelei, o compară cu structura dorită și fie adaugă, fie modifică tabela după necesitate, așa că poate fi foarte utilă pentru actualizările pluginului nostru. Totuși, spre deosebire de multe funcții WordPress, dbDelta este cea mai pretențioasă și problematică. Pentru ca funcția dbDelta să funcționeze, trebuie îndeplinite câteva criterii.
- Trebuie să pui fiecare câmp pe propria linie în declarația ta SQL.
- Trebuie să ai două spații între cuvintele PRIMARY KEY și definiția cheii tale primare.
- Trebuie să folosești cuvântul cheie KEY în loc de sinonimul INDEX și trebuie să incluzi cel puțin un KEY.
Păi, criteriile de mai sus par ușor de îndeplinit. Dar așteaptă până te lovește realitatea.

dbDelta()
suportă adăugarea și actualizarea coloanelor. Vezi: http://wordpress.stackexchange.com/q/76926/19726

Nu am spus că nu suportă, doar am menționat că modul în care a abordat problema este incorect. Folosește o instrucțiune CREATE pentru tabela dorită, nu o instrucțiune ALTER, iar dbDelta va crea coloanele pentru tine și va modifica tabela până când corespunde cu SQL-ul specificat

Așadar, am actualizat instrucțiunea SQL pentru a adăuga coloana de preț, dar am primit o eroare de bază de date care spune că tabelul există deja. Iată mesajul de eroră WordPress database error: [Table 'wp_booking_packages' already exists]
CREATE TABLE wp_booking_packages( id mediumint(9) NOT NULL AUTO_INCREMENT, name text NOT NULL, description text NOT NULL, price decimal(14,2) NOT NULL, city1 text NOT NULL, city2 text NOT NULL, PRIMARY KEY (id) )
și am verificat în consola MySQL că coloana încă nu există.

Am actualizat răspunsul meu cu mai multe detalii. Dacă poți posta orice cod viitor folosind un gist, ca să-l pot vedea în întregime? Comentariile tind să distrugă formatarea și liniile noi, ceea ce ar putea face diferența între funcționare și nefuncționare a dbDelta
aici

http://gist.github.com dacă nu știi de el

Iată un gist https://gist.github.com/4482802

@TomJNowell Ce se întâmplă dacă am un câmp în instrucțiunea mea de creare a tabelei cu tipul de date text, iar acum doresc să schimb tipul de date al acelui câmp în bigint, în acest caz dbDelta eșuează. Există vreo modalitate de a face acest lucru?

@IAmDhar cum aș converti cuvântul "banana" într-un număr? Aș pune această întrebare ca o întrebare nouă, este puțin probabil ca cineva să aibă răspunsul, și există o șansă mare ca acest lucru să depășească capacitățile dbDelta ( dbDelta va schimba coloana, dar nu va schimba datele în sine )

@mehulved problema aici ar putea fi la fel de simplă ca absența unui spațiu între numele tabelului și paranteza deschisă. dbDelta este extrem de sensibil la aceste lucruri, asigură-te că declarația SQL este bine formatată și curată, chiar dacă în SQL standard un spațiu nu este de obicei necesar etc., adaugă-l oricum

Pentru a adăuga o coloană într-o tabelă din baza de date WordPress, puteți utiliza $wpdb
:
global $wpdb;
$table = $wpdb->prefix . 'my_table';
$sql = "ALTER TABLE `{$table}`
ADD `new_column` VARCHAR(20) NULL DEFAULT NULL;";
$query_result = $wpdb->query( $sql );
$wpdb->query()
returnează false dacă interogarea a eșuat, conform documentației metodei. Deci puteți scrie o structură if-else pentru a gestiona succesul sau eroarea:
if ( $query_result === false ){
// a apărut o eroare
} else {
// succes
}
Dacă trebuie să adăugați noua coloană după o anumită coloană, utilizați AFTER
în interogare:
$sql = "ALTER TABLE `{$table}`
ADD `new_column` VARCHAR(20) NULL DEFAULT NULL
AFTER `exist_column`;";
De asemenea, puteți modifica
$sql = "ALTER TABLE `{$table}`
MODIFY COLUMN `exist_column` VARCHAR(20) NULL DEFAULT NULL;";
sau șterge o coloană
$sql = "ALTER TABLE `{$table}`
MODIFY COLUMN `exist_column`;";
Sfat mic: În PHP, în cadrul ghilimelelor duble ("
), puteți folosi variabile în acolade ("foo {$var} bar"
) sau fără ele ("foo $var bar"
) pentru a insera variabile în șiruri de caractere, în loc de concatenare ("foo " . $var . " bar"
). Am folosit acest lucru în codul de mai sus. Aflați mai multe despre parsarea șirurilor în php.
