gerd: Es wird immer nur ein Datensatz ausgelesen

Hallo Leute,
War mit meinem Problem gestern schon in diesem Forum. Tobias hat mir mit seiner Idee einen großen Schritt weitergeholfen. Ein kleines Problem hab ich aber immer noch.
Ich habe 2 php Seiten. Auf der ersten werden Daten aus der DB ausgelesen und Tabellarisch aufgelistet. Zu jedem Datensatz der aufgelistet wird gibt es eine Checkbox.
#######################################
<input type="checkbox" name="bestellen[]" value="<? echo $artnr; ?>">
######################################
Diese dienen dazu um einzelne Atikel auszuwählen. Durch anklicken eines Buttons wird einen neue Seite aufgerufen. Auf dieser Seite sollen nun jene Artikel angezeigt werden, bei denen die Checkbox angeklickt wurde. Wenn ich nur eine Checkbox anklicke, wird der jeweilige Datensatz auch richtig angezeigt. Wenn ich aber mehr als eine anklicke, werden keine Daten aus der DB ausgelesen. Bin aber noch nicht dahnitergekommen wieso. Zum besseren verständnis hier der Code dieser Seite:

###############################################
$bestellen  = $HTTP_POST_VARS["bestellen"];
$bestellen_text = implode(', ',$bestellen);
mysql_connect($db_host,$db_user,$db_pass) || die("Could not contact mySQL!");
mysql_select_db($db_db) || die("Connected mySQL, but database is unavailable!");
$result=mysql_query("SELECT id, artnr, bezeichnung, preis FROM artikel WHERE artnr='$bestellen_text'");
?>
<table width="600" cellspacing="1" cellpadding="3" bgcolor="#336699">
<TR>
<td align="center" bgcolor="#336699" colspan="6" class="bold"><font color="#ffffff">Ihr Warenkorb</font><br>
</td>
</tr>
<TR>
<td bgcolor="#ffffff" class="std">Art-Nr.</td>
<td bgcolor="#ffffff" class="std">Bezeichnung</td>
<td bgcolor="#ffffff" class="std">Menge</td>
<td bgcolor="#ffffff" class="std" align="right">Preis</td>
<td bgcolor="#ffffff" class="std" align="right">Gesamt</td>
<td bgcolor="#ffffff" class="std" align="center">&Auml;ndern</td>
</tr>
<?
while($row=mysql_fetch_array($result))
{
$id=$row["id"];
$artnr=$row["artnr"];
$bezeichnung=$row["bezeichnung"];
$preis=$row["preis"];

?>
<TR>
<TD bgcolor="#ffffff" class="small"><? echo $artnr; ?></td>
<TD bgcolor="#ffffff" class="small"><? echo $bezeichnung; ?></td>
<TD bgcolor="#ffffff" class="small"><? echo $menge; ?></td>
<TD bgcolor="#ffffff" align="right" class="small"><? echo "".number_format($preis,2)." EUR"; ?></td>
<TD bgcolor="#ffffff" class="small" align="right"><? echo "".number_format($gesamt,2)." EUR"; ?></td>
<TD bgcolor="#ffffff" class="small" align="center">
<?
echo "<a href="ausgabe.php?id=$id"><img src="/images/aendern.gif" border="0"></a>";
?>
</td>
</TR>
<?
}
?>
</table>
################################################
Danke mal für Eure Hilfe
Gerd

  1. Hallo Gerd,

    Dein SELECT ist nicht in Ordnung:

    SELECT id, artnr, bezeichnung, preis FROM artikel WHERE artnr='$bestellen_text'

    Du versuchst festzustellen, ob ein Wert artnr gleich einem String $bestellen_text ist. Dein Ziel scheint aber zu sein, ob der Wert artnr sich in einer Liste von Werten befindet, die kommasepariert in $bestellen_text enthalten ist; also etwa so:

    $lcQuery = sprintf('SELECT id,artnr,bezeichnung,preis FROM artikel WHERE artnr IN (%s)',$bestellen_text);

    Beim Erzeugen von $bestellen_text solltest Du darauf achten, ob Deine artnrs numerisch oder Strings sind (habe mir diesen Bereich nicht angesehen).

    HTH Robert

    1. Hallo Robert,
      Aber warum funktioniert die Abfrage wenn ich EINE Checkbox auswähle und warum funktioniert es NICHT wenn ich mehr als eine Checkbox auswähle?????????

      Danke
      Gerd

      1. Aber warum funktioniert die Abfrage wenn ich EINE Checkbox auswähle und warum funktioniert es NICHT wenn ich mehr als eine Checkbox auswähle?????????

        Hallo Gerd,

        ich habe nicht Deine ganze Textwüste durchgearbeitet, um das beantworten zu können. Möglicherweise kannst Du Dir die Frage selbst beantworten, nachdem Du die richtige Lösung gefunden hast. Und um einen Wert mit einer Liste von Werten abzugleichen, kannst Du nicht mit dem Gleichheitsoperator in der WHERE-Klausel arbeiten, Du brauchst IN! Probier es aus, kostet nur ein paar Minuten!

        HTH Robert

        1. Hallo Robert,
          Da ich php noch nicht Sattelfest bin, wo oder wie wird IN verwendet??
          Gerd

          1. Hallo Gerd,

            Da ich php noch nicht Sattelfest bin, wo oder wie wird IN verwendet??

            die Sattelfestigkeit fehlt eher für MySQL: IN ist ein Operator für die WHERE-Klausel des SELECTs. Hatte ich nicht weiter oben vorgeschlagen:

            $lcQuery = sprintf('SELECT id,artnr,bezeichnung,preis FROM artikel WHERE artnr IN (%s)',$bestellen_text);

            ?

            Deine nicht funktionierende WHERE-Klausel sah - mit Werten gefüllt - so aus:

            WHERE '4711' = '4711, 4712, 13, 0815'

            Sie sollte so aussehen:

            WHERE '4711' IN ('4711','4712','13','0815')

            Klar?

            HTH Robert

            1. Hallo Robert,
              das ist mir aber trotzdem etwas unklar. Wenn das Ergebnis der Abfrage so aussieht:

              WHERE '4711' IN ('4711','4712','13','0815')

              dann habe ich ja immer noch ein Problem. Es werden ja verschiedene Artikelnummern benötigt, um mehrere Datensätze auszulesen. Bei dieser Abfrage wird aber nur eine Artikelnummer überprüft. Oder denk ich jetzt falsch???

              Gerd

              1. Hallo Gerd,

                WHERE '4711' IN ('4711','4712','13','0815')

                dann habe ich ja immer noch ein Problem. Es werden ja verschiedene Artikelnummern benötigt, um mehrere Datensätze auszulesen. Bei dieser Abfrage wird aber nur eine Artikelnummer überprüft. Oder denk ich jetzt falsch???

                Die Literale habe ich in die Klausel eingesetzt, um deutlich zu machen, in welcher Form die Anweisung ausgewertet wird. Natürlich sollst Du den Ausdruck nicht so in Deinen SELECT integrieren! Der linke Operator ist eine Variable:

                WHERE artnr IN ({Liste})

                Achtung: {Liste} ist Pseudocode, auch hier meine ich nicht, daß Du das so notierst! Dieser Pseudocode wird ersetzt durch Deinen String $bestellen_text, der die kommaseparierte Liste (durch implode() aus dem übergebenen Array entstanden) der zu ladenden Artikel enthält. Die SQL-Maschine sucht jetzt alle DS aus der Tabelle, welche in der Spalte artnr einen Wert enthalten, der in der Liste auf der rechten Seite des IN-Operators vorkommt.

                Oder denke ich jetzt falsch?

                HTH Robert

                1. Hallo Robert,
                  Hier mal die geänderte Abfrage. Krieg aber eine Fehlermeldung:

                  Warning: Supplied argument is not a valid MySQL result resource in /var/www/htdocs/andi/scripts/artikel/warenkorb.php on line 39

                  Die Werte der Checkboxen werden aber übergeben

                  $bestellen  = $HTTP_POST_VARS["bestellen"];
                  $bestellen_text = implode(",",$bestellen);
                  mysql_connect($db_host,$db_user,$db_pass) || die("Could not contact mySQL!");
                  mysql_select_db($db_db) || die("Connected mySQL, but database is unavailable!");
                  $result=mysql_query("SELECT id,artnr,bezeichnung FROM artikel WHERE artnr IN ($bestellen_text)");
                  ?>
                  Bla Bla
                  <?
                  while($row=mysql_fetch_array($result)) // Line 39
                  {
                  $id=$row["id"];
                  $artnr=$row["artnr"];
                  $bezeichnung=$row["bezeichnung"];
                  $preis=$row["preis"];
                  }
                  ?>
                  Bla Bla

                  1. Seufz, Gerd,

                    Warning: Supplied argument is not a valid MySQL result resource in /var/www/htdocs/andi/scripts/artikel/warenkorb.php on line 39

                    $bestellen  = $HTTP_POST_VARS["bestellen"];
                    $bestellen_text = implode(",",$bestellen);
                    $result=mysql_query("SELECT id,artnr,bezeichnung FROM artikel WHERE artnr IN ($bestellen_text)");

                    hast Du dafür gesorgt, daß die Datentypen der artnr-Spalte und der Listenelemente übereinstimmen? Sie Dir mal die Variableninhalte an! Ist artnr numerisch, dann müßte in $bestellen_text (beispielhaft) so etwas stehen:

                    4711,4712,13,815

                    Ist artnr ein String, dann müßte in $bestellen_text (beispielhaft) so etwas stehen:

                    '4711','4712','13','0815'

                    Beim Zusammenbau des Abfrage-String mußt Du darauf achten, daß der Inhalt von $bestellen_text als Literal zwischen den Klammern des rechten IN-Operators steht!

                    Ich wünschte, ich könnte Dich so wunderbar leicht-zynisch-und-arrogant-aber-pädagogisch-wertvoll wie üblicherweise von Cheatah praktiziert in die richtige Richtung leiten!

                    HTH Robert

                    1. Hallo Robert,
                      Einaml noch dann geb ichs auf.
                      Wenn ich

                      $bestellen  = $HTTP_POST_VARS["bestellen"];
                      $bestellen_text = implode(",",$bestellen);

                      hier die variable mit echo anzeigen lasse, dann stehen die Werte der Checkbox folgendermaßen:

                      MA 1234,MA 5678

                      Gerd

                      1. Hi Gerd,

                        da Du einfach nicht damit herausrückst, welchen Datentyp Deine Spalte artnr hat, treffe ich die Annahme, es sei ein String. Dann könntest Du die Abfrage so formulieren:

                        $bestellen_text = implode("','",$bestellen);
                        $lcQuery        = sprintf("SELECT id,artnr,bezeichnung,preis FROM artikel WHERE artnr IN ('%s')",$bestellen_text);

                        Ich verwende sprintf(), weil ich damit eine bessere Kontrolle über das Ergebnis zu haben glaube als mit einer unübersichtlichen Konkatenierung von Strings und Variablen.

                        Die Vergleichsliste auf der rechten Seite des IN-Operators zählt Strings auf, deshalb packst Du vor und hinter die Literale beim implodieren jeweils ein Hochkomma. Da nach der Implosion aber noch die Hochkommata am Anfang und am Ende des erzeugten Variableninhaltes fehlen, gebe ich sie im sprintf()-String noch mit hinzu (oder Du packst Sie bei der Zuweisung zu $bestellen_text mit dem Punkt-Operator davor und dahinter, das macht den Quellcode vielleicht verständlicher). Dann sieht die rechte Seite vom IN so aus:

                        ('MA 1234','MA 5678')

                        Falls dann in der Spalte artnr bei den einzelnen DS tatsächlich derartige Strings vorkommen, sollte es gehen...

                        HTH Robert

                        1. Hallo Robert,
                          Die Abfrage funktioniert endlich:

                          $query="SELECT id,artnr,bezeichnung FROM artikel WHERE artnr='";
                          $query.=implode("' OR artnr = '",$bestellen)."'";

                          Jetzt habe ich nur mehr das Problem wenn keine Checkbox ausgewählt wurde kommt folgende Fehlermeldung:

                          Warning: Bad arguments to implode() in /var/www/htdocs/andi/scripts/artikel/warenkorb.php on line 24

                          Gerd

                          1. Danke an Euch das ihr mir bei der Lösung meines Problems geholfen habt. Hier der Coder der jetzt ENDLICH funktioniert.
                            <?
                            include("admin/config.php");
                            $bestellen  = $HTTP_POST_VARS["bestellen"];
                            if($bestellen!=$artnr)
                            {
                            mysql_connect($db_host,$db_user,$db_pass) || die("Could not contact mySQL!");
                            mysql_select_db($db_db) || die("Connected mySQL, but database is unavailable!");
                            $query="SELECT id,artnr,bezeichnung FROM artikel WHERE artnr='";
                            $query.=implode("' OR artnr = '",$bestellen)."'";
                            $result=mysql_query($query);

                            ?>
                            <table>
                            <TR>
                            <td>Art-Nr.</td>
                            <td>Bezeichnung</td>
                            </tr>
                            <?
                            while($row=mysql_fetch_array($result))
                            {
                            $id=$row["id"];
                            $artnr=$row["artnr"];
                            $bezeichnung=$row["bezeichnung"];
                            ?>
                            <TR>
                            <TD><? echo $artnr; ?></td>
                            <TD><? echo $bezeichnung; ?></td>
                            </TR>
                            <?
                            }
                            ?>
                            </table>
                            <?
                            }
                            else
                            {
                             echo "Keine Artikel ausgewählt";
                            }
                            ?>

                            1. Hallo Gerd,

                              die Sache scheint mir langsam ans Herz zu wachsen...

                              Danke an Euch das ihr mir bei der Lösung meines Problems geholfen habt. Hier der Coder der jetzt ENDLICH funktioniert.
                              <?
                              include("admin/config.php");
                              $bestellen  = $HTTP_POST_VARS["bestellen"];

                              Besser so: $bestellen = $_POST['bestellen'];

                              if($bestellen!=$artnr)
                              {
                              mysql_connect($db_host,$db_user,$db_pass) || die("Could not contact mySQL!");
                              mysql_select_db($db_db) || die("Connected mySQL, but database is unavailable!");
                              $query="SELECT id,artnr,bezeichnung FROM artikel WHERE artnr='";
                              $query.=implode("' OR artnr = '",$bestellen)."'";

                              Ich habe Zweifel, ob das funktioniert - es _scheint_ nur zu funktionieren! Was ist das denn:

                              if($bestellen!=$artnr)

                              ? Du prüfst das per POST übergebene Array $bestellen gegen eine nicht existierende Variable $artnr (war artnr nicht ein Spaltenbezeichner aus Deiner SQL-Tabelle?). Wird in der Vorgängerseite keine Checkbox markiert, so wird die nicht gesetzte Variable $bestellen auf Ungleichheit zur nicht gesetzten Variable $artnr getestet - deshalb läufst Du nicht in den if-Zweig hinein. Bringt das gewünschte Ergebnis, ist aber nicht die feine englische Art und birgt bei späteren Erweiterungen interessante Seiteneffekte in sich (wenn es zum Beispiel einmal eine Variable $artnr geben sollte). Die entscheidende Frage für Dich lautet: ist das Array $bestellen leer oder nicht?

                              HTH Robert

                          2. Hi Gerd,

                            Die Abfrage funktioniert endlich:

                            Heureka!

                            $query="SELECT id,artnr,bezeichnung FROM artikel WHERE artnr='";
                            $query.=implode("' OR artnr = '",$bestellen)."'";

                            Allerdings nicht mit WHERE .. IN .. gelöst, an dem wir die ganze Zeit rumgedoktort haben; wäre interessant zu testen, ob Dein boolscher Ausdruck nicht eine schlechtere Performance besitzt als die IN-Operation...

                            Jetzt habe ich nur mehr das Problem wenn keine Checkbox ausgewählt wurde kommt folgende Fehlermeldung:
                            Warning: Bad arguments to implode() in /var/www/htdocs/andi/scripts/artikel/warenkorb.php on line 24

                            Logisch - dann wirst Du eben diesen Fehler abfangen indem Du den Inhalt von $bestellen vor der Implosion überprüfst!

                            HTH Robert

  2. Hallo Gerd

    Ich habe momentan genau das selbe Problem wie du. Aber könntest du nicht auch einmal den Code deines Auswertungsscripts angeben?

    Gruss Daniel

    1. Hallo,

      Seite1.php mit Checkbox
      ######################################
      <?
      include("admin/config.php");
      $hersteller  = $HTTP_POST_VARS["hersteller"];
      mysql_connect($db_host,$db_user,$db_pass) || die("Could not contact mySQL!");
      mysql_select_db($db_db) || die("Connected mySQL, but database is unavailable!");
      $result=mysql_query("SELECT id,artnr,hersteller,bezeichnung FROM artikel WHERE hersteller = '".join("' OR hersteller = '",$hersteller)."'");
      if(mysql_num_rows($result1)>0)
      {
      ?>
      <form name="frmRegister" action="seite2.php" method="post">
      <table>
      <TR>
      <td>Art-Nr.</td>
      <td>Hersteller</td>
      <td>Bezeichnung</td>
      <td>Info</td>
      <td>Preis</td>
      <td>in den Warenkorb</td>
      </tr>
      <?
      while($row=mysql_fetch_array($result))
      {
      $id=$row["id"];
      $artnr=$row["artnr"];
      $hersteller=$row["hersteller"];
      $bezeichnung=$row["bezeichnung"];
      ?>
       <TR>
      <TD><? echo $artnr; ?></td>
      <TD><? echo $hersteller; ?></td>
      <TD><? echo $bezeichnung; ?></td>
      <TD><input type="checkbox" name="bestellen[]" value="<? echo $artnr; ?>"></td>
      </TR>
      <?
      }
      ?>
      <tr>
      <td bgcolor="#ffffff" colspan="6" align="right" class="std"><input type="button" value="Warenkorb ansehen" onClick="verify_page()"></td>
      </tr>
      </table>
      </form>
      #######################################

      Seite2.php wo der Wert der Checkboxen ausgewertet wird (soll)

      ###############################################
      <?
      include("admin/config.php");

      $bestellen  = $HTTP_POST_VARS["bestellen"];
      $bestellen_text = implode(",",$bestellen);

      mysql_connect($db_host,$db_user,$db_pass) || die("Could not contact mySQL!");
      mysql_select_db($db_db) || die("Connected mySQL, but database is unavailable!");
      $result=mysql_query("SELECT id,artnr,bezeichnung FROM artikel WHERE artnr='$bestellen_text'");

      ?>
      <table>

      <TR>
      <td bgcolor="#ffffff" class="std">Art-Nr.</td>
      <td bgcolor="#ffffff" class="std">Bezeichnung</td>
      </tr>
      <?
      while($row=mysql_fetch_array($result))
      {
      $id=$row["id"];
      $artnr=$row["artnr"];
      $bezeichnung=$row["bezeichnung"];
      ?>
      <TR>
      <TD bgcolor="#ffffff" class="small"><? echo $artnr; ?></td>
      <TD bgcolor="#ffffff" class="small"><? echo $bezeichnung; ?></td>
      </TR>
      <?
      }
      ?>
      </table>

      ###########################################

      Gerd