• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Schleife und übergehen nicht existenter ips

Status
Für weitere Antworten geschlossen.

Odo

Neues Mitglied
Hi @ all,

ich habe bislang folgendes geschrieben

PHP:
 <?php
$id_neu = $id + 1;
$id_alt = $id - 1;


echo "<div align=\"left\">";
echo "<a href='$PHP_SELF?id=$id_neu'>";
?>
<img src="pics/nextvideobutton.gif" border="0"></a></div>

Nun möchte ich versuchen, dass

1. nach dem idmax wieder zu id1 gesprungen wird und

2. wenn beispielsweise id3; id4 nicht existent sind, man automatisch von id zu id5 springt.


zu 2.

man könnte ein Array aller IDs machen, in dem Stil:
$all_ids[0] = 1
$all_ids[1] = 2
$all_ids[2] = 5
$all_ids[3] = 7

Im vorliegenden Beispiel gäbe es 4 Einträge in der DB, jeweils mit den ids 1, 2, 5, 7. Man könnte sagen:
aktuelle ID ist zB 2, finde den entsprechenden Array-Eintrag bzw. die Nr..

Dann:

$id_neu = $all_ids["$all_id_für2" + 1]

Sprich in diesem Fall:

$id_neu = $all_ids[2] = 5

Was haltet ihr davon ?
 
Zuletzt bearbeitet von einem Moderator:
Werbung:
PHP: next - Manual
Denke mal du suchst das.
(Dein Text ist nicht sehr verständlich)


Ja genau das habe ich gesucht, vielen lieben dank !!!

ich habe es nun wie folgt gelöst:


PHP:
<?php

$mysql_host = "x";
$mysql_user = "x;
$mysql_db = "x";
$mysql_pass = "x";
$mysql_table = "x";

$conn = @MYSQL_CONNECT($mysql_host, $mysql_user, $mysql_pass);
@MYSQL_SELECT_DB($mysql_db) or die ("<h1>Entweder existiert die Datenbank '$mysql_db' nicht oder der MySQL-Server ist nicht verbunden!</h1>");
//Check
if(!$conn) die("<h1>MySQL-Verbindungsfehler<br>Pr&uuml;fen Sie die Einstellungen ...</h1>");

$result = MYSQL_QUERY("SELECT * FROM $mysql_table ORDER BY 'id'");
$ids = array();
while ($row = MYSQL_FETCH_ARRAY($result))
    {
    $ids[] = $row[id];
    }


if($show > 0)
{
$id_prev = $show - 1;
echo "<br><a href=\"test.php?show=" . $id_prev . "\">LEAST</a>";
}
 $id_next = $show + 1;

echo "<br>ID current: " . $ids[$show] . "<br>";
     $max_id = end($ids);
if($ids < $max_id) echo "<br><a href=\"test.php?show=" . $id_next . "\">Next</a>";
if($ids == $max_id) echo "<br><a href=\"test.php?show=" . $id = 1 . "\">Next anfang</a>";
if($ids[$show] != end($ids))
 {

echo "ID-next: " . $ids[$id_next];

echo "<br><a href=\"test.php?show=" . $id_next . "\">Next</a>";
echo "<br><a href=\"test.php?show=" . $id = 1 . "\">Next anfang</a>";
 }

MYSQL_CLOSE($conn);
?>



Allerdings ist mir das mit der schleife noch nicht geglückt... ich möchte, dass bei $max_id mit dem gleichen button zu der ersten(dabei muss geprüft werden welche id existiert) id gesprungen wird. Weiß jemand was ich meine ?
 
Werbung:
hm ich würde es mal so versuchen
PHP:
function set_pointer($id)
{
  while(current($ids) != $id)
    next($ids);
}

//$ids = array(1,3,4,6,7,8,10,15); array mit den IDs

//Bestimmen, welche Id angezeigt wird
if(isset($_GET['show']) && in_array($_GET['show'],$ids))
  $id = $_GET['show'];
else
  $id = current($ids); // Falls keine ID gesetzt oder 
                       // gesetzte ID nicht vorhanden

//nächste ID
set_pointer($id);
if(current($ids) == array_pop($ids))
{
  reset($ids);
  $next_id = current($ids);
}
else
{
  $next_id = next($ids);
}

