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: 3536
Registriert: 12.11.2007 06:20
Wohnort: Euskirchen
Kontaktdaten:

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

Beitrag von chris1278 »

Werde das später testen und berichten.

Automatisch dem Beitrag hinzugefügt nach 36 Minuten 42 Sekunden. Bitte Regel für „Topic-Bumping“ beachten. Danke.

Also bruno das funktioniert nicht. Du hast ja auch die tabelle falch eingekommat.

Du musst dieses hier in jedemfall als solches auch nehmen:

Code: Alles auswählen

. $this->table_prefix . 'chris1278_cookie' .
das ist nichts anderes als ob du dort das stehen hättest:

Code: Alles auswählen

phpbb_chris1278_cookie
Nehmen wir mal deinen code den du zu letzt gepostet hast:

Code: Alles auswählen

'UPDATE ' . $this->table_prefix . 'chris1278_cookie SET chris1278_name =  neuer_name_fuer_cs1_enabled WHERE ' . $this->db->sql_in_set('chris1278_name', 'cs1_enabled');
ich hab das bewusst jetzt mal als zeile gemacht.

du hättest das in jedemfall so machen müssen zumindest der anfang:

Code: Alles auswählen

'UPDATE ' . $this->table_prefix . 'chris1278_cookie' .
Du hast das ' nach cookie weggenommen. somiot hast du im prinzip gesagt update phpbb_ und danach nix. Das hat zwar fehlerfrei geladen aber nix gebracht da leider nix geändert wurd.

Wenn wir mal den update bbcode nehmen:

Code: Alles auswählen

'UPDATE ' . BBCODES_TABLE . '
				SET display_on_posting = 0
				WHERE ' . $this->db->sql_in_set('bbcode_tag', $bbcode_tags);
Wenn ich das jetzt in eine eigene tabelle so machen würde müsste da sowas stehen:

Code: Alles auswählen

'UPDATE ' . $this->table_prefix . 'chris1278_cookie' . '
				SET display_on_posting = 0
				WHERE ' . $this->db->sql_in_set('bbcode_tag', $bbcode_tags);

Wenn du die ganze datei zum testen willst nim den code hier:

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 import_optin()
	{

		$sqlary = array(
		//einfügen sql code beginn
		
		'UPDATE ' . $this->table_prefix . 'chris1278_cookie
				SET chris1278_name =  neuer_name_fuer_cs1_enabled
				WHERE ' . $this->db->sql_in_set('chris1278_name', 'cs1_enabled');
				
				
		//ende sql code einfügen
		);

		foreach ($sqlary as $sql)
		{
			$this->db->sql_query($sql);
		}
	}
}
Speichere die datei als: v_1_0_4.php in das migrationsverzeichnis. dann kannst du lokal testeb´n. wenns funktioniert müsstest du das in der tabelle chris1278_cookie sehen das cs1_enable weg ist und durch deine variable ersetzt wurde.
69bruno
Mitglied
Beiträge: 445
Registriert: 05.06.2020 08:21

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

Beitrag von 69bruno »

Ich denke, dass das schon richtig ist. Ich vermute, dass man bei sql_in_set() zwingend ein array zum Vergleich verwenden muss. Finde da aber keine entsprechend aussagekräftige Doku zu. Heute schaffe ich es auch nicht mehr, dass mal als array zu testen.
Forum: cruiser-lounge.de
PHPBB-Version: 3.3.11 / Debian-Linux 10 / PHP-Version: 8.1
Benutzeravatar
Dr.Death
Moderator
Moderator
Beiträge: 17401
Registriert: 23.04.2003 08:22
Wohnort: Xanten
Kontaktdaten:

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

Beitrag von Dr.Death »

Das Ganze könnte man eleganter lösen:

Erst definierst Du welcher Key chris1278_name mit welchem Wert neuer_name_fuer_cs1_enabled aktualisiert werden soll als Array:

Code: Alles auswählen

$sql_ary = [
		'chris1278_name' => 'neuer_name_fuer_cs1_enabled',
	   ];
Danach übergibst du dieses Array an die Funktion sql_build_array()

Ergebnis könnte dann so aussehen:

Code: Alles auswählen

		$sql_ary = [
			'chris1278_name' => 'neuer_name_fuer_cs1_enabled',
		];

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

Lesestoff inklusive Erklärung:
https://area51.phpbb.com/docs/33x/codin ... s.html#sql
Benutzeravatar
chris1278
Mitglied
Beiträge: 3536
Registriert: 12.11.2007 06:20
Wohnort: Euskirchen
Kontaktdaten:

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

Beitrag von chris1278 »

Hallo DR.Death

Erstmal danke aber das funktioniert leider nicht.

Ich habe eine neue Migrationsdatei erstellt mit folgendem Code:

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 import_optin()
	{
	
		
		$sql_ary = [
			'chris1278_name' => 'neuer_name_fuer_cs1_enabled',
		];

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

		
	}
}
Leider bleibt das ohne Wirkung.

Der Code kann auch eigentlich nicht funktionieren weil wenn ich den phpMyAdmin Befehl richtig verstehe muss man ja in dem Befehl den neuen Namen und den alten Namen angeben.



Der Original Befehl den ich in phpMyAdmin in die sql befehlszeile eingeben würde lautet so:

Code: Alles auswählen

UPDATE phpbb_chris1278_cookie SET chris1278_name = 'neuer_name' WHERE chris1278_name = 'cs_1_enable' 
Und da ich ja auch mit INSERT INTO die variablen zu beginn anlege wollte ich halt auch so den Befehl für update haben.

Weil ich ja auch 13 Variablen ändern muss. Außerdem muss ich ja aufpassen das ich den Code so schreibe das nur die eine Variable auch mit dem Richtigen Namen ersetzt wird. Nicht das auf einmal alle Variablen denselben Namen tragen.
Benutzeravatar
Dr.Death
Moderator
Moderator
Beiträge: 17401
Registriert: 23.04.2003 08:22
Wohnort: Xanten
Kontaktdaten:

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

Beitrag von Dr.Death »

Setze doch mal ein folgendes nach der Zeile:

Code: Alles auswählen

$sql = 'UPDATE ' . $this->table_prefix . 'chris1278_cookie
			SET ' . $db->sql_build_array('UPDATE', $sql_ary) ;
ein:

echo "Dieses SQL Statement wird ausgeführt: " . $sql; die();

Damit kannst debuggen, ob es überhaupt ausgeführt würde, und wenn ja wie der SQL Befehl lauten würde....
sollte dann so aussehen:
Dieses SQL Statement wird ausgeführt: UPDATE phpbb_chris1278_cookie SET chris1278_name = neuer_name_fuer_cs1_enabled

Außerdem gehe ich davon aus, das "chris1278_name" nur einmal in der Tabelle phpbb_chris1278_cookie vorkommt.
Daher braucht man in diesem Fall the WHERE Klausel nicht.
Benutzeravatar
chris1278
Mitglied
Beiträge: 3536
Registriert: 12.11.2007 06:20
Wohnort: Euskirchen
Kontaktdaten:

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

Beitrag von chris1278 »

Ich hab das jetzt so gemacht:

Code: Alles auswählen

public function import_optin()
	{
	
	
	$sql_ary = [
			'chris1278_name' => 'neuer_name_fuer_cs1_enabled',
		];

		$sql = 'UPDATE ' . $this->table_prefix . 'chris1278_cookie
			SET ' . $db->sql_build_array('UPDATE', $sql_ary) ;
			echo "Dieses SQL Statement wird ausgeführt: " . $sql; die();
			
		$this->db->sql_query($sql);
		
	}
Aber ich habe nix gesehen. Aktiviert und dann kam nur die bekannte grünne ok meldung.
Benutzeravatar
Dr.Death
Moderator
Moderator
Beiträge: 17401
Registriert: 23.04.2003 08:22
Wohnort: Xanten
Kontaktdaten:

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

Beitrag von Dr.Death »

Klar, du hast ja als Migrationspunkt das angegeben:

public function effectively_installed()
{
return;
}


Damit gibst du vorab den Wert "Ist bereits installiert, braucht nicht erneut installiert werden" als "wahr" zurück, ohne geprüft zu haben ob es wirklich installiert wurde.... damit wird es nicht erneut ausgeführt.

Check If Effectively Installed

The function effectively_installed() is called before installing a Migration. This allows you to transition from a previous database installer method to Migrations easily.

If it returns true, the Migration is marked as installed without applying any changes. This function is not required and typically should not be needed. This is only needed if you are trying to allow updates from a system that may currently be installed, but where migrations haven’t been run yet (e.g. updating a mod from 3.0.x to 3.1.x).
Benutzeravatar
Mike-on-Tour
Supporter
Supporter
Beiträge: 1076
Registriert: 13.01.2020 21:09
Kontaktdaten:

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

Beitrag von Mike-on-Tour »

Einfach eine Publico Funktion () definieren und draud bauen, dass diese vom Migration Tool abgearbeitet wird, ist zumindest naiv.
Schau mal auf area51 in die Dokumentation zu custom functions bei im Abschnitt Migrationen.
Da wird erklärt, wie man das machen muss.
Benutzeravatar
Dr.Death
Moderator
Moderator
Beiträge: 17401
Registriert: 23.04.2003 08:22
Wohnort: Xanten
Kontaktdaten:

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

Beitrag von Dr.Death »

Beispiel:

https://github.com/DrDeath/phpbb-ext-f1 ... e_2021.php

Zudem deine public function import_optin() überhaupt nicht ausgeführt wird.

Siehe dazu auch die ausführliche Erklärung:
https://area51.phpbb.com/docs/dev/3.3.x ... anges.html
Benutzeravatar
chris1278
Mitglied
Beiträge: 3536
Registriert: 12.11.2007 06:20
Wohnort: Euskirchen
Kontaktdaten:

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

Beitrag von chris1278 »

Ich hab dieses enfernt also jetzt so:

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
{


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

	public function import_optin()
	{
	
	
	$sql_ary = [
			'chris1278_name' => 'neuer_name_fuer_cs1_enabled',
		];

		$sql = 'UPDATE ' . $this->table_prefix . 'chris1278_cookie
			SET ' . $db->sql_build_array('UPDATE', $sql_ary) ;
			echo "Dieses SQL Statement wird ausgeführt: " . $sql; die();
			
		$this->db->sql_query($sql);
		
	}
}
leider keine Änderung.

Ich hab mir mal aus dem was du mir verlinkt hast was rausgesucht und angepasst aber der meldet dann systntay eroro:

Code: Alles auswählen

$sql_ary = array(
	'c1s_1_enable'		=> $new_name,
	'cs_1_enable'		=> $old_name,
	);

	$sql = 'UPDATE ' . phpbb_chris1278_cookie '
		SET ' . $db->sql_build_array('UPDATE', $new_name) . '
		WHERE chris1278_name = ' . (int) $old_name;
	$db->sql_query($sql);

Wenn ich das dann so lade:

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 import_optin()
	{
	
	
	$sql_ary = array(
	'c1s_1_enable'		=> $new_name,
	'cs_1_enable'		=> $old_name,
	);

	$sql = 'UPDATE ' . phpbb_chris1278_cookie '
		SET ' . $db->sql_build_array('UPDATE', $new_name) . '
		WHERE chris1278_name = ' . (int) $old_name;
	$db->sql_query($sql);
			
		
		
	}
}
dann spuckt der mir beim aktivieren eine weisse seite mit dieser meldung aus:


Parse error: syntax error, unexpected ''' (T_CONSTANT_ENCAPSED_STRING) in C:\xampp\73\htdocs\wwh\ext\chris1278\cookie\migrations\v_1_0_4.php on line 33


und line 33 wäre das hier: SET ' . $db->sql_build_array('UPDATE', $new_name) . '

Aber in dem Befehl ist set und where enthalten daher denke ich das dies das ist was ich brauche.

Automatisch dem Beitrag hinzugefügt nach 2 Minuten 14 Sekunden. Bitte Regel für „Topic-Bumping“ beachten. Danke.
Mike-on-Tour hat geschrieben: 28.08.2021 12:03 Einfach eine Publico Funktion () definieren und draud bauen, dass diese vom Migration Tool abgearbeitet wird, ist zumindest naiv.
Schau mal auf area51 in die Dokumentation zu custom functions bei im Abschnitt Migrationen.
Da wird erklärt, wie man das machen muss.
Mike deswegen hatte ich ja auch hier gefragt:

viewtopic.php?p=1413289#p1413289

Wie man den Update Befehl vom phpMyAdmin so umschreibt mit Syntax wie den insert Befehl. weil ich ja auch die variablen die ich nach anlegen der Tabelle einfüge auch mit dem Befehl schreibe den ich übers phpMyAdmin habe. Dahatte mir zu beginn BNa bei geholfen.
Antworten

Zurück zu „Extension Bastelstube“