Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : [PHP] Fehler im Code.



raian
27.03.2005, 22:40
Ich hab jetzt mal nen Code, in dem der Wurm steckt!
Wo isn hier bitteschön ein Fehler drinne?^^



<?php
session_start();
include ('dbconnect.php');
?>
<html>
<head>
<style type="text/css">
body{font-family:Verdana, Arial, Helvetica, sans-serif; font-size:14px;}
</style>
</head>
<body>
<?php
$abfrage = "SELECT * FROM user";
$sql = mysql_query($abfrage) OR die(mysql_error());
while($row = mysql_fetch_array($sql))
{
$user = $row['user'];
if($_SESSION['nick'] == $user)
{
$get_updatetime = "SELECT * FROM user WHERE name = '".$row['name']."'";
$query_updatetime = mysql_query($get_updatetime) OR die(mysql_error());
$row_updatetime = mysql_fetch_array($query_updatetime);
$yet = time();
$hour = 3600;
if($row_updatetime['money_update'] <= $yet - $hour)
{
$geld_zuwachs = $row_updatetime['level_money'] * 100;
$money = "UPDATE user SET money = money + '".$geld_zuwachs."' WHERE name = '".$row_updatetime['name']."'";
$eintrag = mysql_query($money);
}
}
else
{
echo'Der User <b>'.$row['name'].'</b> war nicht online und bekam somit kein Geld<br>';
}
}
?>
</body>
</html>


Und 3600 enstspricht doch 36Minuten, oder?

Danke im Voraus.

Chocwise
27.03.2005, 23:45
Du musst dir angewöhnen mehr Informationen mitzuliefern.
Was sind denn die Symptome woran du merkst das das Script fehlerhaft ist? Fehlermeldungen? Unerwartete Outputs?

Tomarus
27.03.2005, 23:46
1. Sind die Leerzeichen bei der $query_updat etime auch im richtigen Code da?
2. Ich denke nicht, dass dieses MySQL-Update funktionieren wird. Erst den aktuellen Geldstand abfragen, diesen dann um die Zuwachs-Summe erhöhen und dann den neuen Wert eintragen, so sollte das gehen.

dead_orc
28.03.2005, 08:40
@Tomarus: Der Query ist so schon richtig. Zumindest wird der Befehl von meinem Server korrekt interpretiert.

@raian: Nein, 3600 Sekunden sind nicht 36 Minuten sondern 60 Minuten und somit eine Stunde. Poste einige weitere Informationen, damit wir dir helfen können (denn keiner hat Lust den Code zu kopieren, eine Datei und die Umgebung zu erstellen und sie auszuführen um den Fehler zu finden)

Latency
28.03.2005, 10:18
@raian: Nein, 3600 Sekunden sind nicht 36 Minuten sondern 60 Minuten und somit eine Stunde. Poste einige weitere Informationen, damit wir dir helfen können (denn keiner hat Lust den Code zu kopieren, eine Datei und die Umgebung zu erstellen und sie auszuführen um den Fehler zu finden)

Recht hast du eigentlich, trozdem ist dort ein Fehler, der so arg böse und unschön ist, dass ich nicht widerstehen konnte :D

(Ich schreibe nicht den gesamten code auf sondern erst aber deiner ersten Query)

// .
// .
// .
$abfrage = "SELECT * FROM user WHERE `user` = '" . $_SESSION['user'] . "'");
$sql = mysql_query($abfrage) OR die(mysql_error());
if(mysql_num_rows($sql) == 1)
{
$row = mysql_fetch_array($sql);
$get_updatetime = "SELECT * FROM user WHERE name = '".$row['name']."'";
$query_updatetime = mysql_query($get_updatetime) OR die(mysql_error());
$row_updatetime = mysql_fetch_array($query_updat etime);
// .
// .
// .
}
else
{
echo'Der User <b>'.$row['name'].'</b> war nicht online und bekam somit kein Geld<br>';
}
// .
// .
// . Vorteil is es, dass du nicht so viele Daten zwischen Datenbank und Webserver transportieren musst zudem ist das Sicherheitsrisiko nicht so groß, da du nur die Userdaten von einem User aus der Datenbank ausliest. Von der Performance ganz zu schweigen ;)

raian
28.03.2005, 10:35
Das heißt der Code soll so ausehen:


<?php
session_start();
include ('dbconnect.php');
?>
<html>
<head>
<style type="text/css">
body{font-family:Verdana, Arial, Helvetica, sans-serif; font-size:14px;}
</style>
</head>
<body>
<?php
$abfrage = "SELECT * FROM user";
$abfrage = "SELECT * FROM user WHERE `user` = '" . $_SESSION['user'] . "'");
$sql = mysql_query($abfrage) OR die(mysql_error());
if(mysql_num_rows($sql) == 1)
{
$row = mysql_fetch_array($sql);
$get_updatetime = "SELECT * FROM user WHERE name = '".$row['name']."'";
$query_updatetime = mysql_query($get_updatetime) OR die(mysql_error());
$row_updatetime = mysql_fetch_array($query_updat etime);
}
else
{
echo'Der User <b>'.$row['name'].'</b> war nicht online und bekam somit kein Geld<br>';
}

