PHP SQL Einträge zählen und ersetzen

hubertus1990

Lt. Commander
Registriert
Sep. 2005
Beiträge
1.384
Hi Leute.

Ich habe folgendes Problem, und bin leider nicht besonders fit in PHP :)

Ich habe in meiner SQL Datenbank eine Tabelle, von der ich die Einträge zählen möchte, und wenn die Anzahl der EInträge größer ist als 100, soll der kleinste Wert der Tabelle durch einen Hereinkommenden Wert ersetzt werden.

Was ist an meinem Code falsch? Wie sollte er richtig lauten?

Hier ist mein Code, der leider nicht funktioniert:

Code:
<?php
	
	if ($_SERVER["HTTP_USER_AGENT"] == "somehttpuseragent")
   	 {

	//Variablen für den Verbindugsaufbau
	$dbhost = 'mydomain.com';
	$dbuser = 'someusername';
	$dbpass = 'mypassword';
	$dbname = 'databasename';
	 
	//Verbindung wird aufgebaut
	$dblink = mysql_connect("$dbhost", "$dbuser", "$dbpass")  or die ('I cannot connect to the database because: ' . mysql_error());
	mysql_select_db("$dbname");
	 
	$name = $_POST['name'];
	$score = $_POST['score'];

	if($score > 0) {
		
		DECLARE @nrofentries INTEGER;
		SELECT @nrofentries = COUNT(score) FROM challenge_stats;
		if(@nrofentries > 100) {  
			DECLARE @min INTEGER;
			SELECT @min = MIN(score) FROM challenge_stats;
			if(@min <= $score) { 

			DELETE FROM challenge_stats WHERE score = @min;
			$insert = mysql_query("INSERT INTO challenge_stats (name, score) VALUES('$name', '$score')");
 			}
		} else {

			$reszkt = mysql_query("INSERT INTO challenge_stats (name, score) VALUES('$name', '$score')");
		}
	}

	//Datenbankverbindung wird geschlossen
	mysql_close($dblink);

	} else {
	echo '(send) authentification for database access failed --> no, or incorrect http user agent :)';
	}


?>


Hier mein Code ohne zählen und ersetzen, dieser funktioniert einwandfrei:

Code:
<?php
	
	if ($_SERVER["HTTP_USER_AGENT"] == "somehttpuseragent")
   	 {

	//Variablen für den Verbindugsaufbau
	$dbhost = 'mydomain.com';
	$dbuser = 'someusername';
	$dbpass = 'mypassword';
	$dbname = 'databasename';
	 
	//Verbindung wird aufgebaut
	$dblink = mysql_connect("$dbhost", "$dbuser", "$dbpass")  or die ('I cannot connect to the database because: ' . mysql_error());
	mysql_select_db("$dbname");
	 
	$name = $_POST['name'];
	$score = $_POST['score'];

	if($score > 0) {

			$reszkt = mysql_query("INSERT INTO challenge_stats (name, score) VALUES('$name', '$score')");

	}

	//Datenbankverbindung wird geschlossen
	mysql_close($dblink);

	} else {
	echo '(send) authentification for database access failed --> no, or incorrect http user agent :)';
	}


?>
 
Deine DECLARE - Geschichten sind nicht als Queries an die Datenbank gerichtet sondern stehen fehlerhaft im PHP-Code rum.

Übrigens solltest du für $name und $score noch n mysql_real_escape_string setzen. Ansonsten zerlegt dir selbst ein mittelprächtiger Angreifer die gesamte Datenbank. Ein Hoch auf Injections.
 
Irgendwie mischst du SQL mit PHP. Das geht dorch gar net :).
Kennst du update?
Code:
update stats set score=$score,name=$name where (select count(score) from challenge_stat)>100 and score=(select min(score) from challenge_stat);
insert into stats(name,score) select $name,$score where (select count(score) from challenge_stat)>100
 
Alles klar danke erstmal :)

Hab das jetzt soweit gebracht: Das INSERT FUNKTIONIERT, das UPDATE nicht :)

Code:
	if($score > 0) {
		
		if(SELECT COUNT(score) FROM challenge_stats > 100) {

			if(SELECT MIN(score) FROM challenge_stats <= $score) {
				$reszkt1 = mysql_query("UPDATE challenge_stats SET score=$score,name=$name WHERE (SELECT COUNT(score) FROM challenge_stats) = (SELECT MIN(score) FROM challenge_stats)");
			}
		} else {
			$reszkt2 = mysql_query("INSERT INTO challenge_stats (name, score) VALUES('$name', '$score')");
		}	
	}


Wie ist es möglich, den rückgabewert von "SELECT COUNT(score) FROM challenge_stats" in eine Variable zu speichern, und diese dann zu vergleichszwecken heranzuziehen?
Ergänzung ()

Hab jetzt nochmal alles überarbeitet, funktioniert nun alles bis auf diese Codezeilen:

Code:
			if((SELECT MIN(score) FROM challenge_stats) <= $score) {
				$reszkt1 = mysql_query("UPDATE challenge_stats SET score=$score,name=$name WHERE score = (SELECT MIN(score) FROM challenge_stats);
			}

Sobald ich diese einsetze compiliert der Code nicht.
Was ich machen möchte ist den Kleinsten Wert von "score" zu suchen, und ihn mit dem hereinkommenden Score vergleichen. Ist der hereinkommende Score (hier $score) größer, so soll der kleinste score in der tabelle mit dem hereinkommenden score ersetzt werden. (und der name aktualisiert werden).
 
Zuletzt bearbeitet:
seufz... :(

Ich blicke einfach nicht durch...
Wie müsste dieser Codeabschnitt aussehen, damit er in nem .php script funktioniert?

Code:
    if((SELECT MIN(score) FROM challenge_stats) <= $score) {
    $reszkt1 = mysql_query("UPDATE challenge_stats SET score=$score,name=$name WHERE score = (SELECT MIN(score) FROM challenge_stats);
    }
 
Du musst dir erst mal den Unterschied zw. PHP und SQL klarmachen und wie du den Zusammenhang herstellen kannst. Das hast du eigentlich auch schon gemacht, aber es noch nicht ganz verstanden: Warum steht bei dir das UPDATE in Anführungszeichen, das SELECT nicht?
 
Hab mich jetzt durchgekämpft, es geht alles bis auf das:

Es ist merkwürdig, sobald ich für $min eine zahl einsetze, funktioniert alles perfekt.

Funktioniert:

Code:
if($min <= $score) {

				$reszkt1 = mysql_query("DELETE FROM challenge_stats WHERE score='6' "); // mit 6 zum beispiel

			}

Funktioniert nicht, wieso?

Code:
if($min <= $score) { // dieser vergleich wird noch völlig richtig ausgeführt

				$reszkt1 = mysql_query("DELETE FROM challenge_stats WHERE score='$min' ");
			}
Ergänzung ()

Hier noch der Code wie ich zu $min komme:

Code:
$sql = mysql_query("SELECT MIN(score) as min FROM challenge_stats", $dblink);
			$query = mysql_query($sql);
			$row = mysql_fetch_assoc($query);
			$min = $row['min'];
			
			if($min <= $score) { ...
 
Hancock schrieb:
Sonst mysql_error kann dir helfen.
In diesem Fall dürfte var_dump($min) auch helfen.
Und warum rufst du mysql_query zwei mal auf? ;)
 
Danke Darlis :)

Eine Schleißigkeit von mir :)
Das Zweimalaufrufen hat ihm nicht gutgetan, jetzt gehts :)
 
habe ich das mit dem real_escape_string so richtig verstanden?

Code:
	$name = mysql_real_escape_string($_POST['name']);
	$message = mysql_real_escape_string($_POST['message']);
	$time= mysql_real_escape_string($_POST['time']);

Anschließend verwende ich die Variablen und setze sie durch INSERT... in die Datenbank ein.
 
Alles klar dankesehr, werde mich da mal reinlesen :)
 
So, app ist raus und seit einigen Tagen im Playstore erhältlich! :)
 
Zurück
Oben