Martin: PERL->PHP->MySQL - Daten gehen unterwegs verloren

Laut MySQL Reference Manual fasst ein TEXT-Feld 2^16+2=65538 bytes. Tatsächlich kommen aber in der Datenbank nur ca. 5 kb an.

Der Vorgang ist folgender:

In ein sehr umfangreiches Formular werden verschiedene Angaben zu einem Druckauftrag eingegeben. Gleichzeitig mit diesen Angaben müssen auch große Bilddateien hochgeladen werden. Da PHP eine Beschränkung von 2 MB für den Dateiupload hat, die Bilddaten aber oft größer sind, habe ich ein PERL-Script adaptiert, das diesen Dateiupload bewältigt. Alle Daten werden also zuerst an das PERL-Script geschickt. Dieses legt die hochgeladenen Bilddateien im passenden Ordner ab und schickt alle übrigen Daten weiter an ein PHP-Script, das sie in die Datenbank einträgt. Und zwar generiert das PERL-Script eine HTML-Seite mit einem Formular und schreibt jede Variable, die es erhalten hat (außer den hochgeladenen FILES), nachdem es sie base64-codiert in ein <input type="hidden">. Das PHP-Script trägt, wie gesagt, die Daten in die Datenbank ein. Das ursprüngliche Formular enthält zwei <textarea> Eingabefelder, in die manchmal sehr viel Text eingegeben wird. Dieser Text ist es, der nicht vollständig in der Datenbank ankommt. Hat jemand eine Idee, wo der Engpass liegen könnte?

Ich kann gerne die Scripts, die allerdings sehr umfangreich sind, hier hereinstellen.

  1. Hi,

    in die manchmal sehr viel Text eingegeben wird. Dieser Text ist es, der nicht vollständig in der Datenbank ankommt. Hat jemand eine Idee, wo der Engpass liegen könnte?

    Welcher Art sind denn die Spalten? TEXT kann ja nur 65565 Zeichen, wenn dein text länger ist, ist klar, wo der verloren geht.

    Allerdings wäre etwas relevanter(!) Code durchaus sinnvoll

    1. TEXT kann ja nur 65565 Zeichen, wenn dein text länger ist, ist klar, wo der verloren geht.

      Tja, aber das sind doch eben 63 kb, und ankommen tun nur ca. 5kb.

      Allerdings wäre etwas relevanter(!) Code durchaus sinnvoll.

      Na gut, hier ist der relevante Teil vom PERL-Script:

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

      PRINT SUCCESS PAGE

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

      &PrintHead;

      if($FORM{'destnScript'}){
         $action = "$FORM{'destnScript'}"
        }

      else{
         $action = $ENV{HTTP_REFERER};
        }

      print qq~
        <form action="$action" method="post" name = "form1">
        <table align="center" width="500">
        <tr>
        <td><font face="Arial" size="2">The following files were successfully uploaded to<br>$dir: <br>
        If you see this for more than 10 seconds please press Submit.
        <p>
        ~;
        $i = 0;# M
        foreach(@success){
         $success[$i][1] = encode_base64($success[$i][1]); #M
         print qq~
         <input type=text name=$success[$i][0] value=$success[$i][1]><br>~; # M
         $i++; # M
        }

      print "<input type=submit name=Submit value=Submit><br>";

      while (($key, $value) = each(%passOnVariables)) {
          $value = encode_base64($value);
          print "<input type=hidden name=$key value='$value'><br>\n";
        }

      if($fileExists){
         $fileExists = encode_base64($fileExists);
         print "<input type=hidden name=fileExists value='$fileExists'>"
        }

      print qq~
        <input type="hidden" name="Submit" value="Submit">
        </font></td>
        </tr>
        </table>
        </form>
        <script type="text/javascript" language="Javascript">
        <!--
          document.form1.submit();
        -->
        </script>

      <br>~;

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

      /PRINT SUCCESS PAGE

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

      Und das PHP-Script macht eigentlich nur:

      if($update == "new"){
        $sql="INSERT INTO $table SET
        timestamp = NOW()
        ,enterdate = '$enteryear-$entermonth-$enterday $enterhour:$enterminute:00'
        ,jobauthor = '$jobauthor'
        ,jobname = '$jobname'
        ,type = '$type'
        ,size = '$size'
        ,quantity = '$quantity'
        ,eventlocation = '$eventlocation'
        ,eventdate = '$eventyear-$eventmonth-$eventday $eventhour:$eventminute:00'
        ,eventtitle = '$eventtitle'
        ,eventtheme = '$eventtheme'
        ,contentinfo = '$contentinfo'
        ,specialinfo = '$specialinfo'
        ,sponsors = '$sponsors'
        ,logos = '$logos'
        ,typeofprinting = '$typeofprinting'
        ,sides = '$sides'
        ,finishing = '$finishing'
        ,finishprintsize = '$finishprintsize'
        ,submitdate = '$submityear-$submitmonth-$submitday'
        ,proofdate = '$proofyear-$proofmonth-$proofday'
        ,duedate = '$dueyear-$duemonth-$dueday'
        ,receiveddate = '$receivedyear-$receivedmonth-$receivedday'
        ,status = '$status'
        ,filenamefront = '$FILE0'
        ,filenameback = '$FILE1'
        ,notes = '$notes'
        ,revision = '$revision'
        ,notified = '$notified'
        ,firstnameother = '$firstnameother'
        ,lastnameother = '$lastnameother'
        ,emailother = '$emailother'
        ";
        mysql_query($sql) or die("3rd query failed :".mysql_error());
       }

      wobei $contentinfo und $specialinfo die Variablen sind, die nicht vollständig ankommen.

      Gruß und Dank

      Martin

      1. Ergänzung:

        Ich habe versucht, das Feld auf MEDIUMTEXT zu setzen, aber das hat erwartungsgemäßt nichts geändert, der Engpass muss irgendwo anders sein.

        Martin

      2. Ich seh jetzt nicht wirklich, wo im PERL-Script die Daten bearbeitet werden, die im PHP nicht richtig ankommen.

        Aber hast du schonmal geprüft, ob die Ausgabe des PERL-Scripts noch den kompletten Text enthält? Dann weisst du schonmal, obs im PERL- oder PHP-Script fehlt.