Anlegen und einfügen einer Tabelle mittels Migrations-Datei

In diesem Forum gibt es Starthilfe zum neuen Extension-System von phpBB 3.1/3.2. Fragen zur Entwicklung von Extensions und zur Konvertierung von phpBB 3.0.x MODs sind ebenfalls willkommen.
Benutzeravatar
chris1278
Mitglied
Beiträge: 3532
Registriert: 12.11.2007 06:20
Wohnort: Euskirchen
Kontaktdaten:

Re: Anlegen und einfügen einer Tabelle mittels Migrations-Datei

Beitrag von chris1278 »

Ok ich denke ich kann dir ein klein wenig folgen.

Im Grunde genommen schreibt man bei phpbb in der Migration diese Variante nicht:

"UPDATE "

oder

"INSERT INTO"

Sondern man nutzt dazu hochkommata wie du sie nennst.

Ich gehe mal auf das hier zurück was ich schon hatte:

in der database_update wo ich die Variablen das erste mal in meine Tabelle schreibe nutze ich ja dieses hier:

Code: Alles auswählen

		"INSERT INTO  " . $this->table_prefix . 'chris1278_cookie' . " (chris1278_name, chris1278_value, is_dynamic) VALUES ('cs_1_enable', '1', '0');",
Das würde aber wahrscheinlich syntaxmässig besser so sein oder:

Code: Alles auswählen

'INSERT INTO ' . $this->table_prefix . 'chris1278_cookie (chris1278_name, chris1278_value, is_dynamic) VALUES ("cs_1_enable", "1", "0")'
Der syntax funktioniert so aber in jedem fall. Ich musste nur ein wenig änden wie z.B. die werte nach VALUES in den Klammern aus den Hochkommatas anführungsstriche machen also diese Doppel kommas. Ich komm jetzt ne auf den richtigen ausdruck. Ich meine die hier ".

Dann würde der wieder ausgeschrieben so aussehen:

Code: Alles auswählen

'INSERT INTO  phpbb_chris1278_cookie  (chris1278_name, chris1278_value, is_dynamic) VALUES ("cs_1_enable", "1", "0")'
69bruno
Mitglied
Beiträge: 445
Registriert: 05.06.2020 08:21

Re: Anlegen und einfügen einer Tabelle mittels Migrations-Datei

Beitrag von 69bruno »

Kurze Nachfrage

Code: Alles auswählen

$variable1 = "ein "; 
echo "Da steht " . $variable1 . "Haus.";
Wäre doch auch so möglich:

Code: Alles auswählen

echo "Da steht $variable1 Haus"
oder ? Ich las, das Variablen in Strings zwischen double quotes von php automatisch geparst werden.
Forum: cruiser-lounge.de
PHPBB-Version: 3.3.11 / Debian-Linux 10 / PHP-Version: 8.1
Benutzeravatar
LukeWCS
Supporter
Supporter
Beiträge: 2108
Registriert: 15.12.2014 10:19
Kontaktdaten:

Re: Anlegen und einfügen einer Tabelle mittels Migrations-Datei

Beitrag von LukeWCS »

69bruno hat geschrieben: 28.08.2021 21:08 Wäre doch auch so möglich:

Code: Alles auswählen

echo "Da steht $variable1 Haus"
oder ? Ich las, das Variablen in Strings zwischen double quotes von php automatisch geparst werden.
Jupp, allerdings kann das problematisch werden, wenn man verketten muss, Beispiel:

Code: Alles auswählen

$a = 'Haus';
echo "Mein $aboot.";
Das quittiert der Interpreter mit einem "Undefined variable: aboot".

Abhilfe schafft da die "curly syntax":

Code: Alles auswählen

$a = 'Haus';
echo "Mein {$a}boot.";
Möge das Backup mit dir sein. Immer.

Erweiterungen - Infos zur artgerechten Haltung
phpBB Ext Check - Analysesystem für phpBB Erweiterungen (Entwickler Werkzeug)
Benutzeravatar
chris1278
Mitglied
Beiträge: 3532
Registriert: 12.11.2007 06:20
Wohnort: Euskirchen
Kontaktdaten:

Re: Anlegen und einfügen einer Tabelle mittels Migrations-Datei

Beitrag von chris1278 »

@dr.death

Aufgrund dieses Beitrages hier noch einmal das ich das richtig verständen habe.

Ich versuche das anhand eines anderen Befehls den ich sonst bei phpMyAdmin nutze um alle vorhandenen Extension zu deaktivieren vor einem Update des Forum. Aber als Beispiel sollte es das tun.

Den Befehl den ich nutze sieht im phpMyAdmin so aus:

Code: Alles auswählen

