Seite 1 von 2

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

Verfasst: 16.08.2008 02:03
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!

Verfasst: 16.08.2008 12:49
von S2B
SQL-Befehl:

Code: Alles auswählen

AND user_email LIKE '%@bestimmtedomain.de'

Verfasst: 16.08.2008 19:24
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' ";

Verfasst: 17.08.2008 11:45
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

Verfasst: 17.08.2008 14:48
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.

Verfasst: 17.08.2008 15:39
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.

Verfasst: 17.08.2008 16:34
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 ";
	}

Verfasst: 17.08.2008 22:41
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.

Verfasst: 17.08.2008 23:45
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?

Verfasst: 18.08.2008 00:02
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...