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

[GELOEST] Mehrere Daten in SQL schreiben

Runshak

Mitglied
Ich hatte, wie hier in einem älteren Post von mir, eine Frage. Diese wurde gelöst aber ich wollte das ganze jetzt folgendermaßen abändern.

Folgendes ist vorhanden:

Eine art Shop (es ist bisher keiner: nur vom Aufbau her). Auf dieser Seite kann man Produkte suchen und in einen Warenkorb legen. Wenn man den Warenkorb öffnet sieht man in einer Tabelle die gelisteten Produkte.
Dann gibt es ein Button, welcher die User ID von der Session, die Item ID und die Item Quantity in eine Datenbank schreibt. Der Button ist mit einer Form verbunden welche "hidden" ist und die Daten aus der Warenkorbtabelle holt. Wenn ich das gewünschte Produkt also "ordern" möchte, werden die genannten Daten in die SQL-Tabelle geschrieben. Das funktioniert wunderbar.
Das ganze wirkt wie ein Online Shop, ist aber viel mehr eine Ersatzteildatenbank. Und der Order Button soll dann quasi nur Aufträge anzeigen und ist bisher nur ein Test bzw. eine Idee. Das ganze ist noch nicht online und wird vllt auch in Zukunft nur intern verwendet werden.
Jedoch wäre es schön, wenn man auch mehrere Produkte auswählen kann und "ordern" kann. Ich hab zwar schon eine grobe Vorstellung wie ich vorgehen muss, aber bei der Umsetzung hapert es.

Da die IDs in Formularen immer eindeutig sein müssen, dachte ich, dass ich and die drei Variablen (User ID, Item ID, Item Quantity) noch eine Variable hänge und diese hochzähle. Am Ende soll dann in der Datenbank zb. bei drei georderten Produkten folgendes drinstehen:

1-2-1 (User Produkt Anzahl)
1-5-3 (User Produkt Anzahl)

Beide Einträge bekommen dann noch automatisch das Datum mit Uhrzeit. Anhand dessen, kann man dann die Produkte für das Projekt vorbereiten...



PHP:
    <form class="formLog" action="includes/test.php" method="post">
                    <?php

                      foreach($_SESSION["shopping_cart"] as $values)
                      {
                           $i;
                           $_GET['id'] = $_SESSION['id'];
                           $_GET["item_id"] = $values["item_id"];
                           $_GET["item_quantity"] = $values["item_quantity"];

                            if (!empty($_GET['id'])) {
                            echo '<input type="hidden" name="id" value="'.$_GET['id'].'">';
                            }
                            else {
                            echo '<input type="hidden" name="id">';
                            }

                            if (!empty($_GET["item_id"])) {
                            echo '<input type="hidden" name="item_id[$i]" value="'.$_GET["item_id"].'">';
                            }
                            else {
                            echo '<input type="hidden" name="item_id[$i]">';
                            }

                            if (!empty($_GET["item_quantity"])) {
                            echo '<input type="hidden" name="item_quantity[$i]" value="'.$_GET["item_quantity"].'">';
                            }
                            else {
                            echo '<input type="hidden" name="item_quantity[$i]">';
                            }

                            var_dump($_GET['id']);
                            var_dump($_GET["item_id"][$i]);
                            var_dump($_GET["item_quantity"][$i]);
                            //print_r($_POST);
                            //var_dump($_POST);
                            //}
                            print_r($_POST);
                            var_dump($_POST);

                      }
                      $i++;
                      ?>
                      <p class="pLog">
                          <button class="buttonLog" name="place_offer" type="submit"> Eintragen </button>
                      </p>

    </form>

PHP:
<?php

if (isset($_POST['place_offer']))
{

  require 'dbOfferCon.inc.php';
  for ($i=0; $i<1000; $i++)
  {
    $UID = $_POST['id'][$i];
    $PrID= $_POST["item_id"][$i];
    $PAm = $_POST["item_quantity"][$i];


    $sql = "INSERT INTO offers (UserID, ProductID, PAmount) VALUES (?, ?, ?);";
    $stmt = mysqli_stmt_init($conn);
    if (!mysqli_stmt_prepare($stmt, $sql))
    {
        header("Location: Warenkorb.php?error=sqlerror");
        exit();
    }
    else
    {
             mysqli_stmt_bind_param($stmt, "sss", $UID, $PrID, $PAm);

      mysqli_stmt_execute($stmt);
      header("Location: ../Warenkorb.php?signup=success");
      exit();
    }
  }
}
  // Then we close the prepared statement and the database connection!
  mysqli_stmt_close($stmt);
  mysqli_close($conn);


So hab ich mir das ungefähr vorgestellt...allerdings komme ich nicht zum Ziel...wäre schön, wenn mir jemand helfen könnte
 
Werbung:
Mehrere Fragen:

Was soll das:
PHP:
$i;

Wieso
PHP:
$_GET['id'] = $_SESSION['id'];
und
PHP:
if (!empty($_GET['id'])) {
  echo '<input type="hidden" name="id" value="'.$_GET['id'].'">';
}
else {
   echo '<input type="hidden" name="id">';
}

Was glaubst du steht in $i bei
Code:
echo '<input type="hidden" name="item_id[$i]" value="'.$_GET["item_id"].'">';

echo '<input type="hidden" name="item_id[$i]">';

echo '<input type="hidden" name="item_quantity[$i]" value="'.$_GET["item_quantity"].'">';

echo '<input type="hidden" name="item_quantity[$i]">';

Warum überhaupt hidden-Fehler und nicht Session-Variablen

