PHP Webseite Counter Fehlermeldung

AMD4Ever

Ensign
Registriert
Apr. 2008
Beiträge
188
Hallo!
Ich benötige mal euren Rat. Ich habe eine Homepage, da funktioniert dieser Counter einwandfrei, bei einer anderen Homepage beim gleichen Hoster leider nicht. Kann mir mal einer sagen, wie ich den Fehler weg bekomme??
Vielleicht bin ich ein bisschen zu blöd.

Das ist die Fehlermeldung: Warning: mysql_query() expects parameter 1 to be string, array given in /home/www/ncXXXX/html/counter.php on line 115

Folgende Funktion: Ein User betritt die HP: Ist seine IP innerhalb Zeit X schon erfasst, wird der Counter blockiert.
Ist seine IP nicht in der DB enthalten, soll seine IP in der DB counter_id abgelegt werden, ebenso Timestamp und co. Der Der Wochenzähler counter_id und der Hauptcounter werden +1 addiert.

Einmal wöchendlich wird die counter_id beim ersten Besuch komplett geleert und sein Counter_wert wieder in die ID gelegt. Der Wochenzähler wird in die counter_stat abgelegt.


PHP:
<?php
//*** WEBSITE COUNTER ***
// User-Informationen -> IP, Datum, Uhrzeit des Besuchs

$ipguest = getenv("REMOTE_ADDR"); // IP des Besuchers
$timestamp = time(); // UNIX Timestamp
$dateguest = date("d.m.Y",$timestamp); // Datum, wann der Besucher die Seite besucht hat
$time_db = date("H:i:s",$timestamp);
$date = implode('-',array_reverse(explode('.',date("d.m.Y",$timestamp))));  //Datum von Deutsch -> ISO
$ip_block_minutes =240; // 4 Stunden (240 Minuten) ist IP gültig!

$ip_blocktime = $timestamp - ($ip_block_minutes * 60);   // IP-Blockzeit berechnen
$time = date("H:i:s", $ip_blocktime);					 // die zur DB überprüfende Zeit umschreiben


// DB Connection
$db_server 	= "db6.netclusive.de";						//DB-Server
$db_user 	= "XXXXX";									//DB-User
$db_pwd	= "XXXXXX";								//DB Password
$db_name	= "usr_XXXXX_1";							//DB Name

$link = mysql_connect($db_server, $db_user, $db_pwd);	//bei der SQL-DB anmelden
$select_db = mysql_select_db ($db_name, $link);			//Datenbank auswählen


//FALLUNTERSCHEIDUNG IP BLOCKIEREN IP IN DB SPEICHERN
$sql_counter = mysql_query("SELECT COUNT(*) FROM counter_id WHERE IP='$ipguest' AND Time> '$time'"); // Vergleiche ob IP vorhanden ist und die Zeit >= Blockzeit ist
$sql_counter = mysql_fetch_row($sql_counter);
if($sql_counter[0]==0) 
{

	// NEUE ID ERSTELLEN
	$sql_counter = " SELECT MAX(ID) AS ID FROM counter_id"; // höchste ID aus DB holen
	$query = mysql_query($sql_counter, $link);
	$data = mysql_fetch_array($query);
	$ID = $data[ID];
	++ $ID ;

	//ID, IP $ TIMESTAMP IN DB SPEICHERN
	$sql_counter = "INSERT INTO `usr_XXXXX_1`.`counter_id` (`ID`, `IP`, `Time`, `Timestamp`)
	VALUES (
	'$ID',
	'$ipguest',
	'$time_db',
	'$timestamp'
	)";

	// COUNTER IN DB ABLEGEN
		// NEUEN COUNTERWERT ERMITTELN
		$sql2 = " SELECT MAX(Counter) AS Counter FROM counter"; // höchsten Counter zählen
		$query2 = mysql_query($sql2, $link);
		$data2 = mysql_fetch_array($query2);
		$counter = $data2[Counter];
		++ $counter; // Counter um 1 addieren

		// COUNTER AKTUALISIEREN
		$sql2 = "UPDATE `usr_XXXXX_1`.`counter` SET `Counter` = $counter, `Date` = '$date' WHERE `counter`.`ID` = 1 LIMIT 1;";  // Counter aktualisieren
		
};// IF-ABFRAGE ZUENDE



