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
Verfasst: 16.08.2008 19:24
von J_BA
S2B hat geschrieben:SQL-Befehl:
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
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.
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...