//vorherige ID
reset($ids);
$first = current($ids);
set_pointer($id);
if(current($ids) == $first)
{
  $prev_id = end($ids);
}
else
{
  $prev_id = prev($ids);
}
echo '<a href=test.php?show=".$prev_id.">vorherige ID</a>';
echo '<a href=test.php?show=".$next_id.">nächste ID</a>';
 
Zuletzt bearbeitet:
hm ich würde es mal so versuchen
PHP:
function set_pointer($id)
{
  while(current($ids) != $id)
    next($ids);
}

//$ids = array(1,3,4,6,7,8,10,15); array mit den IDs

//Bestimmen, welche Id angezeigt wird
if(isset($_GET['show']) && in_array($_GET['show'],$ids))
  $id = $_GET['show'];
else
  $id = current($ids); // Falls keine ID gesetzt oder 
                       // gesetzte ID nicht vorhanden

//nächste ID
set_pointer($id);
if(current($ids) == array_pop($ids))
{
  reset($ids);
  $next_id = current($ids);
}
else
{
  $next_id = next($ids);
}

//vorherige ID
reset($ids);
$first = current($ids);
set_pointer($id);
if(current($ids) == $first)
{
  $prev_id = end($ids);
}
else
{
  $prev_id = prev($ids);
}
echo '<a href=test.php?show=".$prev_id.">vorherige ID</a>';
echo '<a href=test.php?show=".$next_id.">nächste ID</a>';


Hi Frank,

ich habe versucht deinen code mal zu testen, aber leider funzt es nicht :(
 
Werbung:
hab mich nochmal rangesetzt und es diesmal auch getestet
Es müsste jetzt funktionieren

PHP:
<?php
// alle Fehler ausgeben
error_reporting(E_ALL);

// Array Pointer auf bestimmtes Element setzen
function set_pointer($ids,$id)
{
  reset($ids);
  if(current($ids) == $id)
    return ($ids);
  if(in_array($id,$ids))
  {
      while(next($ids) != $id){}
      return($ids);
  }
  return (false);
}

// Aktuell anzuzeigene ID ermitteln
function getID($ids)
{
  if(isset($_GET["show"]) && in_array($_GET["show"],$ids))
  {
    return ($_GET["show"]);
  }
  else
  {
    return current($ids);
  }
}

// Array mit den vorhandenen IDs
$mysql_host = "x";
$mysql_user = "x";
$mysql_db = "x";
$mysql_pass = "x";
$mysql_table = "x";
$conn = @mysql_connect($mysql_host, $mysql_user, $mysql_pass);
@mysql_select_db ($mysql_db)
$result = mysql_query("SELECT * FROM {$mysql_table} ORDER BY id");
$ids = array();
while ($row = mysql_fetch_assoc($result))
{
  $ids[] = $row["id"];
}

// Anzuzeigene ID bekommen
$id = getID($ids);

//nächste ID
$ids = set_pointer($ids,$id);
if(current($ids) == $ids[(count($ids)-1)])
{
  reset($ids);
  $next_id = current($ids);
}
else
{
  $next_id = next($ids);
}

//vorherige ID
reset($ids);
$first = current($ids);
$ids = set_pointer($ids,$id);
if(current($ids) == $first)
{
  $prev_id = $ids[(count($ids)-1)];
}
else
{
  $prev_id = prev($ids);
}

//Link ausgabe
echo '<a href="?show='.$prev_id.'">vorherige ID ('.$prev_id.')</a><br>'."\n";
echo '<a href="?show='.$next_id.'">nächste ID ('.$next_id.')</a>';
?>
 
Zuletzt bearbeitet:
Hallo :)


danke für deine Hilfe Frank !!



Nur leider ist es nicht ganz das was ich suche. Durch weitere elemente der seite ist es erforderlich, dass die entsprechenden links zur nächsten/vorherigen id wie folgt aussehen:


home.php?id=10

Kannst du mir da weiterhelfen ?
 
Ersetze einfach diesen Teil aus dem Code
PHP:
//Link ausgabe
echo '<a href="?show='.$prev_id.'">vorherige ID ('.$prev_id.')</a><br>'."\n";
echo '<a href="?show='.$next_id.'">nächste ID ('.$next_id.')</a>';

