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
LukeWCS
Supporter
Supporter
Beiträge: 2122
Registriert: 15.12.2014 10:19
Kontaktdaten:

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

Beitrag von LukeWCS »

Jupp Chris, du weisst um was es geht, darüber reden wir im WWH Forum schon ne ganze Ecke. Mach dich erstmal mit den Grundlagen vertraut und hör auf dich mit Dingen zu beschäftigen, die ganz klar mehrere Nummern zu gross für dich sind. Was MySQL angeht, sind meine Kenntnisse auch ziemlich bescheiden, ich baue mir auch immer nur gerade das zusammen was ich brauche, um eine Aufgabe zu lösen. Aber bei dir klemmt es schon an den einfachsten Dingen. Erstmal die Basics lernen, dann kann man auch solche Dinge wie das hier in Angriff nehmen. Dazu kommt noch, das man bei den Ext Strukturen mit OOP (Objektorientierter Programmierung) zu tun hat, was schon mal von vorneherein eine zusätzliche Hürde für Programmier-Einsteiger ist.

Beschränke deine Arbeit auf Projekte die du stemmen kannst. Man fängt nicht gleich "ganz weit oben" an, sondern mit einfacheren Funktionalitäten. Schritt für Schritt die Grundlagen lernen und nur das selbst in Exts einbauen, was man auch selbst geschrieben und vor allem auch verstehen kann. Wenn man spezifische Fragen hat wie zu MySQL ist das eine Sache. Wenn man dabei aber erstmal noch viel Kleinkram vermitteln muss, den du eigentlich schon können solltest, ist das für die Helfenden mühsam und zeitaufwendig.

edit:
chris1278 hat geschrieben: 28.08.2021 13:53 Nichts desto trotz kann ich eigentlich ganz zufrieden sein mit dem was ich bisher erreicht habe. Auch wenn's nicht perfekt ist. Aber mit jedem Versuch lern ich halt auch dazu. Auch wenn's nur sehr schleppend vorangeht. Auf jeden fall bin ich immer wieder gerne hier im Forum.
Du hast ne Menge gelernt, keine Frage. Aber dein Problem sind schon seit jeher die Grundlagen. Schon canonknipser hat dich darauf hingewiesen gehabt.
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: 3533
Registriert: 12.11.2007 06:20
Wohnort: Euskirchen
Kontaktdaten:

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

Beitrag von chris1278 »

Dr.Death hat geschrieben: 28.08.2021 13:30 Die Variable $sql ist ja kein Array.... ich glaube du solltest mal die Syntax von PHP lernen....

Wie man Array Zeilen abschließt, wie man Befehle abschließt, wie man Zeichenketten verbindet, wie und wann man doppelte Anführungszeichen verwendet und auch warum....und wann einzelne Anführungszeichen und auch warum.


probier das mal, sollte ohne Syntax Fehler sein..... musst du halt noch anpassen.
Ob es funktioniert weiß ich nicht, hab es mal so

Code: Alles auswählen

	public function import_optin()
	{
		$sql_ary = [
		
		'UPDATE ' . $this->table_prefix . 'chris1278_cookie SET "chris1278_name" =  "neuer_name_fuer_cs1_enabled"  WHERE "chris1278_name" = "old1"',
		'UPDATE ' . $this->table_prefix . 'chris1278_cookie SET "chris1278_name" =  "neuer_name_fuer_cs2_enabled"  WHERE "chris1278_name" = "old2"',
		'UPDATE ' . $this->table_prefix . 'chris1278_cookie SET "chris1278_name" =  "neuer_name_fuer_cs3_enabled"  WHERE "chris1278_name" = "old3"',
		'UPDATE ' . $this->table_prefix . 'chris1278_cookie SET "chris1278_name" =  "neuer_name_fuer_cs4_enabled"  WHERE "chris1278_name" = "old4"',
		'UPDATE ' . $this->table_prefix . 'chris1278_cookie SET "chris1278_name" =  "neuer_name_fuer_cs5_enabled"  WHERE "chris1278_name" = "old5"',
		'UPDATE ' . $this->table_prefix . 'chris1278_cookie SET "chris1278_name" =  "neuer_name_fuer_cs6_enabled"  WHERE "chris1278_name" = "old6"',
		'UPDATE ' . $this->table_prefix . 'chris1278_cookie SET "chris1278_name" =  "neuer_name_fuer_cs7_enabled"  WHERE "chris1278_name" = "old7"',
		'UPDATE ' . $this->table_prefix . 'chris1278_cookie SET "chris1278_name" =  "neuer_name_fuer_cs8_enabled"  WHERE "chris1278_name" = "old8"',
		
		];

		foreach ($sql_ary as $sql)
		{
			$this->db->sql_query($sql);
		}
	}