?

Und was war eigentlich der Fehler? Will ja auch was lernen!^^

edit: Ich ahbe jetzt nochmal drei Fehler rausgepickt. Aber jetzt gibt er immer das hier aus, allerdings nicht als Fehlermeldung:

Unknown column 'user' in 'where clause'

Latency
28.03.2005, 10:54
Ganz einach, du lässt alle User ausgeben die in der Tabelle enthalten sind, durchsucht dann deine Query in einer Schleife und jedes mal wenn die Usernamen übereinstimmen wird dein Code durchgeführt.

Ich hingehen lass mir von Anfang an nur die User ausgeben, bei denen die Usernamen übereinstimmen, danach überprüfe ich wieviele User mir von der Datenbank zurückgegeben werden, und nur wenn ein User zurückgegeben wird wird der Code durchgeführt.

Vorteil davon ist zum einen, weniger Datenlast zwischen den Servern.
Zum anderen, angenommen der gesuchte User steht ganz am Ende der Tabelle. Dann muss dein Script n mal durchlaufen werden wobei n die Anzahl der User darstellt.

Nun stell dir mal vor dein Script hat 1000 User in der Datenbank, dann hast du 999 unnötige Schleifendurchgänge, das ist ne Menge Performance verlust. Zudem läufst du gefahr 999 mal User informationen rauszugeben, da du alle Felder aus der Tabelle ausliest.

Und nun zum Code:
$abfrage = "SELECT * FROM user"; // diese Zeile ist unwichtig, zum anderen die
// . die ich in der Verzweigung hatte, da war ich bloß zu faul deinen ganzen Code zu kopieren dh. dir fehlt deine Programmlogikdie solltest du noch einfügen, ansonsten stimmts :)

edit:


<?php
session_start();
include ('dbconnect.php');
?>
<html>
<head>
<style type="text/css">
body{font-family:Verdana, Arial, Helvetica, sans-serif; font-size:14px;}
</style>
</head>
<body>
<?php
$abfrage = "SELECT * FROM user WHERE `user` = '" . $_SESSION['nick'] . "'");
$sql = mysql_query($abfrage) OR die(mysql_error());
if(mysql_num_rows($sql) == 1)
{
$row = mysql_fetch_array($sql);
$get_updatetime = "SELECT * FROM user WHERE name = '".$row['name']."'";
$query_updatetime = mysql_query($get_updatetime) OR die(mysql_error());
$row_updatetime = mysql_fetch_array($query_updatetime);
$yet = time();
$hour = 3600;
if($row_updatetime['money_update'] <= $yet - $hour)
{
$geld_zuwachs = $row_updatetime['level_money'] * 100;
$money = "UPDATE user SET money = money + '".$geld_zuwachs."' WHERE name = '".$row_updatetime['name']."'";
$eintrag = mysql_query($money);
}
}
else
{
echo'Der User <b>'.$row['name'].'</b> war nicht online und bekam somit kein Geld<br>';
}
?>
</body>
</html>

raian
28.03.2005, 10:57
Gut, er klappt jetzt auch so lala, aber irgendwie steht da einmal (obwohl ich schon drei user hab^^) Der User war nicht online. Kein Name nichts, vorher standen da aber auch 3 namen, sirseven, dark und raian!

edit:thx! Das dürfte funzen!
edit2:zeigt immernoch nur
Der User war nicht online und bekom daher kein Geld
an...

Latency
28.03.2005, 11:15
<?php
session_start();
include ('dbconnect.php');
?>
<html>
<head>
<style type="text/css">
body{font-family:Verdana, Arial, Helvetica, sans-serif; font-size:14px;}
</style>
</head>
<body>
<?php
$abfrage = "SELECT * FROM user WHERE `user` = '" . $_SESSION['nick'] . "'");
$sql = mysql_query($abfrage) OR die(mysql_error());
$numRows = mysql_num_rows($sql);
if($numRows == 1)
{
$row = mysql_fetch_array($sql);
$get_updatetime = "SELECT * FROM user WHERE name = '".$row['name']."'";
$query_updatetime = mysql_query($get_updatetime) OR die(mysql_error());
$row_updatetime = mysql_fetch_array($query_updatetime);
$yet = time();
$hour = 3600;
if($row_updatetime['money_update'] <= $yet - $hour)
{
$geld_zuwachs = $row_updatetime['level_money'] * 100;
$money = "UPDATE user SET money = money + '".$geld_zuwachs."' WHERE name = '".$row_updatetime['name']."'";
$eintrag = mysql_query($money);
}
}
else
{
echo'Der User <b>'.$row['name'].'</b> war nicht online und bekam somit kein Geld<br>';
}
?>
</body>
</html>


Jetzt müsste es klappen. :)

raian
28.03.2005, 11:22
Es gibt zwar nciht das richige aus, aber ich war online und habe Kohle bekommen.

Insgesamt 500....hä?

Nuja, ich werde noch ein wenig an dem uodate_time usw arbeiten, ich habe gerade gemerkt das da auch ein Fehler drin sein könnte!

PS:Ich hab noch nen Fehler gefunden. update_time usw liegen in einer extra tabelle!^^