Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
Problem mit while()? [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Problem mit while()?


 
MadeVr
16-06-2006, 19:27 
 
Hi,
ich suche jetzt schon seit mehreren Tagen den Fehler in diesem Skript, aber ich finde einfach keinen:

// siehe weiter unten


Bitte nicht wundern über die Variablen-Namen, die habe ich mal durch ein paar komplett bezuglose Begriffe ersetzt, genauso wie Datenbank-Daten.
Zu sagen wäre noch, dass das ein Auszug ist, ich aber mit dem kompletten Code keinen Fehler, auch keinen Notice ausgespuckt bekomme.

Was ist also los damit?
Naja, der Code soll eigentlich prüfen, ob verschiedene Datenzeilen mit verschiedenen Bedingungen existieren, und wenn ja, dann sollen sie ausgegeben werden.
Das funktioniert mit der ersten Tabellenzeile einwandfrei, aber es wird NIEMALS eine zweite Zeile ausgegeben, auch wenn alle Bedingungen dazu erfüllt sind.

Kann mir jemand sagen wo der Fehler ist (er müsste eigentlich von logischer Natur sein)? :dontknow:

Nochmals: einige Funktionen sind nicht enthalten, aber an denen kanns nicht liegen, der Fehler muss in diesem Code Abschnitt sein!

PS: der Code ist für / in PHP 5.1 geschrieben

 
penizillin
16-06-2006, 19:38 
 
erst díe regeln befolgen.

 
hhcm
16-06-2006, 19:45 
 
Dann erklär doch mal einem NICHTSWISSENDEN (weil der restliche Code schliesslich keine fehler enthält) was z.B $datas und $betas sein sollen ?

Wo kommen die werte her?
Sicher das diese nach deinem ersten durchlauf noch != 0 sind?
Warum funktioniert es denn mit der ersten Zeile? (:confused: )


Frag Wahsaga, der müsste das (wie der name schon sagt) wissen

 
MadeVr
16-06-2006, 19:50 
 
Das ist es ja, es funktioniert mit der ersten Zeile, aber nicht mit der zweiten!

Die Bedingung ist ganz klar erfüllt, da auch die echo-Ausgabe (echo '<br /><strong>Auf dieses Release bezieht sich ein Beta:</strong>';) vor der while() Schleife ausgegeben wird (bei beiden Zeilen)!

FAKT: Alle Bedingungen sind erfüllt, nur bei der zweiten Zeile wird die while() Schleife nicht mehr ausgeführt bzw. der enthaltene Code eben nicht mehr ausgegeben.

Welche Regeln habe ich denn nicht befolgt?

 
penizillin
16-06-2006, 19:53 
 
ich muss gewaltig horizontal scrollen.

 
MadeVr
16-06-2006, 20:01 
 
Sorry,
die Regel muss ich übersehen haben, tut mir Leid.
Ich hab mal ein wenig umgebrochen, hoffentlich hat die Übersicht nicht allzu sehr gelitten. Ich weiß, da sind immer noch Scrollbalken, aber ich finde das ist so OK.
Ich hoffe für dich / euch auch.

Wie steht's jetzt, kennt jemand das Problem / eine Lösung?

 
hhcm
16-06-2006, 20:04 
 
Die Bedingung ist ganz klar erfüllt, da auch die echo-Ausgabe (echo '<br /><strong>Auf dieses Release bezieht sich ein Beta:</strong>';) vor der while() Schleife ausgegeben wird (bei beiden Zeilen)!

Und?


if ($betas == 1) {


Dann wird das wohl richtig sein..


if ($betas > 1) {


kommt das denn auch noch? Wahrscheinlich nicht, sonst würdest du nicht fragen.

 
MadeVr
16-06-2006, 20:16 
 
Nein, das kommt narülich nur, wenn $beta ein Zahl hat die größer als eins ist, aber das ist ja gerade dazu um das zu entscheiden (je nachdem was in der Datenbank gefunden wird).
Und wenn das ganze = 1 ist wie soll es dann gleichzeitig noch > 1 sein?

Oder ist das ein Missverständnis?

 
hhcm
16-06-2006, 20:28 
 
1)
Das funktioniert mit der ersten Tabellenzeile einwandfrei, aber es wird NIEMALS eine zweite Zeile ausgegeben, auch wenn alle Bedingungen dazu erfüllt sind.


2)

(je nachdem was in der Datenbank gefunden wird).

Oder ist das ein Missverständnis?


Und du fragst nach Missverständnissen?

Niemand hier weiss was in deiner Datenbank gefunden wird.

Ich dachte dir soll hier jemand helfen. Du gibst deinen Code nicht raus, möchtest aber hilfe :confused:

 
mai
16-06-2006, 20:55 
 
Wenn die zweite Tabelle nicht ausgegeben wird, ist der Datenbankzugriff auf die Tabelle rels im betas-Teil falsch bzw. liefert 0 Zeilen (da auch keine exception).

das $betas kommt übrigens nicht von diesem SELECT sondern von was anderem.

 
MadeVr
16-06-2006, 21:15 
 
In phpMyAdmin liefert der Befehl mit Werten (die die Variablen haben) eine Zeile zurück!

Ich liefere keinen weiteren Code, weil der Fehler einfach hier liegen MUSS!

Wenn es unbedingt nötig ist, einige Hinweise:
- eine Zeile hat ein ID - und zwei felder, die die Anzahl von datas und betas enthalten - die hab ich ausgelesen, sodass $datas und $betas jeweils 1 enthalten MÜSSEN (kein Zweifel, getestet!)
- es gibt ein pzugid-Feld, das die ID der ersten Zeile hat, in zwei weiteren Zeilen (1 zeile steht für die Anzahl in $datas, also eine Zeile die unter die kategorie datas fällt, die andere für $betas (-> 1 Zeile gehört in die Kategorie betas). Diese beiden Zeilen beziehen sich auf die erste Zeile. Also steht in dem pzugid der beiden Zeilen die ID der ersten Zeile, deren pzugid Feld leer ist.

$datas = Anzahl der Zeilen Kategorie datas
$betas = Anzahl der Zeilen Kategorie betas
$pzugid = ID, auf das sich die Zeile aus der Kategorie datas oder betas bezieht

Ausgegeben werden sollen jetzt zuerst die Hauptzeile, aus der wird ausgelesen, wie viele datas und betas Zeilen es gibt. Und die werden dann auch ausgegeben (in dem Fall eben jeweils 1 Zeile, die 1. datas Zeile wird korrekt ausgegeben, die 2., eine betas, wird nicht ausgegeben, obwohl sie existiert und den Bedingungen entspricht.

Wenn noch Fragen offen sind, ich beantworte sie gerne, wenn ihr mir nur helft! Ich bin sowas von hilflos in der Angelegenheit!

Vielleicht poste ich noch den kompletten Code heute Abend...

 
mai
16-06-2006, 21:24 
 
dann mach mal testoutput von deinem zweiten Datenbankzugriff, was immer deine object-methode MySQLi ldazu liefern kann.
Anzahl zeilen? entsprechend mysql_num_rows()?
Ausführungsstatus? entsprechend $result=mysql_query()?

Dann hast Du noch eine Xaos-Syntax:
Also steht in dem pzugid der beiden Zeilen die ID der ersten Zeile, deren pzugid Feld leer ist.
eine betas, wird nicht ausgegeben

wird jetzt die Anfangszeile, es gibt $betas /ein beta ausgegeben oder nicht.

ganz abgesehen von deiner Benennung der zeilen mit erste zeile, bzw. beide zeilen usw.

 
mai
16-06-2006, 21:26 
 
und echoe mal deine $sql

 
mai
16-06-2006, 21:31 
 
dann kannst noch den source code des html sehen, ob<table> usw. drinsteht.

 
MadeVr
16-06-2006, 21:46 
 
Nochmal von vorne, zuerst einmal die Datei, um die es sich dreht (komplett! in zwei Parts, wegen maximaler Beitragslänge) PART1:


<?php
$id = $_GET['r_id'];
try {
$db = new MySQLi('XXX', 'XXX', 'XXX', 'XXX');
$sql = "SELECT id, date, time, typ, art, fach,
aufbekommen, hausaufgabe, source, rate, komment FROM datensatz WHERE id='$id'";
$kommando = $db->prepare($sql);
$kommando->execute();
$kommando->bind_result($id, $date, $time, $typ, $art, $fach, $aufbekommen,
$hausaufgabe, $source, $rate, $komment);

while ($kommando->fetch()) {
?>
<tr>
// wegen Übersicht gelöscht
</tr>
<?php
}

$db->close();
} catch (Exception $e) {
header("location: err.php?f=" . urlencode($e->getMessage()));
}
?>

</table>

<?php
try {
$db = new MySQLi('XXX', 'XXX', 'XXX', 'XXX');
$sql = "SELECT loops, poops FROM datensatz WHERE id='$id'";
$kommando = $db->prepare($sql);
$kommando->execute();
$kommando->bind_result($loops, $poops);
$kommando->fetch();
$db->close();
} catch (Exception $e) {
header("location: err.php?f=" . urlencode($e->getMessage()));
}

////////////////////////////////////////////////////////////////////////////////////////
/// loops checken //////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
if ($loops != 0) {
try {
$db = new MySQLi('XXX', 'XXX', 'XXX', 'XXX');
$sql = "SELECT id, date, time, typ, art, fach, aufbekommen, hausaufgabe,
source, rate, komment FROM datensatz WHERE pzugid='$id' AND art='loop'";
$kommando = $db->prepare($sql);
$kommando->execute();
$kommando->bind_result($id, $date, $time, $typ, $art, $fach, $aufbekommen,
$hausaufgabe, $source, $rate, $komment);
if ($loops == 1) {
echo '<br /><strong>Auf diesen Eintrag bezieht sich ein loop:</strong>';
}
if ($loops > 1) {
echo '<br /><strong>Auf diesen Eintrag beziehen sich ' . $loops . 'loops:</strong>';
}
?>
<table>
<?php while ($kommando->fetch()) { ?>
<tr>
wegen Übersicht gelöscht
</tr>
<?php } ?>
</table>
<?php
$db->close();
} catch (Exception $e) {
header("location: err.php?f=" . urlencode($e->getMessage()));
}
}



Die drei Funktionen, die included sind (über functions.php) sind wohl nicht relevant, oder? Wenn doch gebt Bescheid!
In der Datenbank gibt es (nur relevante Felder):
1. Zeile: ID = 1 | loops = 1 | poops = 1
2. Zeile: ID = 2 | art = loop | pzugid = 1
3. Zeile: ID = 3 | art = poop | pzugid = 1

 
MadeVr
16-06-2006, 21:48 
 
PART2:

///////////////////////////////////////////////////////////////////////////////////////
/// poops checken /////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////
if ($poops != 0) {
try {
$db = new MySQLi('XXX', 'XXX', 'XXX', 'XXX');
$sql = "SELECT id, date, time, typ, art, fach, aufbekommen, hausaufgabe,
source, rate, komment FROM datensatz WHERE pzugid='$id' AND art='poop'";
$kommando = $db->prepare($sql);
$kommando->execute();
$kommando->bind_result($id, $date, $time, $typ, $art, $fach, $aufbekommen,
$hausaufgabe, $source, $rate, $komment);
if ($poops == 1) {
echo '<br /><strong>Auf diesen Eintrag bezieht sich ein poop:</strong>';
}
if ($poops > 1) {
echo '<br /><strong>Auf diesen Eintrag beziehen sich ' . $poops . 'poops:</strong>';
}
?>
<table>
<?php while ($kommando->fetch()) { ?>
<tr>
// Übersichtlichkeit halber gelöscht
</tr>
<?php } ?>
</table>
<?php
$db->close();
} catch (Exception $e) {
header("location: err.php?f=" . urlencode($e->getMessage()));
}
}



Bei weiteren Fragen nur melden, ich stehe gern zur Verfügung, solange ihr mir nur helft!

Danke schonmal, ich weiß, ist jetzt relativ lang, aber ich weiss ihr schafft das, zusammen kriegen wir den Fehler!

Kopiert doch alles in euren Editor, ich denke dann ist es einfacher zu durchschauen!

 
mai
16-06-2006, 21:52 
 
-

 
MadeVr
16-06-2006, 21:56 
 
Gibt es dazu Tipps, bezüglich des Code?

Ich mein, ich habe ja eigentlich alle Bedingungen erfüllt, sehe ich am echo.
Das heißt entweder stimmt was nicht mit der Tabellenzeile, aber der Code ist direkt kopiert, kann also nicht sein.
Eventuell ist da ein Fehler, der verhindert, das eine neue Zeile ausgegeben wird. Denn die Zeile existiert in der DB und erfüllt die angeforderten Bedingungen.

Was kann ich also noch testen? Alles in der while() Schleife wird schlicht nicht ausgegeben! :(

 
mai
16-06-2006, 22:06 
 
Original geschrieben von MadeVr
Was kann ich also noch testen? Alles in der while() Schleife wird schlicht nicht ausgegeben! :(

Du testest überhaupt nichts....

 
mai
16-06-2006, 22:10 
 
Du überschreibst die Variable $id durch das bind().

 
MadeVr
16-06-2006, 22:35 
 
Tausend Dank, das wars!

Problem gelöst!

Ich habe die Variable $id für zwei verschiedene IDs verwendet, danke nochmals!

- -

Alle Zeitangaben in WEZ +2. Es ist jetzt 09:10 Uhr.