Bräuchte Hilfe bei PHP-Code für SQL-Abfrage

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
J_BA
Mitglied
Beiträge: 19
Registriert: 14.08.2008 19:05

Bräuchte Hilfe bei PHP-Code für SQL-Abfrage

Beitrag von J_BA »

Hallo,

möchte den Auto Group MOD um eine kleine Funktion erweitern.
Er soll für jeden User den er überprüft auch die E-Mail mit überprüfen und es sollen dann nur User mit einer bestimmten Mail-Domain den Gruppen zugefügt werden.

In der functions_autogroup.php gibt es folgende Passage, die dafür vielleicht in Frage käme:

Code: Alles auswählen

		// we need some info from the DB...to avoid possible SQL injection, we select *
		$sql = 'SELECT * FROM ' . USERS_TABLE .
			" WHERE " . $db->sql_in_set('user_id', $users);
		$result = $db->sql_query($sql);

		while ($row = $db->sql_fetchrow($result))
		{
			$user_row[$row['user_id']] = $row;
			$check['posts'][$row['user_id']] = (int) $row['user_posts'];
			$check['days'][$row['user_id']] = (int) max(1, round((time() - $row['user_regdate']) / 86400));
			$check['warnings'][$row['user_id']] = (int) $row['user_warnings'];
		}
Vielleicht könnte man bei dem Ausdruck

$sql = 'SELECT * FROM ' . USERS_TABLE .
" WHERE " . $db->sql_in_set('user_id', $users);


noch die zusätzliche Bedingung "und wo user_email gleich *@bestimmtedomain.de ist" hinzufügen, so dass das Skript nur User mit dieser Email auswählt.

Könnte mir da vielleicht ein PHP/SQL-Sprachiger mit der Formulierung helfen. ;-)

Danke!
Benutzeravatar
S2B
Ehemaliges Teammitglied
Beiträge: 3258
Registriert: 10.08.2004 22:48
Wohnort: Aachen
Kontaktdaten:

Beitrag von S2B »

SQL-Befehl:

Code: Alles auswählen

AND user_email LIKE '%@bestimmtedomain.de'
Gruß, S2B
Keinen Support per ICQ/PM!
Hier kann man meine PHP-Skripte und meine MODs für phpBB runterladen.
J_BA
Mitglied
Beiträge: 19
Registriert: 14.08.2008 19:05

Beitrag von J_BA »

S2B hat geschrieben:SQL-Befehl:

Code: Alles auswählen

AND user_email LIKE '%@bestimmtedomain.de'
Danke schon mal. :)

Wie füge ich es ein? So?

Code: Alles auswählen

$sql = 'SELECT * FROM ' . USERS_TABLE . 
         " WHERE " . $db->sql_in_set('user_id', $users) . " AND user_email LIKE '%@bestimmtedomain.de' ";
Benutzeravatar
Samus
Mitglied
Beiträge: 108
Registriert: 12.01.2005 21:13
Wohnort: Remscheid

Beitrag von Samus »

Hallo,

ich würde ja glatt sagen ja. Aber wie heissts so schön? Probieren geht über studieren ;)

Teste es doch ersteinmal selbst und überleg dann, wenn es nicht funzt, ob und wie du das ändern müsstest

:P

mfg
J_BA
Mitglied
Beiträge: 19
Registriert: 14.08.2008 19:05

Beitrag von J_BA »

Code: Alles auswählen

$sql = 'SELECT * FROM ' . USERS_TABLE .
			" WHERE " . $db->sql_in_set('user_id', $users) . " AND user_email LIKE '%@bestimmtedomain.de' ";

Code: Alles auswählen

$sql = 'SELECT * FROM ' . USERS_TABLE .
			" WHERE " . $db->sql_in_set('user_id', $users) . " AND " . user_email . " LIKE '%@bestimmtedomain.de' ";
und

Code: Alles auswählen

$sql = 'SELECT * FROM ' . USERS_TABLE .
			" WHERE " . $db->sql_in_set('user_id', $users) . " AND " . $db->sql_in_set('user_email', $users) . " LIKE '%@bestimmtedomain.de' ";
haben alle nicht funktioniert. Das Skript wählt weiterhin alle User aus.

Also, wäre nett wenn sich das noch mal jemand anschauen könnte, vielleicht ist es auch die falsche Stelle im Code. Hier ist die Datei.
Benutzeravatar
S2B
Ehemaliges Teammitglied
Beiträge: 3258
Registriert: 10.08.2004 22:48
Wohnort: Aachen
Kontaktdaten:

Beitrag von S2B »

Lösung 1 ist die richtige, also liegt es wohl an der Stelle im Skript. :wink:

Edit: So wie es aussieht, müsstest du bei $users === false auch noch den aktuellen Benutzer überprüfen. Außerdem werden in der auto_groups_create() ebenfalls Benutzer abgefragt.
Gruß, S2B
Keinen Support per ICQ/PM!
Hier kann man meine PHP-Skripte und meine MODs für phpBB runterladen.
J_BA
Mitglied
Beiträge: 19
Registriert: 14.08.2008 19:05

Beitrag von J_BA »

S2B hat geschrieben:Edit: So wie es aussieht, müsstest du bei $users === false auch noch den aktuellen Benutzer überprüfen.
O.K. ich hab jetzt den Code unter "else" auch unter "if" verwendet. Also dies hier habe ich ersetzt

Code: Alles auswählen