Wenn $_GET["item_id"] oder $_GET["item_quantity"] nicht gesetzt ist, dann macht die ganze Ausgabe keinen Sinn.

Und wieso überhaupt $_GET?

Warum limitierst du hier:
PHP:
for ($i=0; $i<1000; $i++)

Außerdem wird PHP mit hochgedrehtem Error-Reportinh bei
PHP:
$UID = $_POST['id'][$i];
$PrID= $_POST["item_id"][$i];
$PAm = $_POST["item_quantity"][$i];
meckern, wenn nicht gerade 1000 Artikel per Post ankommen.

Fazit: weg damit und neu machen.
 
Zuletzt bearbeitet von einem Moderator:
Danke für deine Antwort.

Ich habe jetzt das ganze so umgebaut:

PHP:
    <form class="formLog" action="includes/test.php" method="post">
                    <?php

                      foreach($_SESSION["shopping_cart"] as $values)
                      {

                          $_SESSION["item_id"] = $values["item_id"];
                          $_SESSION["item_quantity"] = $values["item_quantity"];
                          echo $_SESSION['id'];
                          echo $_SESSION["item_id"];
                          echo $_SESSION["item_quantity"];
                          echo " ";
                      }
                      ?>
                      <p class="pLog">
                          <button class="buttonLog" name="place_offer" type="submit"> Eintragen </button>
                      </p>

    </form>

Die Echo Ausgabe zeigt mir auch schön die Infos an, wie sie sein sollen.

aber mein SQL INSERT funktioniert noch nicht wie es soll. Entweder wird nur der letzte Eintrag hinzugefügt oder zweimal der gleiche (wenn ich das exit nach header ...=success entferne)

PHP:
<?php
session_start();

if (isset($_POST['place_offer']))
{

  require 'dbOfferCon.inc.php';
  foreach($_SESSION["shopping_cart"] as $values)
  {
    $sql = "INSERT INTO offers (UserID, ProductID, PAmount) VALUES (?, ?, ?);";
    $stmt = mysqli_stmt_init($conn);
    if (!mysqli_stmt_prepare($stmt, $sql))
    {
        header("Location: Warenkorb.php?error=sqlerror");
        exit();
    }
    else
    {
      //mysqli_stmt_bind_param($stmt, "sss", $test1, $test2, $test3);
      mysqli_stmt_bind_param($stmt, "sss", $_SESSION['id'], $_SESSION["item_id"], $_SESSION["item_quantity"]);

      mysqli_stmt_execute($stmt);
      header("Location: ../Warenkorb.php?signup=success");
      exit();
    }
  }
}
  mysqli_stmt_close($stmt);
  mysqli_close($conn);

funktionieren Schleifen in SQL anders oder hab ich nen anderen Denkfehler?
 
Werbung:
Dir fehlen einfach massiv Grundlagen.

Code:
                      foreach($_SESSION["shopping_cart"] as $values)
                      {

                          $_SESSION["item_id"] = $values["item_id"];
                          $_SESSION["item_quantity"] = $values["item_quantity"];
                          echo $_SESSION['id'];
                          echo $_SESSION["item_id"];
                          echo $_SESSION["item_quantity"];
                          echo " ";
                      }

Wieso kopierst du hier die Werte um? Das macht doch null Sinn. Du kannst auch $values['item_id'] ausgeben.

Code:
mysqli_stmt_bind_param($stmt, "sss", $_SESSION['id'], $_SESSION["item_id"], $_SESSION["item_quantity"]);

Du musst doch hier das einfügen, was aus dem Array $_SESSION['shopping_cart'] kommt. Und das steht in $values.

Dazu, die beiden header()-Anweisungen in der Schleife sind am falschen Ort. Alles bis und mit mysqli_stmt_prepare gehört vor die Schleife. Und wenn du den zweiten header() drinlässt bricht das Ganze logischerweise nach einem Vorgang ab.
 
:rolleyes: zu viel und zu umständlich gedacht...danke jetzt klappt es wie gewünscht. Ja in PHP fehlt mir Wissen, aber man lernt ja nie aus. Und dank kompetenter Hilfe wie von dir kann ich einiges dazu lernen. Danke dir!


PHP:
    <form class="formLog" action="includes/test.php" method="post">
      <?php
        foreach($_SESSION["shopping_cart"] as $values)
        {
          $values["item_id"];
          $values["item_quantity"];
        }
      ?>
        <p class="pLog">
          <button class="buttonLog" name="place_offer" type="submit"> Eintragen </button>
        </p>
    </form>

und der SQL Code

PHP:
<?php
session_start();

if (isset($_POST['place_offer']))
{
  require 'dbOfferCon.inc.php';

    $sql = "INSERT INTO offers (UserID, ProductID, PAmount) VALUES (?, ?, ?);";
    $stmt = mysqli_stmt_init($conn);
    if (!mysqli_stmt_prepare($stmt, $sql))
    {
        header("Location: Warenkorb.php?error=sqlerror");
        exit();
    }
    else
    {
      foreach($_SESSION["shopping_cart"] as $values)
      {
        mysqli_stmt_bind_param($stmt, "sss", $_SESSION['id'], $values["item_id"], $values["item_quantity"]);
        mysqli_stmt_execute($stmt);
      }
      header("Location: ../Warenkorb.php?signup=success");
      exit();
  }
}
  mysqli_stmt_close($stmt);
  mysqli_close($conn);
 
Wenn du jetzt nochmal darüber nachdenkst, ob die letzten beiden Zeilen an der richtigen Stelle stehen .... :wink:
 
Werbung:
Zurück
Oben