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)
[PHP5] Wert des darüberliegenden Feldes in einer While-Schleife [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr
ebiz-webhosting
- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
[PHP5] Wert des darüberliegenden Feldes in einer While-Schleife


 
Boron
12-03-2005, 18:22 
 
Hallo,

ich lese aus einer Datenbank Werte mit einer While-Schleife aus:


$result = mysql_query("SELECT * FROM $table WHERE user = '".$user."' ORDER BY sortpos");
while ($data = mysql_fetch_array($result))
{
....
echo $data['ID'];
echo $data['name'];

.... etc.

}


Wie kann ich jetzt herausfinden, welche ID das vorhergehende bzw. das nachfolgende Feld hat, wo allerdings auch user = '".$user."' der Fall ist?

Thx & Greetz
Boron

 
penizillin
12-03-2005, 18:30 
 
drei datensätze auslesen, statt einem.

 
Boron
12-03-2005, 19:21 
 
Danke.
Ich habe das jetzt so gelöst:


$result = mysql_query("SELECT * FROM $table WHERE user = '".$user."' ORDER BY sortpos");
while ($data = mysql_fetch_array($result))
{


$pos = $data['sortpos'];

$res = mysql_query("SELECT ID,sortpos FROM $table WHERE user = '".$user."' AND sortpos < '".$pos."' LIMIT 1");
$IDminus = mysql_fetch_array($res);

$res = mysql_query("SELECT ID,sortpos FROM $table WHERE user = '".$user."' AND sortpos > '".$pos."' LIMIT 1");
$IDplus = mysql_fetch_array($res);


//Ausgabe
echo "aktuelle ID: " . $data['ID'] . "<br>";
echo "vorherige ID: " . $IDminus['ID'] . "<br>";
echo "nächste ID: " . $IDplus['ID'];


}


Geht soweit auch. Aber geht das noch schöner / anders / besser? :)

 
mrhappiness
12-03-2005, 19:30 
 
//initialisieren
$davor = $danach = 'gibt es nicht';
//Datenbank abfragen
$result = mysql_query("SELECT id FROM $table WHERE user = '".$user."' ORDER BY sortpos");
//Datensätze in Array einlesen
while ($data[] = mysql_fetch_array($result));
array_pop($data);
$count = count($data)
//Datensätze abarbeiten
for ($i = 0; $i < $count; $i++) {
echo 'ID: '.$data[$i]['id'].'<br />';
echo 'ID davor: '.$davor.'<br />';;
$danach = isset($data[$i + 1]) ? $data[$i + 1]['id'] : 'gibt es nicht';
echo 'ID danach: '.$danach.'<hr />';
$davor = $data[$i]['id'];
}Dass du die sortpos ausgibst und nicht die IDs, so wie du's im Text formuliert hast, weißt du?

 
Boron
15-03-2005, 20:01 
 
mrhappiness: 'Tschuldigung, aber ich hab' damit jetzt mal nen bisschen "rumprobiert" (ja, anders darf man es leider nicht sagen): Abgesehen davon, dass nicht so ganz klar ist, wo die While-Schleife beginnt und dass dort ein oder mehr Semikolons falsch gesetzt sind, bin ich mir nicht so sicher, ob array_pop (-- Liefert das letzte Element eines Arrays) da wirklich der richtige Befehl sein soll.

Zudem ist meine While-Schleife bereits etwas komplizierter aufgebaut, so dass ich ungerne aus $data ein mehrdimensionales Array machen möchte (also while ($data[] = mysql_fetch_array($result)); tutet nicht so gut bei mir).

Und hast du dir mal die Ausgabe angeschaut? So war es eigentlich nicht gedacht... (vllt. lag es auch daran, dass ich die "Fehler" nicht richtig beseitigt habe...)

Leider musste ich auch feststellen, dass mein Code von oben nicht so wirklich funktioniert.

Eigentlich geht's mir um genau dieses Problem hier: http://www.php-resource.de/forum/showthread.php?s=&threadid=23178