if ($users === false)
	{
		$users = array($user->data['user_id']);

		$user_row[$user->data['user_id']] = $user->data;
		$check['posts'][$user->data['user_id']] = (int) $user->data['user_posts'];
		$check['days'][$user->data['user_id']] = (int) max(1, round((time() - $user->data['user_regdate']) / 86400));
		$check['warnings'][$user->data['user_id']] = (int) $user->data['user_warnings'];
	}
	else
	{
		// we need some info from the DB...to avoid possible SQL injection, we select *
		$sql = 'SELECT * FROM ' . USERS_TABLE .
			" WHERE " . $db->sql_in_set('user_id', $users) . " AND user_email LIKE '%@bestimmtedomain.de' ";
		$result = $db->sql_query($sql);

		while ($row = $db->sql_fetchrow($result))
		{
			$user_row[$row['user_id']] = $row;
			$check['posts'][$row['user_id']] = (int) $row['user_posts'];
			$check['days'][$row['user_id']] = (int) max(1, round((time() - $row['user_regdate']) / 86400));
			$check['warnings'][$row['user_id']] = (int) $row['user_warnings'];
		}
	}
mit dem hier:

Code: Alles auswählen

	if ($users === false)
	{
		$sql = 'SELECT * FROM ' . USERS_TABLE .
			" WHERE " . $db->sql_in_set('user_id', $users) . " AND user_email LIKE '%@bestimmtedomain.de' ";
		$result = $db->sql_query($sql);

		while ($row = $db->sql_fetchrow($result))
		{
			$user_row[$row['user_id']] = $row;
			$check['posts'][$row['user_id']] = (int) $row['user_posts'];
			$check['days'][$row['user_id']] = (int) max(1, round((time() - $row['user_regdate']) / 86400));
			$check['warnings'][$row['user_id']] = (int) $row['user_warnings'];
		}
	}
	else
	{
		// we need some info from the DB...to avoid possible SQL injection, we select *
		$sql = 'SELECT * FROM ' . USERS_TABLE .
			" WHERE " . $db->sql_in_set('user_id', $users) . " AND user_email LIKE '%@bestimmtedomain.de' ";
		$result = $db->sql_query($sql);

		while ($row = $db->sql_fetchrow($result))
		{
			$user_row[$row['user_id']] = $row;
			$check['posts'][$row['user_id']] = (int) $row['user_posts'];
			$check['days'][$row['user_id']] = (int) max(1, round((time() - $row['user_regdate']) / 86400));
			$check['warnings'][$row['user_id']] = (int) $row['user_warnings'];
		}
}
Jetzt habe ich einen SQL-Error:
Check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM phpbb_groups WHERE group_type <> 3 AND ()' at line
Und die phpBB Debug Note sagt:
[phpBB Debug] PHP Notice: in file /includes/functions_autogroup.php on line 68: Invalid argument supplied for foreach()
Die foreach-Zeile kommt direkt nach dem geänderten Code, hier:

Code: Alles auswählen

	// build SQL query...now using AND logic
	$sql_select = $sql_or = '';
	foreach ($check as $column => $value)
	{
		$sql_select .= "group_min_$column, group_max_$column, ";
		$sql_or .= " group_min_$column <> 0 OR group_max_$column <> 0 OR ";
	}
Benutzeravatar
S2B
Ehemaliges Teammitglied
Beiträge: 3258
Registriert: 10.08.2004 22:48
Wohnort: Aachen
Kontaktdaten:

Beitrag von S2B »

Nene, so einfach kannst du es dir nicht machen. Wenn sowohl beim if als auch beim else der gleiche Code stehen müsste, hätte der Autor des MODs diese Fälle nicht unterschieden...

Der if-Block füllt das $users-Array mit dem aktuellen Benutzer auf, wenn es beim Funktionsaufruf nicht angegeben wurde. In dem Fall musst du also auch lediglich den aktuellen Benutzer überprüfen - in diesem Fall wohl am besten ohne MySQL (die Daten sind ja bereits überprüft durchs Session-System), sondern direkt mit PHP-Funktionen. Schau dir dazu mal [php:strrpos] oder [php:preg_match] an.
Gruß, S2B
Keinen Support per ICQ/PM!
Hier kann man meine PHP-Skripte und meine MODs für phpBB runterladen.
J_BA
Mitglied
Beiträge: 19
Registriert: 14.08.2008 19:05

Beitrag von J_BA »

S2B hat geschrieben:sondern direkt mit PHP-Funktionen. Schau dir dazu mal [php:strrpos] oder [php:preg_match] an.
Oh je, das ist das Zeugs aus der bbcode.php, da bin ich ja total überfordert!

Du meinst so was?

Code: Alles auswählen

	// First: If there isn't a "[" and a "]" in the message, don't bother.
	if (! (strpos($text, "[") && strpos($text, "]")) )
	{
		// Remove padding, return.
		$text = substr($text, 1);
		return $text;
	}
So vielleicht?

Code: Alles auswählen

if (strpos($users, "@bestimmtedomain.de"))
	{

/* Der Code der ausgeführt werden soll */
	
}
Bestimmt nicht, oder? ;)

Und wo hin bzw. wo herum das Ding dann?
Benutzeravatar
S2B
Ehemaliges Teammitglied
Beiträge: 3258
Registriert: 10.08.2004 22:48
Wohnort: Aachen
Kontaktdaten:

Beitrag von S2B »

Code: Alles auswählen

if ($users === false)
{
   if (preg_match('#@bestimmtedomain\.de$#', $user->data['user_email']))
   {
      // ...
   }
}
// ...
Wenn dir das jetzt nicht weiterhilft, empfehle ich dir, beispielsweise in der Jobbörse Hilfe zu suchen. Es bringt ja nichts, wenn ich dir jeden Schritt einzeln beschreibe...
Gruß, S2B
Keinen Support per ICQ/PM!
Hier kann man meine PHP-Skripte und meine MODs für phpBB runterladen.
Antworten

Zurück zu „Coding & Technik“