In DB Tabellenspalte automatisch hinzufügen (falls nicht vorhanden!)

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • In DB Tabellenspalte automatisch hinzufügen (falls nicht vorhanden!)

    moin, moin,

    dem User ist es erlaubt Bilder hochzuladen, wie viele ist mir egal. Das Formular, das den INSERT füttert entsteht über eine foreach-Schleife, die für jedes Bild, dass hochgeladen werden soll ein hidden field anlegt, entsprechend numeriert und als Wert den jeweiligen Dateinamen einträgt.

    Die Tabelle hat eine PictureID als auto increment und eine Spalte Screenshot1 ganz nomal text (hier soll der Dateiname landen).

    Fallbeispiel:
    User will 4 Bilder hochladen. Das Ergebnis meiner foreach-Ausgabe sieht dann so aus:

    <input type="hidden" name="Screenshot1" value="image1.gif">
    <input type="hidden" name="Screenshot2" value="image2.gif">
    <input type="hidden" name="Screenshot3" value="image3.gif">
    <input type="hidden" name="Screenshot4" value="image4.gif">

    Die DB-Tabelle sieht so aus:

    PictureID INT/auto increment
    Screenshot1 Text

    Er soll jetzt checken, dass er drei Tabellenspalten zu wenig hat (Screenshot2, Screenshot3, Screenshot4) und die entsprechend den hidden fields anlegen und das INSERT vervollständigen.

    PHP-Code:

    $editFormAction 
    $_SERVER['PHP_SELF'];
    if (isset(
    $_SERVER['QUERY_STRING'])) {
      
    $editFormAction .= "?" htmlentities($_SERVER['QUERY_STRING']);
    }

    if ((isset(
    $_POST["MM_insert"])) && ($_POST["MM_insert"] == "ScreenshotsUpload")) {
      
    $insertSQL sprintf("INSERT INTO pictures (Screenshot1) VALUES (%s)",
                           
    GetSQLValueString($_POST['Screenshot1'], "text"));

      
    mysql_select_db($database_connGreen$connGreen);
      
    $Result1 mysql_query($insertSQL$connGreen) or die(mysql_error());

      
    $insertGoTo "success.php?ID=".mysql_insert_id();
      if (isset(
    $_SERVER['QUERY_STRING'])) {
        
    $insertGoTo .= (strpos($insertGoTo'?')) ? "&" "?";
        
    $insertGoTo .= $_SERVER['QUERY_STRING'];
      }
      
    header(sprintf("Location: %s"$insertGoTo));

    So sieht meine INSERT-Anweisung derzeit aus - es fehlt wahrscheinlich das entscheidende IF mit einer UPDATE-Anweisung...

    Bin für jede Hilfe dankbar, thx, mil

  • #2
    Habe den Code nicht gelesen, aber dein DB-Design ist der Grund für dein Problem! Stichwort Normalisierung.

    Wenn ein User 4 Bilder hochlädt, dann hat die Tabelle nicht drei Spalten zu wenig. Du mußt einfach vier Datensätze daraus machen, also INSERT mit vier VALUES().

    Kommentar


    • #3
      Versteh ich leider nicht - wie soll denn deiner Meinaung nach der fertige Eintrag in der DB aussehen: so vielleicht:

      PictureID GameID Screenshot

      1 5 image1.gif
      2 5 image2.gif
      3 5 image3.gif

      ....

      ??? Thx, mil

      Kommentar


      • #4
        Genau!

        Kommentar


        • #5
          Dann schick ich die INSERT Anweisung in eine Schleife ?

          Kommentar


          • #6
            noch ne Frage, wo ich dich gerade erwische, hab gerade nen ziemliches Brett vorm Kopf - geht um den Geltungsbereich von Variablen.

            Nimm mal Beispiel foreach. Lässt nen Zähler mitlaufen $i++. Vor die Schleife setzt ich ne zweite Variable um den letzten Wert des Zählers zu bekommen $Last = $i;

            Wie kann ich jetzt mit $Last ausserhalb dieser Funktion arbeiten - wie krieg ich die da raus - Session will er nicht, Cookie will er nicht - in allen Büchern und Beiträgen, die ich lese steht klar immer echo oder print , aber das bringt mir ja nix, weil ich die Variablen halt übergeben will... an ne andere Funktion oder ganz verrückt an eine andere Seite...

            vielleicht bin ich auch zu blöd... bei ASP kannst du Sessions von Variablen erstellen wann immer du willst, PHP haut mir ständig diese header Fehlermeldung um die Ohren...

            Beispiel:

            PHP-Code:
            $z=0;
                                    
            foreach(
            $get_folder as $item) {
                                    
            $Last=$i;

            if (
            $z%3==0) echo '<tr>';
            if (
            $z%3!=3) echo '<td width="193"><img src="'.$folder.'/'.$item.'"><br /><span class="Grey10px">'.$item.'</span>
                          <input name="S60Screenshot'
            .$i.'" type="hidden" value="S60/'.$item.'"></td>';
            if (
            $z%3==2) echo '</tr><tr><td><img src="../images/blank_transparent.gif" width="1" height="10" /></td></tr>';
            if (
            $z%3==3) echo '<br />',"\n";

            $z++; 

            Kommentar


            • #7
              Das hat mit foreach nichts zu tun. Das einzige was zählt sind - wie die Fehlermeldung schon sagt - ob die Header bereits gesendet wurden.

              Du kannst nicht mitten in der Ausgabe noch einen Cookie setzen wollen (oder eine Session starten, da wird auch ein Cookie gesetzt), denn ein Cookie wird in den HTTP-Headern geschickt und die sind schon gesendet, sobald du irgendwo etwas ausgibst.

              Aber PHP kann die Ausgabe auch erstmal zwischenspeichern, du kannst das gewünschte Verhalten also mit eingebauten Methoden erreichen. Schau dir mal http://php.net/manual/en/ref.outcontrol.php an!

              Kommentar


              • #8
                danke für den Tip, wusste auch nicht, dass ich jedesmal erst nen

                PHP-Code:
                <?php
                session_start
                ();
                ?>
                reinknallen musse, weil die Servereinstellungen anscheinend nicht auf auto stehen...

                Nochmal eine Frage zu der Schleife in der INSERT -Anweisung. Datenbank steht jetzt wie besprochen - "normalisiert".

                PictureID GameID Screenshot

                1 5 image1.gif
                2 5 image2.gif
                3 5 image3.gif

                Meine Idee für die Schleife wäre jetzt folgende:

                PHP-Code:
                $insertSQL "INSERT INTO pictures (Screenshot) VALUES";

                $rows=7;
                for(
                $z 0$z <= $rows$z++) {
                $insertSQL .=" ('".$_POST['Screenshot'][$z]."')"// Die hiddenFields heissen Screenshot1, Screenshot2

                funzt aber noch nicht, krieg folgende Fehlermeldung:

                You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '('') ('') ('') ('') ('') ('') ('')' at line 1

                bin gerade nen bisserl ratlos...

                Kommentar


                • #9
                  Korrekte Syntax mit Kommas:
                  INSERT INTO pictures (Screenshot)
                  VALUES ('xxx'),
                  VALUES ('yyy'),
                  VALUES ('zzz')
                  PHP-Code:
                  $sql "INSERT INTO pictures (Screenshot) ";
                  foreach (
                  $_POST['Screenshot'] as $scr) {
                      
                  $sql .= 'VALUES ('.mysql_real_escape_string($scr).'), ';
                  }
                  $sql substr($sql0, -2);  // letztes Komma und Leerzeichen weg 

                  Kommentar

                  Lädt...
                  X