Aber dummerweise schaffe ich es nicht, die sortpos wirklich korrekt zu vertauschen...

 
mrhappiness
16-03-2005, 07:26 
 
Original geschrieben von Boron
Abgesehen davon, dass nicht so ganz klar ist, wo die While-Schleife beginnt bei while
und dass dort ein oder mehr Semikolons falsch gesetzt sindwelches?bin ich mir nicht so sicher, ob array_pop (-- Liefert das letzte Element eines Arrays) da wirklich der richtige Befehl sein soll. ja, denn array_pop liefert das letzte element eines arrays und entfernt es dabei auch aus dem array

wie sieht die ausgabe denn aus?

was den rest angeht:
du selektierst nur auf den user, nicht auf die sortpos, wie also willst du einträge vertauschen?

Du willst zwei Beiträge miteinander tauschen?
Dann mach's doch so, wie es in dem Post steht.
Wenn du nicht klar kommst, poste mal den kompletten Code (ausnahmsweise)

da fehlte ein komma nach dem count, die zwei aufeinanderfolgenden ; sind zwar unschön, tun der funktionalität aber keinen abbruch
//initialisieren
$davor = $danach = 'gibt es nicht';
//Datenbank abfragen
$result = mysql_query("SELECT id FROM $table WHERE user = '".$user."' ORDER BY sortpos");
//Datensätze in Array einlesen
while ($data[] = mysql_fetch_array($result));
array_pop($data);
$count = count($data);
//Datensätze abarbeiten
for ($i = 0; $i < $count; $i++) {
echo 'ID: '.$data[$i]['id'].'<br />';
echo 'ID davor: '.$davor.'<br />';
$danach = isset($data[$i + 1]) ? $data[$i + 1]['id'] : 'gibt es nicht';
echo 'ID danach: '.$danach.'<hr />';
$davor = $data[$i]['id'];
}so besser? (semikolon ergänzt/entfernt)
Du bekommst so alle Datensätze von $user sortiert nach sortpos und es wird dir - sofern vorhanden - die id des datensatzes davor und danach (festgelegt durch die sortierung nach sortpos) ausgegeben

wenn es nicht das war, was du wolltest, dann liegt's vermutlich daran, dass du nicht genung input geliefert hast

 
Boron
16-03-2005, 15:19 
 
Erstmal danke, mrhappiness.

Am besten ich stelle mein Problem nochmal neu, da es doch ein wenig anders als der Eingangspost ist.



Ich möchte die sortpos von zwei Einträgen ändern -- eigentlich Einträge, die in einer Tabelle aufgelistet werden, nach oben bzw. unten verschieben

Hier mein Anfangscode: (der komplette Code würde doch etwas den Rahmen sprengen, deshalb stark gekürzt :D)


<table>

<?
$result = mysql_query("SELECT * FROM $table_leserliste WHERE austraeger='".$name."' ORDER BY sortpos");

while ($data = mysql_fetch_array($result))
{
?>

<tr>
<td><? echo $data["name"]; ?></td>
<td><? echo $data["adresse"]; ?></td>
<td><? echo $data["telefonnr"]; ?></td>

<? // usw....... ?>

<td><? // HIER soll jetzt ein Link zum Vertauschen der sortpos hin ?>nach oben</td>
<td>nach unten (ebenfalls als Link) <-- WIE?</td>

</tr>

<?
} //while ende
?>

</table>


So, das ist also die Situation.




Mein Versuch sieht im Moment so aus -- dabei sende ich die zwei IDs der Einträge an eine extra Datei, die dann die sortpos vertauscht.



Erstmal die zwei Tabellenspalten aus meinem o.g. Script ersetzt:


<td><?

// herausfinden, welche ID die Einträge dadrüber/dadrunter haben
$pos = $data["sortpos"];