Also ich hab den code jetzt mal so geschrieben und ausgeführt und das ergebnis ist folgendes:

https://prnt.sc/1qolhsr

hier noch die dazugehöhrige datei die den code ausführt:

Code: Alles auswählen

<?php
/**
*
* Opt-In Cookie Manager by klaro Script extension for the phpBB Forum Software package.
* @copyright (c) 2020 (Christian-Esch.de) and Kirk https://reyno41.bplaced.net/phpbb
* @license GNU General Public License, version 2 (GPL-2.0)
*
*/
namespace chris1278\cookie\migrations;

class v_1_0_4 extends \phpbb\db\migration\migration
{
	public function effectively_installed()
	{
		return;
	}

	static public function depends_on()
	{
		return array('\chris1278\cookie\migrations\v_1_0_3');
	}
	
	public function update_data()
	{
		return array(

			array('custom', array(array($this, 'import_optin'))),

		);
	}

	public function import_optin()
	{

		$sql_ary = [
		
		'UPDATE ' . $this->table_prefix . 'chris1278_cookie SET "chris1278_name" =  "Variabel_name_neu"  WHERE "chris1278_name" = "cs_1_enable"',
		
		
		];

		foreach ($sql_ary as $sql)
		{
			$this->db->sql_query($sql);
		}
	}
}

Ich hab erstmal nur eine update anweisung da reingepackt. Später die zeilen zu erweitern sofern das richtige formal stimmt ist nicht das problem.

Ich denke da ist wieder das gleiche problem was wir am anfang hatten das hatte ich zusammen mit bne lösen können:

hier zum nachlesen:

viewtopic.php?p=1401777#p1401777

Dort hatten wir das selbe Problem mit dem Insert befehl aus dem phpmyadmin bereich. Aber wir haben es mit den richtigen zeichen an der richtigen stelle lösen können.

@edit

Ich habes hinbekommen. Die Syntax hab ich lösen können und es funktioniert:

hier der Richtige Code. So wie ich mir das gedacht hatte:

Code: Alles auswählen

<?php
/**
*
* Opt-In Cookie Manager by klaro Script extension for the phpBB Forum Software package.
* @copyright (c) 2020 (Christian-Esch.de) and Kirk https://reyno41.bplaced.net/phpbb
* @license GNU General Public License, version 2 (GPL-2.0)
*
*/
namespace chris1278\cookie\migrations;

class v_1_0_4 extends \phpbb\db\migration\migration
{
	public function effectively_installed()
	{
		return;
	}

	static public function depends_on()
	{
		return array('\chris1278\cookie\migrations\v_1_0_3');
	}
	
	public function update_data()
	{
		return array(

			array('custom', array(array($this, 'import_optin'))),

		);
	}

	public function import_optin()
	{

		$sql_ary = [
		"UPDATE " . $this->table_prefix . 'chris1278_cookie' . " SET  chris1278_name  = 'neuer_name1' WHERE chris1278_name ='cs_1_enable'",
		"UPDATE " . $this->table_prefix . 'chris1278_cookie' . " SET  chris1278_name  = 'neuer_name2' WHERE chris1278_name ='cs_2_enable'",
		"UPDATE " . $this->table_prefix . 'chris1278_cookie' . " SET  chris1278_name  = 'neuer_name3' WHERE chris1278_name ='cs_3_enable'",
		"UPDATE " . $this->table_prefix . 'chris1278_cookie' . " SET  chris1278_name  = 'neuer_name4' WHERE chris1278_name ='cs_4_enable'",
		"UPDATE " . $this->table_prefix . 'chris1278_cookie' . " SET  chris1278_name  = 'neuer_name5' WHERE chris1278_name ='cs_5_enable'",
		"UPDATE " . $this->table_prefix . 'chris1278_cookie' . " SET  chris1278_name  = 'neuer_name6' WHERE chris1278_name ='cs_6_enable'",
		"UPDATE " . $this->table_prefix . 'chris1278_cookie' . " SET  chris1278_name  = 'neuer_name7' WHERE chris1278_name ='cs_7_enable'",
		"UPDATE " . $this->table_prefix . 'chris1278_cookie' . " SET  chris1278_name  = 'neuer_name8' WHERE chris1278_name ='cs_8_enable'",
		"UPDATE " . $this->table_prefix . 'chris1278_cookie' . " SET  chris1278_name  = 'neuer_name9' WHERE chris1278_name ='cs_9_enable'",
		"UPDATE " . $this->table_prefix . 'chris1278_cookie' . " SET  chris1278_name  = 'neuer_name10' WHERE chris1278_name ='cs_10_enable'",
		"UPDATE " . $this->table_prefix . 'chris1278_cookie' . " SET  chris1278_name  = 'neuer_name11' WHERE chris1278_name ='cs_11_enable'",
		"UPDATE " . $this->table_prefix . 'chris1278_cookie' . " SET  chris1278_name  = 'neuer_name12' WHERE chris1278_name ='cs_12_enable'",
		"UPDATE " . $this->table_prefix . 'chris1278_cookie' . " SET  chris1278_name  = 'neuer_name13' WHERE chris1278_name ='cs_13_enable'",
		];

		foreach ($sql_ary as $sql)
		{
			$this->db->sql_query($sql);
		}
	}
}
Im Grunde genommen entspricht die Zeile hier genau dem Format was man auch i n phpmyadmin sql als befehl eingeben kann:

Code: Alles auswählen

"UPDATE " . $this->table_prefix . 'chris1278_cookie' . " SET  chris1278_name  = 'neuer_name1' WHERE chris1278_name ='cs_1_enable'",
entspricht in der ausgabe genau dem hier:

Code: Alles auswählen

UPDATE phpbb_chris1278_cookie SET chris1278_name 'neuer_name1' WHERE chris1278_name = 'cs_1_enable'
In sofern das ziel erreicht.
Benutzeravatar
Dr.Death
Moderator
Moderator
Beiträge: 17400
Registriert: 23.04.2003 08:22
Wohnort: Xanten
Kontaktdaten:

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

Beitrag von Dr.Death »

Da fehlt wohl noch ein Semikolon an einer speziellen stelle.

Was sagt denn die Debug Ausgabe?
Welcher SQL Befehl wird denn tatsächlich ausgeführt wenn dein Script läuft ?

Bau mal eine Debug Ausgabe ein.

Ich hatte den Code aus dem Bauch raus geschrieben...da waren wohl doppelte Anführungszeichen beim Feldnamen zuviel:

Code: Alles auswählen

	public function import_optin()
	{
		$sql_ary = [
		
		'UPDATE ' . $this->table_prefix . 'chris1278_cookie SET chris1278_name =  "neuer_name_fuer_cs1_enabled"  WHERE chris1278_name = "old1"',
		'UPDATE ' . $this->table_prefix . 'chris1278_cookie SET chris1278_name =  "neuer_name_fuer_cs2_enabled"  WHERE chris1278_name = "old2"',
		'UPDATE ' . $this->table_prefix . 'chris1278_cookie SET chris1278_name =  "neuer_name_fuer_cs3_enabled"  WHERE chris1278_name = "old3"',
		'UPDATE ' . $this->table_prefix . 'chris1278_cookie SET chris1278_name =  "neuer_name_fuer_cs4_enabled"  WHERE chris1278_name = "old4"',
		'UPDATE ' . $this->table_prefix . 'chris1278_cookie SET chris1278_name =  "neuer_name_fuer_cs5_enabled"  WHERE chris1278_name = "old5"',
		'UPDATE ' . $this->table_prefix . 'chris1278_cookie SET chris1278_name =  "neuer_name_fuer_cs6_enabled"  WHERE chris1278_name = "old6"',
		'UPDATE ' . $this->table_prefix . 'chris1278_cookie SET chris1278_name =  "neuer_name_fuer_cs7_enabled"  WHERE chris1278_name = "old7"',
		'UPDATE ' . $this->table_prefix . 'chris1278_cookie SET chris1278_name =  "neuer_name_fuer_cs8_enabled"  WHERE chris1278_name = "old8"',
		
		];

		foreach ($sql_ary as $sql)
		{
			 echo $sql . " <br/>";
			 // $this->db->sql_query($sql);
		}
	}