// COUNTERWERT AUSGEBEN
	//ZUGRIFFE INSGESAMT
	$sql3 = " SELECT * FROM counter WHERE ID='1'"; //Zugriffe insgesamt
	$query3 = mysql_query($sql3, $link);
	$data3 = mysql_fetch_array($query3);

	//ZUGRIFFE HEUTE
	$today=mktime(2, 0, 0, date("m")  , date("d"), date("Y")); //formatiere aus heutigen Datum das Timestamp-Datum
	$sql4 = "SELECT COUNT(*) FROM counter_id WHERE Timestamp > $today"; //zähle nach, wie oft das heutige Datum in Hits hinterlegt sind
	$query4 =  mysql_query($sql4);
	list($hits_today) = mysql_fetch_row($query4);
	
	
//COUNTER-STATISTIK ANLEGEN WÖCHENTLICH MONTAG ERSTER BESUCHER

	$today=mktime(2, 0, 0, date("m")  , date("d"), date("Y")); //formatiere aus heutigen Datum das Timestamp-Datum
	//echo $today;

	//FALLUNTERSCHEIDUNG, WENN MONTAG IST
	if (date("D") =='Mon'){
		$sql5 = "SELECT COUNT(*) FROM counter_id WHERE Timestamp < $today"; //zähle nach, wie oft Datum der letzten Woche vorkommt
		$query5 =  mysql_query($sql5);
		list($hits_week) = mysql_fetch_row($query5);
		$hits =$data3[Counter]; // Gesamt-HITS bereitstellen
	
		// COUNTER IN DB ABLEGEN
			// NEUEN COUNTERWERT ERMITTELN
			$sql6 = " SELECT MAX(ID) AS ID FROM counter_stat"; // höchsten Counter zählen
			$query6 = mysql_query($sql6, $link);
			$data6 = mysql_fetch_array($query6);
			$ID = $data6[ID];
			++ $ID; // ID um 1 addieren

		// COUNTER_STATISTIK AKTUALISIEREN
		
		// FALLUNTERSCHEIDUNG LEERE EINTRÄGE VERHINDERN
		if ($hits_week >0){
			
			// IN DB COUNTER_STAT ZEILE REINSCHREIBEN
			$sql7 = "INSERT INTO `usr_XXXXX_1`.`counter_stat` (`ID`, `Date`, `Hits`, `Hits_week`) VALUES ('$ID', '$date', '$hits', '$hits_week')"; // Schreibe ID, Datum, Hits und wöchentliche Hits in DB
			
			//	ALLE WOCHENÄLTERE EINTRÄGE LÖSCHEN
			$sql8 = "DELETE FROM `usr_XXXXX_1`.`counter_id` WHERE Timestamp < $today";
			}; //IF-ABFRAGE ZUENDE
		
		};//FALLUNTERSCHEIDUNG WENN MONTAG IST ZUENDE
		
		//*** WEBSITE-COUNTER ZUENDE ***

	//FEEDBACK DB
	$res = mysql_query($sql_counter); if($res == true){echo "";}else{echo "";}   //Feedback DB counter_id
	$res = mysql_query($sql2); if($res == true){echo "";}else{echo "";}  //Feedback DB counter
	$res = mysql_query($sql7); if($res == true){echo "";}else{echo "";}  //Feedback DB counter_stat
	$res = mysql_query($sql8); if($res == true){echo "";}else{echo "";}  //Feedback DB counter_stat
	?>
 
Zuletzt bearbeitet:
Ich zweifle gewaltig daran, dass das wo anders so läuft. Deine Syntax ist nämlich hier schlicht falsch:

Code:
$sql7 = "INSERT INTO `usr_XXXXX_1`.`counter_stat` (`ID`, `Date`, `Hits`, `Hits_week`) VALUES ('$ID', '$date', '$hits', '$hits_week]')";

$hits_week]

Merkst du was? ;)

Die eckige Klammer hat da nichts verloren
 
Hi!
Vollkommen recht, aber das ist leider nicht der wahre Fehler und auch nicht die Ursache der Fehlermeldung.
Ich habe den Fehler in meiner Programmierung schon korrigiert.

Das Problem ist folgende Zeile:
PHP:
	//FEEDBACK DB
	$res = mysql_query($sql_counter); if($res == true){echo "";}else{echo "";}   //Feedback DB counter_id
 
wieso? deine Fehlermeldung jammert doch bei Zeile 115 nicht bei 113. Und 115 ist ja das sql7-Statement
 
ja, also Zeile 115. $res = mysql_query($sql7); if($res == true){echo "";}else{echo "";}
nicht die mit dem sql-counter.

Aber eine Sache kann ich dir noch sagen.
Beim ersten Aufruf kam KEINE Fehlermeldung bei beiden Seiten.
Bei der kitchen-Seite kam die Meldung erst beim zweiten Aufruf.
Da liegt wohl der Hund begraben, also wenn der Eintrag mit der IP bereits vorhanden ist.
Ergänzung ()

hab den fehler, schreib ihn dir gleich. Muss es noch ausformulieren ^^
 
Zuletzt bearbeitet:
ja, genau. Für 4 Stunden ist dann die IP in der DB gesperrt.
Kann das denn daran liegen, dass beide auf unterschiedlichen Servern bei Netclusive liegen und deren MySQL-DBs vielleicht unterschiedlich ticken, bzw. die PHP-Versionen vielleicht toleranter sind??
 
$sql_counter = mysql_query("SELECT COUNT(*) FROM counter_id WHERE IP='$ipguest' AND Time> '$time'"); // Vergleiche ob IP vorhanden ist und die Zeit >= Blockzeit ist
$sql_counter = mysql_fetch_row($sql_counter);

du überschreibst dein Statement
Wenn die ID neu ist, setzt du zwar für die sql_counter-Variable wieder ein Statement, ist die ID jedoch bereits vorhanden, hast du das SQL-Ergebnis (also die Row) in deiner Variable stehen. Das kann natürlich nicht funktionieren :lol:

Weißt was ich meine?

Das darf schlicht nicht so sein, sondern du brauchst einen anderen Variablennamen hierfür:
$sql_counter = mysql_fetch_row($sql_counter);
 
ja für deine If direkt darunter ;)

Mach einfach statt

$sql_counter = mysql_fetch_row($sql_counter);
if($sql_counter[0]==0)

das hier:

$counter_result = mysql_fetch_row($sql_counter);
if($counter_result[0]==0)

Dann sollte es klappen.

Würde übrigens zu gerne den Counter-Quellcode der anderen Seite sehen, bei der das klappt.
 
poste mal den jetzt aktuellen Sourcecode rein. Es ist ja eindeutig nur so, wenn eine IP schon vorhanden ist.

Und vll auch noch den der anderen Seite wos die Probleme nicht gibt


Es ist übrigens ein ganz schlechter Stil, wenn man den selben Variablennamen für vollkommen unterschiedliche Statements benutzt. Einmal ist es eine Select-Abfrage, dann wieder ein Insert-Befehl. Da sind solche Probleme ja direkt vorprogrammiert und die Fehlersuche wird abartig umständlich
 
Zuletzt bearbeitet:
PHP:
<?php
//*** WEBSITE COUNTER ***
// User-Informationen -> IP, Datum, Uhrzeit des Besuchs

$ipguest = getenv("REMOTE_ADDR"); // IP des Besuchers
$guestinfo = $_SERVER['HTTP_USER_AGENT'];
$timestamp = time(); // UNIX Timestamp
$dateguest = date("d.m.Y",$timestamp); // Datum, wann der Besucher die Seite besucht hat
$time_db = date("H:i:s",$timestamp);
$date = implode('-',array_reverse(explode('.',date("d.m.Y",$timestamp))));  //Datum von Deutsch -> ISO
$ip_block_minutes =240; // 4 Stunden (240 Minuten) ist IP gültig!

$ip_blocktime = $timestamp - ($ip_block_minutes * 60);   // IP-Blockzeit berechnen
$time = date("H:i:s", $ip_blocktime);					 // die zur DB überprüfende Zeit umschreiben


// DB Connection
$db_server 	= "db5.netclusive.de";						//DB-Server
$db_user 	= "XXXXXX";									//DB-User
$db_pwd		= "XXXXXX";								//DB Password
$db_name	= "usr_XXXXXX_1";							//DB Name

$link = mysql_connect($db_server, $db_user, $db_pwd);	//bei der SQL-DB anmelden
$select_db = mysql_select_db ($db_name, $link);			//Datenbank auswählen


//FALLUNTERSCHEIDUNG IP BLOCKIEREN IP IN DB SPEICHERN
$sql = mysql_query("SELECT COUNT(*) FROM counter_id WHERE IP='$ipguest' AND Time> '$time'"); // Vergleiche ob IP vorhanden ist und die Zeit >= Blockzeit ist
$sql = mysql_fetch_row($sql);
if($sql[0]==0) 
{

	// NEUE ID ERSTELLEN
	$sql = " SELECT MAX(ID) AS ID FROM counter_id"; // höchste ID aus DB holen
	$query = mysql_query($sql, $link);
	$data = mysql_fetch_array($query);
	$ID = $data[ID];
	++ $ID ;

	//ID, IP $ TIMESTAMP IN DB SPEICHERN
	$sql = "INSERT INTO `usr_XXXXXX_1`.`counter_id` (`ID`, `IP`, `Time`, `Timestamp`)
	VALUES (
	'$ID',
	'$ipguest',
	'$time_db',
	'$timestamp'
	)";

	// COUNTER IN DB ABLEGEN
		// NEUEN COUNTERWERT ERMITTELN
		$sql2 = " SELECT MAX(Counter) AS Counter FROM counter"; // höchsten Counter zählen
		$query2 = mysql_query($sql2, $link);
		$data2 = mysql_fetch_array($query2);
		$counter = $data2[Counter];
		++ $counter; // Counter um 1 addieren

		// COUNTER AKTUALISIEREN
		$sql2 = "UPDATE `usr_XXXXXX_1`.`counter` SET `Counter` = $counter, `Date` = '$date' WHERE `counter`.`ID` = 1 LIMIT 1;";  // Counter aktualisieren
		
};// IF-ABFRAGE ZUENDE



// COUNTERWERT AUSGEBEN
	//ZUGRIFFE INSGESAMT
	$sql3 = " SELECT * FROM counter WHERE ID='1'"; //Zugriffe insgesamt
	$query3 = mysql_query($sql3, $link);
	$data3 = mysql_fetch_array($query3);

	//ZUGRIFFE HEUTE
	$today=mktime(2, 0, 0, date("m")  , date("d"), date("Y")); //formatiere aus heutigen Datum das Timestamp-Datum
	$sql4 = "SELECT COUNT(*) FROM counter_id WHERE Timestamp > $today"; //zähle nach, wie oft das heutige Datum in Hits hinterlegt sind
	$query4 =  mysql_query($sql4);
	list($hits_today) = mysql_fetch_row($query4);
	
	
//COUNTER-STATISTIK ANLEGEN WÖCHENTLICH MONTAG ERSTER BESUCHER

	$today=mktime(2, 0, 0, date("m")  , date("d"), date("Y")); //formatiere aus heutigen Datum das Timestamp-Datum
	//echo $today;

	//FALLUNTERSCHEIDUNG, WENN MONTAG IST
	if (date("D") =='Mon'){
		$sql5 = "SELECT COUNT(*) FROM counter_id WHERE Timestamp < $today"; //zähle nach, wie oft Datum der letzten Woche vorkommt
		$query5 =  mysql_query($sql5);
		list($hits_week) = mysql_fetch_row($query5);
		$hits =$data3[Counter]; // Gesamt-HITS bereitstellen
	
		// COUNTER IN DB ABLEGEN
			// NEUEN COUNTERWERT ERMITTELN
			$sql6 = " SELECT MAX(ID) AS ID FROM counter_stat"; // höchsten Counter zählen
			$query6 = mysql_query($sql6, $link);
			$data6 = mysql_fetch_array($query6);
			$ID = $data6[ID];
			++ $ID; // ID um 1 addieren

		// COUNTER_STATISTIK AKTUALISIEREN
		
		// FALLUNTERSCHEIDUNG LEERE EINTRÄGE VERHINDERN
		if ($hits_week >0){
			
			// IN DB COUNTER_STAT ZEILE REINSCHREIBEN
			$sql7 = "INSERT INTO `usr_XXXXXX_1`.`counter_stat` (`ID`, `Date`, `Hits`, `Hits_week`) VALUES ('$ID', '$date', '$hits', '$hits_week]')"; // Schreibe ID, Datum, Hits und wöchentliche Hits in DB
			
			//	ALLE WOCHENÄLTERE EINTRÄGE LÖSCHEN
			$sql8 = "DELETE FROM `usr_XXXXXX_1`.`counter_id` WHERE Timestamp < $today";
			}; //IF-ABFRAGE ZUENDE
		
		};//FALLUNTERSCHEIDUNG WENN MONTAG IST ZUENDE
		
		//*** WEBSITE-COUNTER ZUENDE ***

	//FEEDBACK DB
	$res = mysql_query($sql); if($res == true){echo "";}else{echo "";}   //Feedback DB counter_id
	$res = mysql_query($sql2); if($res == true){echo "";}else{echo "";}  //Feedback DB counter
	$res = mysql_query($sql7); if($res == true){echo "";}else{echo "";}  //Feedback DB counter_stat
	$res = mysql_query($sql8); if($res == true){echo "";}else{echo "";}  //Feedback DB counter_stat
	?>