$res = mysql_query("SELECT * FROM $table_leserliste WHERE austraeger = '".$name."'
AND sortpos < '".$pos."' LIMIT 1");

$IDminus = mysql_fetch_array($res);

// Link zur Änderung der sortpos
if($IDminus != "") { ?>
<a href="admin_leserliste_sort.php?action=change&id1=
<? echo $data["id"]; ?>&id2=<? echo $IDminus["id"]; ?>">nach oben</a>
<? } ?>
</td>




<td>
<?
// nach unten
$res = mysql_query("SELECT * FROM $table_leserliste WHERE austraeger = '".$name."'
AND sortpos > '".$pos."' LIMIT 1");

$IDplus = mysql_fetch_array($res);

// Link zur Änderung der sortpos
if($IDplus != "") { ?>
<a href="admin_leserliste_sort.php?action=change&id1=
<? echo $data["id"]; ?>&id2=<? echo $IDplus["id"]; ?>">nach unten</a>
<? } ?>
</td>


Meine Idee war also: Ich übergebe die aktuelle ID und die ID, mit der die erste ID vertauscht werden soll, an admin_leserliste_sort.php, wo dann der "sortpos-Tausch" stattfindet.

So, als Problem hat sich aber herausgestellt, dass nicht immer die korrekte id übergeben wird!!
Sprich, so bringt mir der Code nichts, obwohl er eigentlich funktioniert. Manchmal werden halt ganz andere Tabelleninhalte vertauscht, als ich wollte.




Und noch der Auszug aus der admin_leserliste_sort.php: (das Vertauschen der sortpos funktioniert soweit auch!)


switch ($action)
{
default:

break;
case "change":

$id1result = mysql_query("SELECT * FROM $table_leserliste WHERE id='".$id1."' LIMIT 1");
$id1data = mysql_fetch_array($id1result);

$id2result = mysql_query("SELECT * FROM $table_leserliste WHERE id='".$id2."' LIMIT 1");
$id2data = mysql_fetch_array($id2result);

$sortpos1 = $id1data["sortpos"];
$sortpos2 = $id2data["sortpos"];

mysql_query("UPDATE $table_leserliste SET sortpos='".$sortpos2."' WHERE id='".$id1."'");
mysql_query("UPDATE $table_leserliste SET sortpos='".$sortpos1."' WHERE id='".$id2."'");

echo "done.";

break;
} // Switch ende



Wie müssen die zwei Tabellen-Links (siehe 1. code) also nun richtig aussehen? :)

Thx & Greetz

 
mrhappiness
16-03-2005, 15:33 
 
Ich gestehe, ich hab's nur überflogen, bin aber prinzipiell gut gelaunt

Baue den Link so auf:sort.php?id=5&dir=upodersort.php?id=5&dir=down

In sort.php$sql = 'SELECT id, sortpos
FROM tabelle
WHERE id = '.$_GET['id'].'
LIMIT 1';
$r = mysql_query($sql);
$sort['alt'] = mysql_fetch_assoc($r);

$sql = 'SELECT id, sortpos
FROM tabelle
WHERE sortpos %s %d
ORDER BY sortpos %s
LIMIT 1';
if ($_GET['dir'] == 'up')
$sql = sprintf($sql, '<', $sort['alt']['sortpos'], 'DESC');
else
$sql = sprintf($sql, '>', $sort['alt']['sortpos'], 'ASC');
$r = mysql_query($sql);
$sort['neu'] = mysql_fetch_assoc($r);

$sql = 'UPDATE tabelle
SET sortpos = '.$sort['neu']['sortpos'].'
WHERE id = '.$sort['alt']['id'];
mysql_query($sql);
$sql = 'UPDATE tabelle
SET sortpos = '.$sort['alt']['sortpos'].'
WHERE id = '.$sort['neu']['id'];
mysql_query($sql);ohne Gewähr, funktioniert vielleicht auch nicht richtig, aber prinzipiell sollte es klar sein jetzt

 
Boron
16-03-2005, 15:57 
 
bin aber prinzipiell gut gelaunt

War wohl mein Glück.


Sehr geil. Danke. Es funktioniert. (Anscheinend auch richtig.)


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