UPDATE phpbb_ext SET ext_active = 0 
Das würde wenn ich das Richtig Verstehe dann für die Migrationsdatei erstmnal dieses Format haben:

Code: Alles auswählen

$sql = 'UPDATE phpbb_ext SET ext_active = "0"'; 
Jetzt müsste nur noch das phpbb_ durch den Präfix befehl ersetzt werden das sollte dan so aussehen:

Code: Alles auswählen

$sql = 'UPDATE ' . $this->table_prefix . 'ext SET ext_active = "0"'; 
Somit müsste das ja eigentlich korekt sein.

Das update steht in Hochkommas und das _ext bis zum ende auch. und die punkte vor und nach dem $this->table_prefix sagen dem php code das dies was davor und danach kommt zusammen gehören.

Ich hoffe ich habe das jetzt soweit richtig verstanden.
Benutzeravatar
Dr.Death
Moderator
Moderator
Beiträge: 17399
Registriert: 23.04.2003 08:22
Wohnort: Xanten
Kontaktdaten:

Re: Anlegen und einfügen einer Tabelle mittels Migrations-Datei

Beitrag von Dr.Death »

Erst mal zu Erklärung: Richtig.

Nun zum Detail: Wenn z.B. Zahlen in Double Quotes "0" angegeben werden, sind es keine Zahlen ( Integer ) mehr, sondern werden als Text ("String"... VARCHAR) behandelt.

Das kann bei manchen Datenbanken gut gehen, bei anderen nicht.

Siehe bitte hier: Da sind auch Beispiele die man mal selbst durchspielen kann
https://www.php-kurs.com/variablen-typen.htm

So wäre es besser:

Code: Alles auswählen

$sql = 'UPDATE ' . $this->table_prefix . 'ext SET ext_active = 0'; 
Obwohl ich gerade den Sinn nicht erkennen kann warum man in einem Migrationsscript eine, bzw. alle Extensions per Datenbankscript deaktivieren soll.
Benutzeravatar
chris1278
Mitglied
Beiträge: 3532
Registriert: 12.11.2007 06:20
Wohnort: Euskirchen
Kontaktdaten:

Re: Anlegen und einfügen einer Tabelle mittels Migrations-Datei

Beitrag von chris1278 »

Ok das heist je nach Datenbank wird dann nicht 0 als zahl sondern 0 als Wort geschrieben. Wenn ich das richtig verstehe sollte man zahlen werte ohne Double Quotes und Wörter eben in besagten Double Quotes geschrieben werden.
Dr.Death hat geschrieben:Obwohl ich gerade den Sinn nicht erkennen kann warum man in einem Migrationsscript eine, bzw. alle Extensions per Datenbankscript deaktivieren soll.
Also wenn ich bei dem ein oder anderem Forum ein Update mache tue ich wie immer alle Extension vorher deaktivieren. Und da das ein oder andere Forum sehr viele Extensions nutzt geht das für mich einfacher diese per sql befehl zu deaktivieren und aktivieren als jede einzelne im acp. Aber das ist ja auch letzten endlich jedermann selbst überlassen wie er es handhabt.
Benutzeravatar
Dr.Death
Moderator
Moderator
Beiträge: 17399
Registriert: 23.04.2003 08:22
Wohnort: Xanten
Kontaktdaten:

Re: Anlegen und einfügen einer Tabelle mittels Migrations-Datei

Beitrag von Dr.Death »

Lese Dir bitte die von mir verlinkten Kurse durch und spiele sie mal selbst auf deinem Testserver durch.

https://www.php-kurs.com/variablen-in-php-nutzen.htm
Benutzeravatar
chris1278
Mitglied
Beiträge: 3532
Registriert: 12.11.2007 06:20
Wohnort: Euskirchen
Kontaktdaten:

Re: Anlegen und einfügen einer Tabelle mittels Migrations-Datei

Beitrag von chris1278 »

Ok. Aber mal ne andere Frage:

Du hast mir ja das hier verlinkt in einem vorherigem Beitrag:

https://area51.phpbb.com/docs/33x/codin ... s.html#sql

Wenn ich das richtig gelesen habe müsste ich die Anweisung ja in der Optik in die Migration schreiben.

Im Moment schreibe ich das so:

Code: Alles auswählen

$sql = 'UPDATE ' . $this->table_prefix . 'chris1278_cookie 	SET chris1278_name = "klaro_note" WHERE chris1278_name = "cs_13_enable"';
$this->db->sql_query($sql);
Aber nach dem Was du mir verlinkt hast müsste das in etwa so aussehen:

Code: Alles auswählen

		
$sql = 'UPDATE ' . $this->table_prefix . 'chris1278_cookie 
	SET chris1278_name = "window_fix_in_the_middle" 
	WHERE chris1278_name = "cs_12_enable"';
