Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

Hallo zusammen,

ich habe in einem meiner Serverscripte ein Problem. Sinn des Scriptes ist es,

Accounts mit derselben "letzten IP" einem "mainlogin" zuzuweisen, sodass

man alle Accounts eines Benutzers zuordnen kann. Soweit so, eigentlich, einfach.

Dazu nutze ich folgendes Script:

$query = "SELECT login, lastIP, mainlogin FROM accounts WHERE (mainlogin='' OR mainlogin=login) AND lastIP!='' ORDER BY lastIP DESC, login DESC";

$result = mysql_query($query) or die(mysql_error());
$llastIP = "";
$lastlogin = "";
$numedits=0;
while ($data = mysql_fetch_array($result, MYSQL_ASSOC)) {
$curip = $data['lastIP'];
$curlogin = $data['login'];
$curmainlogin = $data['mainlogin'];

$query2 = "SELECT login FROM accounts WHERE lastIP='$curip' ORDER BY login DESC";

$result2 = mysql_query($query2) or die(mysql_error());
$numaccswithip = mysql_num_rows($result2);

if ($numaccswithip==1) {
if ($curmainlogin=="") {
echo $curlogin." ".$curmainlogin." ".$curip."<br>";
}
$query1 = "UPDATE accounts SET mainlogin='".$curlogin."' WHERE login='".$curlogin."'";
$result1 = mysql_query($query1) or die(mysql_error());
}
else {
$data1 = mysql_fetch_array($result2, MYSQL_ASSOC);
$newmainlogin = $data1['login'];
$query1 = "UPDATE accounts SET mainlogin='".$newmainlogin."' WHERE lastIP='".$curip."'";
$result1 = mysql_query($query1) or die(mysql_error());
}
$llastIP = $curip;
$lastlogin = $curlogin;
$numedits=$numedits+1;
}

echo"Zusammengehoerige Accounts wurden markiert... $numedits<br>";[/PHP]

Dieses Script hat auch immer prima funktioniert, doch seit einiger Zeit,

werden NEU angemeldete Accounts von dem Script nichtmehr behandelt!

Gibt es irgendwie ein maximum an Datensätzen der über PHP oder eine SQL-

Anforderung bearbeitet werden kann? Ich kann mit schlucht und ergreifend

nicht erklären warum knapp über 800 Accounts damit korrekt bearbeitet

werden, aber alle neu dazukommenden Accounts einfach unbeachtet bleiben...

Stehen die neuen Accounts bereits in der Datenbank?

Wie sieht ein Datensatz aus, der funktioniert?

Wie sieht ein Datensatz aus, der nicht funktioniert?

Gibt es Fehlermeldungen?

Wurde die PHP Version gewechselt?

Wird eine andere Server Applikation verwendet?

Bitte einfach mal genauere Informationen schreiben

EDIT:

Übrigens brauchst du in der Zeile

while ($data = mysql_fetch_array($result, MYSQL_ASSOC)) {

das MYSQL_ASSOC nicht zu schreiben. mysql_fetch_array kann einen Zugriff via Indizes und Assiziationen verarbeiten, da MYSQL_BOTH als default definiert ist.

MYSQL_BOTH: Funktionsergebnis ist ein Array, das die Elemente des Ergebnisdatensatzes sowohl assoziativ als auch numerisch indiziert enthält. Dies ist der Default-Wert.

Bearbeitet von Shadowman

Es gibt keine Fehlermelung, keinen Fehler oder sonstwas. Das Script läuft

durch wie imemr schon, und die Accountzuordnung wird auch aktualisiert,

aber nur bis zu einer bestimmten Menge an Datensätzen.

Obwohl das Script korrekt ist, werden neuere Datensätze einfach nicht behandelt...

Insgesammt umfasst die Datenbank an die 3000 Accounts, wovon aber ca

1000 keine "lastIP" haben und damit von der Abfrage ausgeschlossen sind.

Auf mich macht es den Eindruck dass die Verarbeitung der Datensätze einfach an einem besstimmten Punkt aufhört, als gäbe es einen Maximalwert, sagen wir mal "höchstens 1500 Datensätze pro Abfrage dürfen aktualisiert werden", was aber natürlich Blödsinn wäre.

Und nochmal anders formuliert, damit es auch auf jeden Fall verstanden werden kann ;) ...

Als ich sagen wir mal noch 1500 Accounts hatte, hat das Script allen Datensätzen ihren mainlogin zugewiesen, ganz zuverlässing und ohne Ausnahme.

Irgendwann hat das Script neuere Accounts aber einfach "ignoriert".

Lösche ich jetzt z.b. aus einem "alten" Account das mainlogin raus, und

habe gleichzeitig auchnoch einen "neuen" Account, der auch noch keinen

hat und lasse das Script dann laufen, dann bekomtm der alte Account

wieder ein mainlogin zugeordnet, der neue aber nicht!

Sehr komische Sache, wie gesagt, hat irgendwie was von einem erreichten

Limit, aber das kann ich fast net glauben...

Okay, ich konnte das Problem lösen.

Wie gesagt, es GIBT keine Fehlermeldung, und die Abfragen sind auch 100% korrekt.

Das Problem lag in der Tabellendefinition. mainlogin hatte die Erlaubnis "null" zu sein.

Nachdem ich "null" verboten habe läuft es nun bei ALLEN Accounts...

Merkwürdig trotzdem warum es bei so vielen Accounts auch mit null

geklappt hat, aber dann plötzlich nichtmehr...

Kann es sein, dass Deine PHP Variable leer ist also "" und das ist != null !?

Weil soweit ich das weiß wird bei ".. where xyz='$myvar' " wenn $myvar == null ist logischerweise: "where xyz = '' " ausgeführt und nicht "where xyz = NULL"

Phil

Fast, es ist genau anders herum ^^

An dieser Stelle:

WHERE (mainlogin='' OR mainlogin=login)

überprüft die SQL-Abfrage ob mainlogin leer ist. Bei neuen Accounts war mainlogin aber null und nicht leer. Das ist nun fixed ^^

Danke jedenfalls für die schnellen Reaktionen.

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.