2 Probleme Datenbereich neuladen/ DB eintrag überschreiben

Godstyle

Erfahrenes Mitglied
Hallo Leute,

gestern hatte ich auch 2 Probleme die ich dann doch sellbst lösen konnte, doch heute bin ich sicher ohne euch nicht weiter zu kommen.

Das erste Problem, ich habe ein Script, wo der User seine Daten aktualisieren kann, dort möchte ich das er eine PLZ eingibt und sich dann der Ort in einem Dropdown automatisch einträgt da ja mehrere plz für einen Ort oder anders herum stehen können.

Bis her hatte ich das wie folgt gelöst und es lief:

das input feld:

PHP:
<input type="text" maxlength="5" name="plz" style="width:50px;" <?php if(isset($plz) && !empty($plz)) { echo "value=".$plz; } ?> onblur="this.form.submit()">
<?php include('includes/home/ort.inc.php'); ?>


# ort.inc.php

<?php
if(isset($_POST['plz'])) { 

?>
	<select name="ort" style="width:140px;">
<?php
$ergebnis = mysql_query("SELECT ort FROM plz_blnd_ort WHERE plz LIKE '".$_POST['plz']."'");
while ($datensatz = mysql_fetch_array($ergebnis))
{
echo "<option value=\"" . $datensatz['ort'] . "\">";
echo $datensatz['ort'];
echo "</option>\n";
}
?>
</select>
	
<?php } 
else { ?>
	<select name="ort" style="width:140px;">
<option>&nbsp;</option>
</select>
<?php } ?>

das Problem ist das neu geladen wird ich habe immer alle daten zwischen gespeichert und als value neu eingetragen, das ist jedoch in diesem Fall nicht mehr Möglich und wie ich finde in der heutigen Zeit auch gar nicht mehr notwendig.

Das Problem was diesmal entsteht, das ich in einem DIV arbeite der zuvor eingeblendet wird um diese Daten eintragen zu können und dieser schliest sich durch das neuladen, ich denke das ihr wisst was ich hier meine, ich bräuchte eine Lösung, die es mir ermöglicht dieses Dropdown in abhängigkeit der PLZ neu zu laden.


Problem 2:

Ich habe ene Datenbank wo User gespeichert werden die eine Seite besucht haben, bisher lief es so, das ich geprüft habe ob der User bereits vorher zu besuch war und wenn ja wurde das datum aktualisiert und wenn nicht wurde er neu angelegt.

Nun kam ich zu dem entschluss, das ich nicht mehr alle User speichern möchte sondern nur zB die letzten 20. Ausgeben kann ich die letzten mit LIMIT, doch wie schaffe ich es das:

1. Nur 20 einträge je seite bestehen bleiben und er immer den 21. löscht ( der dann der älteste sein muss).

2. Er auch prüft ob der Besucher nicht bereits in den letzten 20 ist und dann nur aktualisiert.

3. Ich glaube Problem 2 ist recht einfach zu lösen und ich finde nur den richtigen ansatz nicht.

Sortiert wird das ganze im Übrigen nach timestamp.

mfg
 
Problem 1: AJAX ist der Name der Methode was du suchst. In Verbindung mit JQuery sehr einfach zu handeln. Google liefert zum Thema PHP+Ajax viele brauchbare Beiträge

Problem 2: Du kannst auch mit rownum arbeiten MySQL Rownum (Zeilennummer).
Willst du bei 2.1 ab dem 21ten löschen oder nur nicht mitverarbeiten?
 
Ich suche mal mehr nach jqaury,

zu 2.1. ich habe mir das so vorgestellt, gehen wir mal von einem User profil aus, dort will ich die letzten 20 Besucher anzeigen lassen. das ich selbst nicht auftauche ist ja einfach.

Nun sagen wir mal es sind 18 Leute auf dem Profil gewesen und user xy besucht das Profil erneut, nun soll kein neuer eintrag angelegt werden sondern nur der timestamp aktualisiert.

Soweit krieg ich das wohl auch noch hin.

Wenn wir nun exakt 20 Besucher hatten und der 21. besucht die Seite, dann soll dieser eingetragen werden und derjenige, der nun der älteste Besucher wäre soll gelöscht werden ( hat den niedrigsten timestamp)

Auf die art wollte ich dafür sorgen das die db nicht zugemüllt wird.

An die zeilen nummer hatte ich bereits gedacht, doch da ich zwischenzeitlich den timestamp update ist nicht gewährleistet das es der eintrag mit der geringsten zeilen nummer ist der gelöscht werden muss.


EDIT//

ich habe mich ein wenig versucht in AJAX einzulesen bzgl dem 2ten Problem, jedoch tut sich gar nichts wenn ich die PLZ ändere.

Hier mal die dateien:

Formulerausschnitt:

PHP:
<input type="text" maxlength="5" name="plz" style="width:50px;" <?php if(isset($plz) && !empty($plz)) { echo "value=".$plz; } ?> onChange="macheRequest('ort.php')">
<select name="ort" width="140" id="inhalt">
<?php include('ort.php'); ?>
</select>

die abfrage für den Ort:

PHP:
<?php
if(isset($_GET['plz'])) { 

$ergebnis = mysql_query("SELECT ort FROM plz_blnd_ort WHERE plz LIKE '".$_GET['plz']."'");
while ($datensatz = mysql_fetch_array($ergebnis))
{
echo "<option value=\"" . $datensatz['ort'] . "\">";
echo $datensatz['ort'];
echo "</option>\n";
}
}
else { ?>
<option>-----------</option>
<?php } ?>

und das zu verarbeitende script:

Javascript:
  var http_request = false;
 
    function macheRequest(url) {
 
        http_request = false;
 
        if (window.XMLHttpRequest) { // Mozilla, Safari,...
            http_request = new XMLHttpRequest();
        } else if (window.ActiveXObject) { // IE
            try {
                http_request = new ActiveXObject("Msxml2.XMLHTTP");
            } catch (e) {
                try {
                    http_request = new ActiveXObject("Microsoft.XMLHTTP");
                } catch (e) {}
            }
        }
 
        if (!http_request) {
            alert('Ende :( Kann keine XMLHTTP-Instanz erzeugen');
            return false;
        }
        http_request.open('GET', url, true);
        http_request.onreadystatechange = alertInhalt;
        http_request.send(null);
 
    }
 
    function alertInhalt() {
        if (http_request.readyState == 4) {
              var answer = http_request.responseText;
              if(document.getElementById("inhalt").innerHTML != answer){
                document.getElementById("inhalt").innerHTML = answer;
              }
              else{
                document.getElementById("inhalt").innerHTML = "";
              }
        }
 
    }
 
Zuletzt bearbeitet von einem Moderator:
SQL:
DELETE FROM
    tabelle
WHERE
    besuchtesProfilID = 123
  AND
    MIN(timestamp_spalte)

Schlagt mich wenns nicht hinhaut.
 
Frage.
Ich müsste Testen um herauszufinden wie MySQL den Fehlerhaften (Nicht Standart-SQL)-Where-Block interpretiert:
SQL:
-- Was bewirkt das? Das gibt kein True oder False zurück
  AND MIN(timestamp_spalte)
 
Zuletzt bearbeitet von einem Moderator:
Hi Lime,

diesen ansatz hatte ich auch in die Richtung, nur würde er dort immer einen eintrag löschen, ich muss es also zumindest trennen und prüfen ob mehr als 20 einträge vorhanden sind.

edit 1

hab oben ein ajax zugefügt.

edit 2

Ich denke ich mache es am sinnvollsten wie folgt. Erst prüfen ob der besucher schon vorhanden ist, wenn ja update, wenn nein eintragen. Ich kann beim prüfen ja bereits die anzahl der einträge mitgeben lassen und wenn ich auf 20 komme und dann den insert ausführe noch eine delate dahinter setzen. währen dann 3 zugriffe...
 
Zuletzt bearbeitet:
Das kommt noch dazu, Godstyle. Kannst du natürlich mit PHP oder eben über Mysql löse, das war auch nicht Teil der Frage, oder? ^^

@ Yaslaw: wieso sollte ich ein True oder False zurückbekommen wollen?
Ich will die Zeile löschen, in der die ID für das besuchte Profil (bzw. die ID des Users) gesetzt ist, gleichzeitig aber der kleinste Timestamp vorhanden ist, unter all den Zeilen mit dieser ID.

Vielleicht muss man das auch mit group by lösen, weiß ich nicht. Mysql ist einfach so eine komplexe Sache mit viel zu viel Funktionen. :D

Edit:
Mal abgesehen davon, dass eine Tabelle mit folgenden Zeilen kaum Speicher belegt...
EintragsID -- ProfilID -- BesucherID -- Timestamp

Jeder Benutzer kann ja maximal einen Eintrag haben, pro Profil. Bei 2000 Benutzern, wenn jedes Profil von 500 verschiedenen Benutzern aufgerufen wurde sind das gerade mal 1.000.000 Einträge mit je 18Byte. Viel ist das nicht wirklich. ^^
 
Zuletzt bearbeitet:
@Lime
Im WHERE befinden sich Bedinungen. Da braucht man keine Werte sondenr ganez einfach Ja oder Nein. Auwählen zum löschen oder ignorieren
 
Dann häng ich aufm Schlauch, weil nur die ID selektieren geht dann ja auch schlecht?
Mein nächster Ansatz wäre folgender:
SQL:
DELETE FROM
    tabelle
WHERE
    id = (SELECT id, min(timestamp_spalte) FROM tabelle WHERE profilID = 123 GROUP by profilID)
 
Ajax: Wo hast du das Javascript, dass den Ajax-Request gegen den Server asulöst?

Zum SQL:
Sorry Lime, ich seh bei deinem SQL keinen Zusammenhang zur Fragestellung mit den 20 letzten Benutzer. Wenn es nur darum ginge den neusten oder Ältesten Datensatz zu lsöchen, dann über das: MySQL Aktuelle Einträge pro Gruppe auslesen.

@Godstyle:
Vergiss dasmit dem ältesten löschen. Dass kann bei mehreren gleichzeitig aktiven Usern zu Problemen führen.
Wenn du die Tabelle klein haben willst, dann solltest du das einmal täglich machen mittels eines Cronjobs
SQL:
-- Beispiel aus meiner testdatenbank - muss umgeschrieben werden
-- löscht pro Liga alle die in der Rangliste unter Rang 20 sind
DELETE
FROM
	fifa_mannschaften
WHERE
	fifa_mannschaften.id IN (
		SELECT 
			id
		FROM
			(
				SELECT
					id,
					@grp_rang_nr := IF(@last_grp = liga, @grp_rang_nr + 1, 0) AS grp_rang_nr,
					@last_grp := liga,
					name,
					punkte			
				FROM 
					(SELECT @grp_rang_nr:=0, @last_grp:=FALSE) AS vars,
					fifa_mannschaften
				ORDER BY
					liga,
					punkte DESC,
					name
			) AS d
		WHERE
			grp_rang_nr >20 	
	);
 
Zuletzt bearbeitet von einem Moderator:
Zurück