$this->db->sql_query($sql);
Ich meine funktionieren würden wohl beide Varianten da sich am Code selber außer den Zeilen ja nix ändert.

Und was das andere mit Test Server angeht so hab ich den xammp laufen das wäre net das Problem.
Benutzeravatar
Dr.Death
Moderator
Moderator
Beiträge: 17399
Registriert: 23.04.2003 08:22
Wohnort: Xanten
Kontaktdaten:

Re: Anlegen und einfügen einer Tabelle mittels Migrations-Datei

Beitrag von Dr.Death »

Es kommt immer darauf an, wie du deinen Code "formatierst".

Wenn du nur einen SQL Befehl ausführen willst : Halte dich an die Coding Guidelines.

Die Guidelines helfen den Code einfacher zu lesen.


Eine lange Zeile mit viel Inhalt ist schwieriger zu lesen als die wichtigen Angeben in eigenen Zeilen:

UPDATE Tabelle SET Feld = Wert WHERE Bedingung entspricht xyz
UPDATE Tabelle
SET Feld = Wert
WHERE Bedingung entspricht xyz
Stell dir vor, ich würde diesen Code in eine Zeile packen wollen:

Code: Alles auswählen

			$sql = 'SELECT 	count(wm_driver) as gold_medals,
							    wm_driver
					FROM 	' . $table_wm . '
					WHERE 	wm_points = 25
					GROUP BY wm_driver
					ORDER BY gold_medals DESC';
			$result = $this->db->sql_query($sql);
Versuche doch mal vorhanden Code zu lesen und auch zu verstehen, warum er so geschrieben worden ist.
Das hilft.


Noch eleganter laut Coding Guidelines:

Code: Alles auswählen

	$sql_ary = array(
		'chris1278_name' => 'window_fix_in_the_middle',
	);

	$sql = 'UPDATE ' . $this->table_prefix . 'chris1278_cookie
		SET ' . $this->db->sql_build_array('UPDATE', $sql_ary) . '
		WHERE chris1278_name = "cs_12_enable"';
Benutzeravatar
chris1278
Mitglied
Beiträge: 3532
Registriert: 12.11.2007 06:20
Wohnort: Euskirchen
Kontaktdaten:

Re: Anlegen und einfügen einer Tabelle mittels Migrations-Datei

Beitrag von chris1278 »

Also dein code lesen ich versuche mal:

select müsste heisen soviel wie was auswählen.

Wenn ich den zeile für zeile lese würde das vereinfacht heissen:

Code: Alles auswählen

Wähle count(wm_driver) als gold_medals, aus


aus einem Zähler die goldmedalie auswählen,

Code: Alles auswählen

FROM 	' . $table_wm . ' 
Aus der tabelle_wm

Code: Alles auswählen

WHERE 	wm_points = 25
wenn 25 punkte (ich geh mal davon aus wenn erreicht worden ist 25 oder mehr.

Code: Alles auswählen

GROUP BY wm_driver
Aus der gruppe wm_driver

Code: Alles auswählen

ORDER BY gold_medals DESC';
Sortiere goldmetallien abwährts.

Also es soll bei einem zähler wert 25 oder mehr aus der gruppe wm driver die goldmedalien absteigend aus der tabelle Table_wm (wobei das nur ein array ist und ich geh mal davon aus das dann bei abfrage dort ein tabellen name steht.

@edit

zu deiner letzten Ergänzung wenn ich das weiterhin zeile für zeile mache würde das so ,mit dem selben array gehen. also beispiel:

Code: Alles auswählen

$sql_ary = array(
	'chris1278_name' => 'to_the_cookie_settings',
);

$sql = 'UPDATE ' . $this->table_prefix . 'chris1278_cookie
	SET ' . $this->db->sql_build_array('UPDATE', $sql_ary) . '
	WHERE chris1278_name = "cs_11_enable"';
$this->db->sql_query($sql);

$sql_ary = array(
	'chris1278_name' => 'window_fix_in_the_middle',
);

$sql = 'UPDATE ' . $this->table_prefix . 'chris1278_cookie
	SET ' . $this->db->sql_build_array('UPDATE', $sql_ary) . '
	WHERE chris1278_name = "cs_12_enable"';
$this->db->sql_query($sql);


oder müsste ich dan dass hier für jede eintragung ändern:

$sql_ary

Wobei eigentlich wenn ich die datei dann von oben nach unten lese setzt der das arrray $sql_ary, dann öffnet der mit $sql den datenbank eintrag befehl wo auch das array drin stehtund abschliessend führt er das mit $this->db->sql_query($sql);aus und trägt das in die Datenbank ein und dann lädt der das nächste.
Antworten

Zurück zu „Extension Bastelstube“