Benutzeravatar
chris1278
Mitglied
Beiträge: 3533
Registriert: 12.11.2007 06:20
Wohnort: Euskirchen
Kontaktdaten:

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

Beitrag von chris1278 »

Ok ich werde das was du gepostet hast mal laden und berichten. Aber so wie ich das in meinem Letzten beitrag geschrieben habe, funktioniert das ohne fehlermeldung. Und das resultat ist genau so wie ich das wollte.

@edit

Ich hab den Code jetzt mal (angepasst old1 in entsprechende variablen genannt) geladen und im kopfbreiech zeigts das hier:

https://prnt.sc/1qopio5

@edit2

ALso mit der Variante geht das auch. Die änerungen werden dann auch übernommen. Aber mal eine ganz dumme frage ich sehe wo du die semikolons gemacht hast aber was genau ist denn jetzt der unterschied.
Benutzeravatar
Dr.Death
Moderator
Moderator
Beiträge: 17400
Registriert: 23.04.2003 08:22
Wohnort: Xanten
Kontaktdaten:

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

Beitrag von Dr.Death »

Wenn du die Echo Ausgabe wieder rausnimmst, funktioniert es weiterhin?
Dann ist ja alles ok.
69bruno
Mitglied
Beiträge: 445
Registriert: 05.06.2020 08:21

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

Beitrag von 69bruno »

Aber mal eine ganz dumme frage ich sehe wo du die semikolons gemacht hast aber was genau ist denn jetzt der unterschied.
Wurde dir schon nahegelegt, das nachzulesen....
Dr.Death hat geschrieben: 28.08.2021 13:30 Die Variable $sql ist ja kein Array.... ich glaube du solltest mal die Syntax von PHP lernen....

Wie man Array Zeilen abschließt, wie man Befehle abschließt, wie man Zeichenketten verbindet, wie und wann man doppelte Anführungszeichen verwendet und auch warum....und wann einzelne Anführungszeichen und auch warum.


probier das mal, sollte ohne Syntax Fehler sein..... musst du halt noch anpassen.
Ob es funktioniert weiß ich nicht, hab es mal so
"Zeichenketten verbinden" sind die Zauberwörter. Das musst du mal mit "php" googeln. Es gibt mehrere Fundstellen, was der Unterschied ist.
In der Kommunikation gibt das aber Schwierigkeiten, wenn Dir andere helfen wollen und Du dir diese Grundlageninfos nicht aneignest.
Wenn ich dir erzähle, dass du links einschlagen musst, um mit einem Anhänger rückwärts links um die Ecke zu fahren und Du mir sagst, dass das falsch ist, dann fehlt vlt das gemeinsame Grundverständnis, dass es Anhäger mit gelenkter Vorderachse gibt und Einachser. Wenn ich dann wiederholt sage, dass ich das aber anders gesehen habe, wird meine Aussage nicht besser, solange wir nicht von dem gleichen Anhänger (mit gelenkter Vorderachse) reden. Erst dann habe ich Recht. Spätestens beim 3. mal wirst Du aber denken, wie ich darauf komme, dir da etwas erzählen zu wollen.
Das ist kein Angriff, soll Dich nur ermutigen, das mal wirklich nachzulesen..
Forum: cruiser-lounge.de
PHPBB-Version: 3.3.11 / Debian-Linux 10 / PHP-Version: 8.1
Benutzeravatar
chris1278
Mitglied
Beiträge: 3533
Registriert: 12.11.2007 06:20
Wohnort: Euskirchen
Kontaktdaten:

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

Beitrag von chris1278 »

ja ich hab die auch durchlaufen lassen also das echo weg und das eine wieder reinkommentiert und der Effekt ist der selbe. die Änderungen werden gemacht. Was aber jetzt genau ist der unterschied zu dem was ich gemacht habe und was du gemacht hast. klar ich sehe du hast an stellen Semikolons gesetzt wo ich Anführungsstriche genutzt habe und umgekehrt.