damit
PHP:
//Link ausgabe
echo '<a href="home.php?id='.$prev_id.'">vorherige ID ('.$prev_id.')</a><br>'."\n";
echo '<a href="home.php?id'.$next_id.'">nächste ID ('.$next_id.')</a>';


Und diesen Teil dann entsprechend
PHP:
// Aktuell anzuzeigene ID ermitteln
function getID($ids)
{
  if(isset($_GET["show"]) && in_array($_GET["show"],$ids))
  {
    return ($_GET["show"]);
  }
  else
  {
    return current($ids);
  }
}
zu
PHP:
// Aktuell anzuzeigene ID ermitteln
function getID($ids)
{
  if(isset($_GET["id"]) && in_array($_GET["id"],$ids))
  {
    return ($_GET["id"]);
  }
  else
  {
    return current($ids);
  }
}
 
Zuletzt bearbeitet:
Werbung:
ich bekomme folgende fehlermeldung

Notice: Undefined variable: id in /www/htdocs/w0082e85/strip4you/betaversion/test2.php on line 46

das wäre das hier

PHP:
if(!$id OR $id < 1) $id = "1"; # Fehlerkorrektur; unzulässige IDs werden geblockt

Und leider springt er nicht zur nächsten bzw. vorherigen id :(

Hier noch der geänderte quellcode

PHP:
   <?php
// alle Fehler ausgeben
error_reporting(E_ALL);

// Array Pointer auf bestimmtes Element setzen
function set_pointer($ids,$id)
{
  reset($ids);
  if(current($ids) == $id)
    return ($ids);
  if(in_array($id,$ids))
  {
      while(next($ids) != $id){}
      return($ids);
  }
  return (false);
}

// Aktuell anzuzeigene ID ermitteln
function getID($ids)
{
  if(isset($_GET["id"]) && in_array($_GET["id"],$ids))
  {
    return ($_GET["id"]);
  }
  else
  {
    return current($ids);
  }
}

// Array mit den vorhandenen IDs
  $my_host = "x";
  $my_dbname = "x";
  $my_user = "x";
  $my_pass = "x";
  $my_tablename = "x";

 $link = mysql_connect($my_host, $my_user, $my_pass);
  if (!$link)
    die("Kann den Server nicht erreichen.");
  if (!mysql_select_db($my_dbname, $link))
    die("Kann die Datenbank nicht anwählen.");

if(!$id OR $id < 1) $id = "1"; # Fehlerkorrektur; unzulässige IDs werden geblockt

 $result = MYSQL_QUERY("SELECT * FROM $my_tablename WHERE id = $id");
$ids = array();
while ($row = mysql_fetch_assoc($result))
{
  $ids[] = $row["id"];
}

// Anzuzeigene ID bekommen
$id = getID($ids);

//nächste ID
$ids = set_pointer($ids,$id);
if(current($ids) == $ids[(count($ids)-1)])
{
  reset($ids);
  $next_id = current($ids);
}
else
{
  $next_id = next($ids);
}

//vorherige ID
reset($ids);
$first = current($ids);
$ids = set_pointer($ids,$id);
if(current($ids) == $first)
{
  $prev_id = $ids[(count($ids)-1)];
}
else
{
  $prev_id = prev($ids);
}

//Link ausgabe
echo '<a href="test2.php?id='.$prev_id.'">vorherige ID ('.$prev_id.')</a><br>'."\n";
echo '<a href="test2.php?id='.$next_id.'">nächste ID ('.$next_id.')</a>';
?>
 
Zuletzt bearbeitet von einem Moderator:
Dort wo du deine variable $id benutzen möchtest ist sie noch nicht deklariert
du musst schon vorher eine Variable bestimmen bevor du sie nutzt,
Mach es einfach so, und du wirst sehen dass es geht

PHP:
   <?php
// alle Fehler ausgeben
error_reporting(E_ALL);

// Array Pointer auf bestimmtes Element setzen
function set_pointer($ids,$id)
{
  reset($ids);
  if(current($ids) == $id)
    return ($ids);
  if(in_array($id,$ids))
  {
      while(next($ids) != $id){}
      return($ids);
  }
  return (false);
}

// Aktuell anzuzeigene ID ermitteln
function getID($ids)
{
  if(isset($_GET["id"]) && in_array($_GET["id"],$ids))
  {
    return ($_GET["id"]);
  }
  else
  {
    return current($ids);
  }
}

// Array mit den vorhandenen IDs
  $my_host = "x";
  $my_dbname = "x";
  $my_user = "x";
  $my_pass = "x";
  $my_tablename = "x";

$link = mysql_connect($my_host, $my_user, $my_pass);
  if (!$link)
    die("Kann den Server nicht erreichen.");
  if (!mysql_select_db($my_dbname, $link))
    die("Kann die Datenbank nicht anwählen.");

$result = MYSQL_QUERY("SELECT * FROM $my_tablename WHERE id = $id");
$ids = array();
while ($row = mysql_fetch_assoc($result))
{
  $ids[] = $row["id"];
}

// Anzuzeigene ID bekommen
$id = getID($ids);

//nächste ID
$ids = set_pointer($ids,$id);
if(current($ids) == $ids[(count($ids)-1)])
{
  reset($ids);
  $next_id = current($ids);
}
else
{
  $next_id = next($ids);
}

//vorherige ID
reset($ids);
$first = current($ids);
$ids = set_pointer($ids,$id);
if(current($ids) == $first)
{
  $prev_id = $ids[(count($ids)-1)];
}
else
{
  $prev_id = prev($ids);
}

//Link ausgabe
echo '<a href="test2.php?id='.$prev_id.'">vorherige ID ('.$prev_id.')</a><br>'."\n";
echo '<a href="test2.php?id='.$next_id.'">nächste ID ('.$next_id.')</a>';
?>

Ich habe deine Zeile zum blocken ungültiger IDs einfach gelöscht da sie unnütz ist, das wird bereits erledigt in der Funktion getID()
PHP:
function getID($ids)
{
  if(isset($_GET["id"]) && in_array($_GET["id"],$ids))
  {
    return ($_GET["id"]);
  }
  else
  {
    return current($ids);
  }
}

Durch das in_array() werden alle nicht möglichen IDs rausgenommen
 
Werbung:
sieht so aus als wäre nur ein Eintrag in der MySQL Tabelle


Nein es sind 17 bzw. 16 einträge in DB.


Unbenannt.jpg
 
Das Script von mir funktioniert, ich hab es nochmal bei mir getestet, der fehler muss in deinem teil liegen

z.b. hier
PHP:
$result = MYSQL_QUERY("SELECT * FROM $my_tablename WHERE id = $id");
müsste eigtl so sein
PHP:
$result = mysql_query("SELECT * FROM `{$my_tablename}` WHERE `id` = {$id}")
        or die(mysql_error());
 
Werbung:
Ok, ich habe deine Zeilen eingefügt, allerdings habe ich nichts gefunden, was falsch ist. Doch leider funzt es nicht, kannst du mir auf die sprünge helfen ?

PHP:
   <?php
// alle Fehler ausgeben
error_reporting(E_ALL);

// Array Pointer auf bestimmtes Element setzen
function set_pointer($ids,$id)
{
  reset($ids);
  if(current($ids) == $id)
    return ($ids);
  if(in_array($id,$ids))
  {
      while(next($ids) != $id){}
      return($ids);
  }
  return (false);
}

// Aktuell anzuzeigene ID ermitteln
function getID($ids)
{
  if(isset($_GET["id"]) && in_array($_GET["id"],$ids))
  {
    return ($_GET["id"]);
  }
  else
  {
    return current($ids);
  }
}

// Array mit den vorhandenen IDs
  $my_host = "x";
  $my_dbname = "x";
  $my_user = "x";
  $my_pass = "x";
  $my_tablename = "x";

$link = mysql_connect($my_host, $my_user, $my_pass);
  if (!$link)
    die("Kann den Server nicht erreichen.");
  if (!mysql_select_db($my_dbname, $link))
    die("Kann die Datenbank nicht anwählen.");

$result = mysql_query("SELECT * FROM `{$my_tablename}` WHERE `id` = {$id}")
        or die(mysql_error());
$ids = array();
while ($row = mysql_fetch_assoc($result))
{
  $ids[] = $row["id"];
}

// Anzuzeigene ID bekommen
$id = getID($ids);

//nächste ID
$ids = set_pointer($ids,$id);
if(current($ids) == $ids[(count($ids)-1)])
{
  reset($ids);
  $next_id = current($ids);
}
else
{
  $next_id = next($ids);
}

//vorherige ID
reset($ids);
$first = current($ids);
$ids = set_pointer($ids,$id);
if(current($ids) == $first)
{
  $prev_id = $ids[(count($ids)-1)];
}
else
{
  $prev_id = prev($ids);
}

//Link ausgabe
echo '<a href="test2.php?id='.$prev_id.'">vorherige ID ('.$prev_id.')</a><br>'."\n";
echo '<a href="test2.php?id='.$next_id.'">nächste ID ('.$next_id.')</a>';
?>
 
Hallo,

über WHERE id=$id wählst du aus der DB genau einen Eintrag aus. Wenn du die Seite ohne ?id=x aufrufst bekommst du einen Notice-Fehler => register_globals ist auf on und in $id steht $_GET ['id']. Daher bekommst du als vorherigen und nächsten immer den Aktuellen. Wenn du ?id=5 nimmst bekommst du eine leeres Array $ids.

Du musst also den WHERE-Teil aus der MySQL Abfrage entfernen und vl. 'ne Überprüfung einfügen, ob der Index überhaupt in der DB existiert.


N43
 
Mit anderen Worten
PHP:
   <?php
// alle Fehler ausgeben
error_reporting(E_ALL);

// Array Pointer auf bestimmtes Element setzen
function set_pointer($ids,$id)
{
  reset($ids);
  if(current($ids) == $id)
    return ($ids);
  if(in_array($id,$ids))
  {
      while(next($ids) != $id){}
      return($ids);
  }
  return (false);
}

// Aktuell anzuzeigene ID ermitteln
function getID($ids)
{
  if(isset($_GET["id"]) && in_array($_GET["id"],$ids))
  {
    return ($_GET["id"]);
  }
  else
  {
    return current($ids);
  }
}

// Array mit den vorhandenen IDs
  $my_host = "x";
  $my_dbname = "x";
  $my_user = "x";
  $my_pass = "x";
  $my_tablename = "x";

$link = mysql_connect($my_host, $my_user, $my_pass);
  if (!$link)
    die("Kann den Server nicht erreichen.");
  if (!mysql_select_db($my_dbname, $link))
    die("Kann die Datenbank nicht anwählen.");

$result = mysql_query("SELECT * FROM `{$my_tablename}`")
        or die(mysql_error());
$ids = array();
while ($row = mysql_fetch_assoc($result))
{
  $ids[] = $row["id"];
}

// Anzuzeigene ID bekommen
$id = getID($ids);

//nächste ID
$ids = set_pointer($ids,$id);
if(current($ids) == $ids[(count($ids)-1)])
{
  reset($ids);
  $next_id = current($ids);
}
else
{
  $next_id = next($ids);
}

//vorherige ID
reset($ids);
$first = current($ids);
$ids = set_pointer($ids,$id);
if(current($ids) == $first)
{
  $prev_id = $ids[(count($ids)-1)];
}
else
{
  $prev_id = prev($ids);
}

//Link ausgabe
echo '<a href="test2.php?id='.$prev_id.'">vorherige ID ('.$prev_id.')</a><br>'."\n";
echo '<a href="test2.php?id='.$next_id.'">nächste ID ('.$next_id.')</a>';
?>
 
Werbung:
Jippie :D danke für eure Unterstützung !!!! Es funzt nun endlich :) danke danke!


Hier wird ja mitunter auch die vorherige ID "('.$prev_id.')" angezeigt. Kann ich stattdessen auch eine andere spalte der tabelle anzeigen lassen? wenn ja wie ?

PHP:
echo '<a href="test2.php?id='.$prev_id.'">vorherige ID ('.$prev_id.')</a><br>'."\n"; 
echo '<a href="test2.php?id='.$next_id.'">nächste ID ('.$next_id.')</a>';

ich würde das gern über
PHP:
<?php  echo $row[2];?>
lösen.

sprich:
PHP:
echo '<a href="test2.php?id='.$prev_id.'">vorherige ID ('.$prev_id $row[titel].') </a><br>'."\n"; 
echo '<a href="test2.php?id='.$next_id.'">nächste ID ('.$next_id $row[titel].')</a>';
 
klar kannst du es so machen, dazu musst du allerdings prev_id und next_id zu den entsprechenden Funktionen umbauen um mit ihnen so arbeiten zu können, wie du es möchtest
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben