User per Skript registrieren -> SQL Fehler...

In diesem Forum kann man Fragen zur Programmierung stellen, die bei der Entwicklung von Mods für phpBB 3.0.x oder dem Modifizieren des eigenen Forums auftauchen.
Forumsregeln
phpBB 3.0 hat das Ende seiner Lebenszeit überschritten
phpBB 3.0 wird nicht mehr aktiv unterstützt. Insbesondere werden - auch bei Sicherheitslücken - keine Patches mehr bereitgestellt. Der Einsatz von phpBB 3.0 erfolgt daher auf eigene Gefahr. Wir empfehlen einen Umstieg auf die neuste phpBB-Version, welches aktiv weiterentwickelt wird und für welches regelmäßig Updates zur Verfügung gestellt werden.
Antworten
crazybread
Mitglied
Beiträge: 3
Registriert: 07.12.2009 21:34

User per Skript registrieren -> SQL Fehler...

Beitrag von crazybread »

Hallo zusammen,
nach langem Suchen wende ich mich nun an die Community, in der Hoffnung, hier eine Antwort zu bekommen:
Ich versuche, per Skript (s.u.) Benutzer zu registrieren.

Code: Alles auswählen

<?php
define('PHPBB_ROOT_PATH', $_SERVER['DOCUMENT_ROOT'].'/studienarbeit/');

$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
$phpEx = substr(strrchr(__FILE__, '.'), 1);

define('IN_PHPBB', true);

require_once (PHPBB_ROOT_PATH.'config.php');
require_once (PHPBB_ROOT_PATH.'includes/functions_user.php');
require_once (PHPBB_ROOT_PATH.'includes/session.php');
require_once (PHPBB_ROOT_PATH.'includes/utf/utf_tools.php');
require_once (PHPBB_ROOT_PATH.'includes/functions.php');
require_once (PHPBB_ROOT_PATH.'includes/auth.php');
require_once (PHPBB_ROOT_PATH.'includes/constants.php');
require_once (PHPBB_ROOT_PATH.'includes/acm/acm_'.$acm_type.'.'.$phpEx);
require_once (PHPBB_ROOT_PATH.'includes/cache.php');
$dbms = 'mysqli';

require($phpbb_root_path . 'includes/db/' . $dbms . '.' . $phpEx);

$cache = new Cache();
$db	   = new $sql_db();
$config = $cache->obtain_config();
$db->sql_connect($dbhost, $dbuser, $dbpasswd, $dbname, $dbport, false, defined('PHPBB_DB_NEW_LINK') ? PHPBB_DB_NEW_LINK : false);


//print_r ($config);

//echo $sql_db; // $sql_db => 'dbal_'+$dbms ( wird in dbal gesetzt)

//@define('DEBUG', true);
//@define('DEBUG_EXTRA', true);

$group_name = 'REGISTERED';
$sql = 'SELECT group_id
        FROM ' . GROUPS_TABLE . "
        WHERE group_name = '" . $db->sql_escape($group_name) . "'
            AND group_type = " . GROUP_SPECIAL;
$result = $db->sql_query($sql, 0);
$row = $db->sql_fetchrow($result);
$group_id = $row['group_id'];


echo ("Group ID: ".$group_id."<br />"); //Richtige Schreibweise -> EXTREM Wichtig

//Das sind die Muss - Angaben für einen neuen User
	$name = md5(time());
	$newUser = array(
		'username'			=> $name,
		'user_password'		=> phpbb_hash("passwort"),
		'user_email'		=> $name.'@gmx.de',
		'group_id'			=> $group_id,
		'user_type'			=> USER_NORMAL,
	);
	

// tables affected: users table, profile_fields_data table, groups table, and config table.
$id = user_add($newUser);
echo("Eingefügt! User ID: $id");

	$name = md5(time()+1);
	$newUser = array(
		'username'			=> $name,
		'user_password'		=> phpbb_hash("passwort"),
		'user_email'		=> $name.'@gmx.de',
		'group_id'			=> $group_id,
		'user_type'			=> USER_NORMAL,
		//regdate ist optional
		'user_regdate'      => time(),
	);

$id2 = user_add($newUser);
echo("Eingefügt! User ID: $id2");	
?>
Folgende Testausgaben habe ich bei funcions.php, function "set_config" eingebaut:

Code: Alles auswählen

function set_config($config_name, $config_value, $is_dynamic = false)
{
	global $db, $cache, $config;
	$sql = 'UPDATE ' . CONFIG_TABLE . "
		SET config_value = '" . $db->sql_escape($config_value) . "'
		WHERE config_name = '" . $db->sql_escape($config_name) . "'";
	$db->sql_query($sql);

	echo ($config_name."<br />".$config_value."<br />".$is_dynamic."<br />".$sql);
	echo ('<br />affectedrows:'.$db->sql_affectedrows().'<br />config(isset):'.isset($config[$config_name]));
	if (!($db->sql_affectedrows() || isset($config[$config_name])))
	{
		$sql = 'INSERT INTO ' . CONFIG_TABLE . ' ' . $db->sql_build_array('INSERT', array(
			'config_name'	=> $config_name,
			'config_value'	=> $config_value,
			'is_dynamic'	=> ($is_dynamic) ? 1 : 0));
		echo ("<br />".$sql);		
		$db->sql_query($sql);
	}

	$config[$config_name] = $config_value;

	if (!$is_dynamic)
	{
		$cache->destroy('config');
	}
	echo "<hr />";
}
Und hier die zugehörigen Ausgaben:
rand_seed
1015e7db148662c2b17e835515326498
1
UPDATE phpbb_config SET config_value = '1015e7db148662c2b17e835515326498' WHERE config_name = 'rand_seed'
affectedrows:1
config(isset):1rand_seed_last_update
1260218349
1
UPDATE phpbb_config SET config_value = '1260218349' WHERE config_name = 'rand_seed_last_update'
affectedrows:1
config(isset):newest_user_id
92
1
UPDATE phpbb_config SET config_value = '92' WHERE config_name = 'newest_user_id'
affectedrows:1
config(isset):newest_username
0e2097f12d106b632248b2924442ad66
1
UPDATE phpbb_config SET config_value = '0e2097f12d106b632248b2924442ad66' WHERE config_name = 'newest_username'
affectedrows:1
config(isset):newest_user_colour
000000
1
UPDATE phpbb_config SET config_value = '000000' WHERE config_name = 'newest_user_colour'
affectedrows:0
config(isset):
INSERT INTO phpbb_config (config_name, config_value, is_dynamic) VALUES ('newest_user_colour', '000000', 1)
Fatal error: SQL ERROR [ mysqli ]

Duplicate entry 'newest_user_colour' for key 'PRIMARY' [1062]

An sql error occurred while fetching this page. Please contact an administrator if this problem persists. in D:\Programme\xampp\htdocs\studienarbeit\includes\db\dbal.php on line 678
Man sieht, dass es seltsamerweise nur bei newest_user_colur einen Insert Befehl gibt, der dann natürlich einen Fehler wirft.

Nun habe ich schon herumprobiert, den Vorgang nachvollzogen, gegoogelt und was weiß ich noch was...
Ich hoffe, jemand von euch kann mir helfen und sagen, wie dieser Fehler zustande kommt und wie man ihn ausmerzen kann.

Viele Grüße,

CrazyBread
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Re: User per Skript registrieren -> SQL Fehler...

Beitrag von gn#36 »

Könnte sein dass da irgendwie der Cache dran schuld ist, die Update Anweisung merkt davon nichts weil der neue Wert bereits gesetzt war und damit die Reihe nicht betroffen ist:
mysql_affected_rows hat geschrieben:Hinweis: Benutzen Sie UPDATE wird MySQL keine Spalten aktualisieren, bei denen der neue dem alten Wert entpspricht. Das kann dazu führen, dass mysql_affected_rows() nicht die tatsächliche Anzahl der betroffenen Zeilen liefert, sondern nur die, die wörtlich durch die Anfrage betroffen sind.
REPLACE Anfragen löschen zunächst den Eintrag mit dem gleichen Primärschlüssel und fügen dann den neuen Eintrag ein. Diese Funktion gibt in diesem Fall die Summe aus gelöschten und eingefügten Einträgen zurück.
Entsprechend ist der Wert für affected_rows 0 bei dem Update. Weil der Wert nicht in der config Variablen steht gibt's den insert und der schlägt dann fehl weil das Ding schon in der Datenbank steht. Also sollte ein einfaches leeren des Caches das Problem beheben würde ich vermuten, denn die Inhalte der config Tabelle werden da drin abgelegt - so häufig ändern sie sich ja eigentlich auch nicht.

Bleibt die Frage warum dieses Feld da nicht drin steht, denn eigentlich ist das ein Standardfeld.

Mir ist allerdings auch nicht ganz klar warum du, wenn du eh schon den ganzen phpBB Kram lädst, nicht auch einfach gleich die common.php einbindest, die erledigt doch den ganzen Initialisierungskram für dich.
Dann würdest du mit einem simplen

Code: Alles auswählen

<?php
define('PHPBB_ROOT_PATH', $_SERVER['DOCUMENT_ROOT'].'/studienarbeit/');

$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
$phpEx = substr(strrchr(__FILE__, '.'), 1);

define('IN_PHPBB', true);
require("{$phpbb_root_path}common.$phpEx");
require_once("{$phpbb_root_path}includes/functions_user.$phpEx"); 
für die Initialisierungen auskommen.
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
crazybread
Mitglied
Beiträge: 3
Registriert: 07.12.2009 21:34

Re: User per Skript registrieren -> SQL Fehler...

Beitrag von crazybread »

Danke für die Antwort - das war wohl des Rätsels Lösung.
Ich habe mich Schritt für Schritt vorgearbeitet, da ich die Funktionsweise von phpbb verstehen muss.
Aber mit der Einbindung der common.php sieht das ganze viel übersichtlicher aus!
Antworten

Zurück zu „[3.0.x] Mod Bastelstube“