Was ist den jetzt der unterschied von beiden Varianten.
Benutzeravatar
Dr.Death
Moderator
Moderator
Beiträge: 17400
Registriert: 23.04.2003 08:22
Wohnort: Xanten
Kontaktdaten:

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

Beitrag von Dr.Death »

Der Syntax…. ist der Unterschied…
Benutzeravatar
chris1278
Mitglied
Beiträge: 3533
Registriert: 12.11.2007 06:20
Wohnort: Euskirchen
Kontaktdaten:

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

Beitrag von chris1278 »

Ok. Deiner ja funktioniert werd ich dann auch den nehmen den du verbessert hast.
Benutzeravatar
Dr.Death
Moderator
Moderator
Beiträge: 17400
Registriert: 23.04.2003 08:22
Wohnort: Xanten
Kontaktdaten:

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

Beitrag von Dr.Death »

Zur Erklärung:

Normalerweise wird der Inhalt einer Variablen beim Zuweisen innerhalb von den Hochkommata übergeben.
Ein Befehl wird immer mit einem Semikolon abgeschlossen.

Beispiel:

Code: Alles auswählen

$test = 'Apfel';
Der lange SQL Code lautet ja so:

Code: Alles auswählen

UPDATE phpbb_chris1278_cookie SET chris1278_name 'neuer_name1' WHERE chris1278_name = 'cs_1_enable'
Da man die einzelnen Hochkommata aber auch benutzt um Texte (Strings) von Variablen oder auch PHP Befehlen zu trennen bzw. Zeichenketten zusammen zu kleben, habe ich die Hochkommata (oder auch Single Quoten genannt) durch Anführungszeichen ( Double Quotes ) ersetzt:

Code: Alles auswählen

UPDATE phpbb_chris1278_cookie SET chris1278_name "neuer_name1" WHERE chris1278_name = "cs_1_enable"
Wir könnten nun also schreiben:

Code: Alles auswählen

$sql = UPDATE phpbb_chris1278_cookie SET chris1278_name "neuer_name1" WHERE chris1278_name = "cs_1_enable"
Das klappt aber aus zwei Gründen nicht:
Das Ende des Befehls hat kein Semikolon.
Der Variablen Wert steht nicht zwischen zwei Hochkommata.

Korrekt wäre:

Code: Alles auswählen

$sql = 'UPDATE phpbb_chris1278_cookie SET chris1278_name "neuer_name1" WHERE chris1278_name = "cs_1_enable"';
Nun wird es aber etwas spannender... wir wollen ja den Tabellen Präfix als Variable in den eigentlichen Variablenwert übergeben.
Dieser Tabellen Präfix wird aber über eine PHP Funktion ermittelt und übergeben. $this->table_prefix

Um in einer Zeichenkette eine PHP Funktion einzubauen, müssen wir die Zeichenkette "aufbrechen" den PHP Code dazwischen schieben und den Rest der alten Zeichenkette wieder drankleben.

Zeichenketten verbindet man mit eine Punkt.
Siehe dazu auch: https://www.php.net/manual/de/language. ... string.php

Beispiel:

Code: Alles auswählen

$variable1 = "ein ";
echo "Da steht " . $variable1 . "Haus.";
Ergebnis: "Da steht ein Haus."

Also:

Code: Alles auswählen

$sql = 'UPDATE ' . $this->table_prefix . 'chris1278_cookie SET chris1278_name "neuer_name1" WHERE chris1278_name = "cs_1_enable"';
Nächster Schritt:
Wir weisen den SQL Befehl keiner Variablen zu, sondern einem Array!

Alte Schreibweise:

Code: Alles auswählen

$sql_ary = array(
	'UPDATE ' . $this->table_prefix . 'chris1278_cookie SET chris1278_name "neuer_name1" WHERE chris1278_name = "cs_1_enable"',
	);
Hinweis für die Syntax:
Innerhalb von einem Array, wird jede Array Zuweisung mit einem Komma abgeschlossen.
Ausserhalb vom Array Also nach der letzten geschlossenen Klammer gehört das Semikolon.

Code: Alles auswählen

$variable_array = array( 
   'variable1',
   'variable2',
   'variable3',
);
Antworten

Zurück zu „Extension Bastelstube“