Das ist die counter.php von amdAREA51.de
 
Zuletzt bearbeitet:
du hast exakt den selben Code wieder. Du hast einfach alle sql_counter in sql umbenannt.
Hab dir doch oben erklärt warum das falsch ist. :rolleyes:

$sql = mysql_query("SELECT COUNT(*) FROM counter_id WHERE IP='$ipguest' AND Time> '$time'"); // Vergleiche ob IP vorhanden ist und die Zeit >= Blockzeit ist
$sql = mysql_fetch_row($sql);
if($sql[0]==0)

du überschreibst dein Statement schon wieder mit dem Ergebnis der Abfrage.
Hab dir doch sogar den Code geschrieben den du austauschen sollst und sogar wie du ihn austauschen sollst
 
OK, Sorry :D
Das ist lustig. Gehe jetzt mal nicht den ganzen Code durch.

Wie sieht dann der aktuelle von kitchen aus?
 
So, der Code von Deluxe-Kitchen in geänderter Form:

PHP:
//FALLUNTERSCHEIDUNG IP BLOCKIEREN IP IN DB SPEICHERN
$sql_counter = mysql_query("SELECT COUNT(*) FROM counter_id WHERE IP='$ipguest' AND Time> '$time'"); // Vergleiche ob IP vorhanden ist und die Zeit >= Blockzeit ist
$counter_result = mysql_fetch_row($sql_counter);
if($counter_result[0]==0) 
{

	// NEUE ID ERSTELLEN
	$sql_counter = " SELECT MAX(ID) AS ID FROM counter_id"; // höchste ID aus DB holen
	$query = mysql_query($sql_counter, $link);
	$data = mysql_fetch_array($query);
	$ID = $data[ID];
	++ $ID ;

	//ID, IP $ TIMESTAMP IN DB SPEICHERN
	$sql_counter = "INSERT INTO `usr_XXXX_1`.`counter_id` (`ID`, `IP`, `Time`, `Timestamp`, `Info`)
	VALUES (
	'$ID',
	'$ipguest',
	'$time_db',
	'$timestamp',
	'$guestinfo'
	)";

	// COUNTER IN DB ABLEGEN
		// NEUEN COUNTERWERT ERMITTELN
		$sql2 = " SELECT MAX(Counter) AS Counter FROM counter"; // höchsten Counter zählen
		$query2 = mysql_query($sql2, $link);
		$data2 = mysql_fetch_array($query2);
		$counter = $data2[Counter];
		++ $counter; // Counter um 1 addieren

		// COUNTER AKTUALISIEREN
		$sql2 = "UPDATE `usr_XXXX_1`.`counter` SET `Counter` = $counter, `Date` = '$date' WHERE `counter`.`ID` = 1 LIMIT 1;";  // Counter aktualisieren
		
};// IF-ABFRAGE ZUENDE

Das ist die Fallunterscheidung...
und das das Feedback DB

PHP:
//FEEDBACK DB
$res = mysql_query($sql_counter); if($res == true){echo "";}else{echo "";}   //Feedback DB counter_id

von der fehlerhaften Deluxe-Kitchen.de
 
Ok, aber der Fehler ist jetzt ein ANDERER.
Vorher wars array given, jetzt ists resource given

jetzt hab ich den Fehler auch gecheckt :rolleyes:

Ersetze

$sql_counter = mysql_query("SELECT COUNT(*) FROM counter_id WHERE IP='$ipguest' AND Time> '$time'"); // Vergleiche ob IP vorhanden ist und die Zeit >= Blockzeit ist
$counter_result = mysql_fetch_row($sql_counter);
if($counter_result[0]==0)

durch

$sql_counter = "SELECT COUNT(*) FROM counter_id WHERE IP='$ipguest' AND Time> '$time'";
$sql_counter_query = mysql_query($sql_counter); // Vergleiche ob IP vorhanden ist und die Zeit >= Blockzeit ist
$counter_result = mysql_fetch_row($sql_counter_query);
if($counter_result[0]==0)

hoff ich hab mich nicht vertan :)
 
Zurück
Oben