基于 php 的 Web 表单中的自动数量增加

automatic number increase in php based web form

所以我创建了一个 html 表单,然后将结果发布到一个 php 文件,该文件将它们覆盖在 PDF 上,然后将该 PDF 通过电子邮件发送给我自己以及放在形式。我现在想做的就是找到一种简单的方法来制作它,以便 PDF 包含一个序列号。

例如:第一次填写表格时,PDF自动输入数字0001,第二次填写0002,依此类推。

是否有一个简单的 PHP 函数可以完成此操作?

基本上我正在创建一个在线发票表格,所以当我进行服务呼叫时,我可以从网络浏览器当场创建发票,然后通过电子邮件将其发送到我的办公室和客户。

如有任何帮助,我们将不胜感激。

对于递增的数字,您可以将一个数字保存在数据库中,然后提取它,将其加1,使用它,然后将其放回数据库中以供下次使用,但这看起来很复杂。评论中有人提到使用时间戳,这样做是这样的:

$invoicenumber = time(); //This number will always be unique

时间函数的工作原理如下(从 w3schools 复制):

The time() function returns the current time in the number of seconds since the Unix Epoch (January 1 1970 00:00:00 GMT). Since actual seconds can only go up (increment), this number will never be the same twice.

希望对您有所帮助。

-编辑

您还可以以可读的格式显示此 date/time:

$time = time();
echo date("Y-m-d H:i:s",$time);

-编辑 2

如果你想要一个递增的数字,你基本上需要一个非常简单的数据库来保存它,这可能就像一个名为发票的 table 一样简单,有一个名为发票编号的列,它将你的发票编号存储在它。您可以/可能也应该使用它来存储其他发票信息,这样您就可以保存每个发票号(这意味着我们只想获得最高的)

然后您的代码将如下所示,每次您要使用它时:

首先,您需要一个数据库信息文件(settings.php 或类似的文件),其中包含您的数据库定义,它可能如下所示:

define('DB_HOST', 'localhost');
define('DB_USER', 'db_username');
define('DB_PASS', 'db_password');
define('DB_NAME', 'database_name');

您的代码如下所示:

//Establish a mysql connection
$mysqli = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);

//Set up a query to get the highest number
$query = "SELECT invoicenumber FROM invoices ORDER BY invoicenumber DESC LIMIT 1";

//Get the result
$result = $mysqli->query($query);
$row = $result->fetch_assoc();

//If we have a record
if($row){
    //New invoice number
    $invoicenumber = $row['invoicenumber']++;
//Else (database is empty, so start at the beginning)
}else{
    $invoicenumber = 1;
}

//Now we have our invoice number, so do whatever you want with it
/**
 * Code here to use the number
 * */

//Now we wanna add the new invoice to the database, so
/**
 * Add any other info to this statement if you want.
 * If any of it is user submitted data, be sure to use prepared statements 
 * (just look at php.net's documentation on prepared statements)
 * w3schools also has some nice tutorials on how to safely insert stuff
 * in to a database, so check it all out :)
 * */
$query = "INSERT INTO invoices(invoicenumber) VALUES($invoicenumber)";

//Execute the query
if($mysqli->query($query)){
    //Show success
    echo "Invoice $invoicenumber has been added to the database.";
}else{
    //Show error
    echo "Unfortunately we could not add invoice $invoicenumber to the database.";
}

//Now we can clear up our resources
$stmt->free_result(); $stmt->close(); $mysqli->close();

请注意:这是一个非常基本的例子。如果您使用的是用户提交的数据,那么您的代码将会有附加功能和增强的安全性,因此请做好功课,并确保在继续使用之前完全理解此代码的每一行。

我对患者报告中的患者登录号做完全相同的事情。

include('/home/user/php/class.pdf2text.php');
$p2t = new PDF2Text();

$p2t->setFilename($pdf);
$p2t->decodePDF();
$data = $p2t->output();
$len = strlen($data);
$pos = strpos($data,$accession);

if (pos){
  $in .= "$accession,";
  $checked++;
}
else{
  $missingPDF += 1;echo "\n<p>&#x2002;<span class='bold red'>INCORRECT ACCESSION NUMBER c=$row[0] p=$row[1]</span>\n";
   }

if ($checked > 0){
  $in = substr($in,0,-1) . ')';
  $sql = "UPDATE `Patient` SET `PDF`=1 WHERE $in";
}

pdf2text.php

class PDF2Text {
  // Some settings
  var $multibyte = 4; // Use setUnicode(TRUE|FALSE)
  var $convertquotes = ENT_QUOTES; // ENT_COMPAT (double-quotes), ENT_QUOTES (Both), ENT_NOQUOTES (None)
  var $showprogress = true; // TRUE if you have problems with time-out
   // Variables
  var $filename = '';
  var $decodedtext = '';
   function setFilename($filename) {
    // Reset
    $this->decodedtext = '';
    $this->filename = $filename;
  }
   function output($echo = false) {
    if($echo) echo $this->decodedtext;
    else return $this->decodedtext;
  }
   function setUnicode($input) {
    // 4 for unicode. But 2 should work in most cases just fine
    if($input == true) $this->multibyte = 4;
    else $this->multibyte = 2;
  }
   function decodePDF() {
    // Read the data from pdf file
    $infile = @file_get_contents($this->filename, FILE_BINARY);
    if (empty($infile))
      return "";
     // Get all text data.
    $transformations = array();
    $texts = array();
     // Get the list of all objects.
    preg_match_all("#obj[\n|\r](.*)endobj[\n|\r]#ismU", $infile . "endobj\r", $objects);
    $objects = @$objects[1];
     // Select objects with streams.
    for ($i = 0; $i < count($objects); $i++) {
      $currentObject = $objects[$i];
       // Prevent time-out
      @set_time_limit ();
      if($this->showprogress) {
//            echo ". ";
        flush(); ob_flush();
      }
       // Check if an object includes data stream.
      if (preg_match("#stream[\n|\r](.*)endstream[\n|\r]#ismU", $currentObject . "endstream\r", $stream )) {
        $stream = ltrim($stream[1]);
        // Check object parameters and look for text data.
        $options = $this->getObjectOptions($currentObject);
         if (!(empty($options["Length1"]) && empty($options["Type"]) && empty($options["Subtype"])) )
//            if ( $options["Image"] && $options["Subtype"] )
//            if (!(empty($options["Length1"]) &&  empty($options["Subtype"])) )
          continue;
         // Hack, length doesnt always seem to be correct
        unset($options["Length"]);
         // So, we have text data. Decode it.
        $data = $this->getDecodedStream($stream, $options);
         if (strlen($data)) {
      if (preg_match_all("#BT[\n|\r](.*)ET[\n|\r]#ismU", $data . "ET\r", $textContainers)) {
            $textContainers = @$textContainers[1];
            $this->getDirtyTexts($texts, $textContainers);
          } else
            $this->getCharTransformations($transformations, $data);
        }
      }
    }
     // Analyze text blocks taking into account character transformations and return results.
    $this->decodedtext = $this->getTextUsingTransformations($texts, $transformations);
  }

   function decodeAsciiHex($input) {
    $output = "";
     $isOdd = true;
    $isComment = false;
     for($i = 0, $codeHigh = -1; $i < strlen($input) && $input[$i] != '>'; $i++) {
      $c = $input[$i];
       if($isComment) {
        if ($c == '\r' || $c == '\n')
          $isComment = false;
        continue;
      }
       switch($c) {
        case '[=11=]': case '\t': case '\r': case '\f': case '\n': case ' ': break;
        case '%':
          $isComment = true;
        break;
         default:
          $code = hexdec($c);
          if($code === 0 && $c != '0')
            return "";
           if($isOdd)
            $codeHigh = $code;
          else
            $output .= chr($codeHigh * 16 + $code);
           $isOdd = !$isOdd;
        break;
      }
    }
     if($input[$i] != '>')
      return "";
     if($isOdd)
      $output .= chr($codeHigh * 16);
     return $output;
  }
   function decodeAscii85($input) {
    $output = "";
     $isComment = false;
    $ords = array();
     for($i = 0, $state = 0; $i < strlen($input) && $input[$i] != '~'; $i++) {
      $c = $input[$i];
       if($isComment) {
        if ($c == '\r' || $c == '\n')
          $isComment = false;
        continue;
      }
       if ($c == '[=11=]' || $c == '\t' || $c == '\r' || $c == '\f' || $c == '\n' || $c == ' ')
        continue;
      if ($c == '%') {
        $isComment = true;
        continue;
      }
      if ($c == 'z' && $state === 0) {
        $output .= str_repeat(chr(0), 4);
        continue;
      }
      if ($c < '!' || $c > 'u')
        return "";
       $code = ord($input[$i]) & 0xff;
      $ords[$state++] = $code - ord('!');
       if ($state == 5) {
        $state = 0;
        for ($sum = 0, $j = 0; $j < 5; $j++)
          $sum = $sum * 85 + $ords[$j];
        for ($j = 3; $j >= 0; $j--)
          $output .= chr($sum >> ($j * 8));
      }
    }
    if ($state === 1)
      return "";
    elseif ($state > 1) {
      for ($i = 0, $sum = 0; $i < $state; $i++)
        $sum += ($ords[$i] + ($i == $state - 1)) * pow(85, 4 - $i);
      for ($i = 0; $i < $state - 1; $i++) {
        try {
          if(false == ($o = chr($sum >> ((3 - $i) * 8)))) {
            throw new Exception('Error');
          }
          $output .= $o;
        } catch (Exception $e) { /*Dont do anything*/ }
      }
    }
     return $output;
  }
   function decodeFlate($data) {
    return @gzuncompress($data);
  }
   function getObjectOptions($object) {
    $options = array();
     if (preg_match("#<<(.*)>>#ismU", $object, $options)) {
      $options = explode("/", $options[1]);
      @array_shift($options);
       $o = array();
      for ($j = 0; $j < @count($options); $j++) {
        $options[$j] = preg_replace("#\s+#", " ", trim($options[$j]));
        if (strpos($options[$j], " ") !== false) {
          $parts = explode(" ", $options[$j]);
          $o[$parts[0]] = $parts[1];
        } else
          $o[$options[$j]] = true;
      }
      $options = $o;
      unset($o);
    }
     return $options;
  }
   function getDecodedStream($stream, $options) {
    $data = "";
    if (empty($options["Filter"]))
      $data = $stream;
    else {
      $length = !empty($options["Length"]) ? $options["Length"] : strlen($stream);
      $_stream = substr($stream, 0, $length);
       foreach ($options as $key => $value) {
        if ($key == "ASCIIHexDecode")
          $_stream = $this->decodeAsciiHex($_stream);
        elseif ($key == "ASCII85Decode")
          $_stream = $this->decodeAscii85($_stream);
        elseif ($key == "FlateDecode")
          $_stream = $this->decodeFlate($_stream);
        elseif ($key == "Crypt") { // TO DO
        }
      }
      $data = $_stream;
    }
    return $data;
  }
   function getDirtyTexts(&$texts, $textContainers) {
    for ($j = 0; $j < count($textContainers); $j++) {
      if (preg_match_all("#\[(.*)\]\s*TJ[\n|\r]#ismU", $textContainers[$j], $parts))
        $texts = array_merge($texts, array(@implode('', $parts[1])));
      elseif (preg_match_all("#T[d|w|m|f]\s*(\(.*\))\s*Tj[\n|\r]#ismU", $textContainers[$j], $parts))
        $texts = array_merge($texts, array(@implode('', $parts[1])));
      elseif (preg_match_all("#T[d|w|m|f]\s*(\[.*\])\s*Tj[\n|\r]#ismU", $textContainers[$j], $parts))
        $texts = array_merge($texts, array(@implode('', $parts[1])));
    }
   }
   function getCharTransformations(&$transformations, $stream) {
    preg_match_all("#([0-9]+)\s+beginbfchar(.*)endbfchar#ismU", $stream, $chars, PREG_SET_ORDER);
    preg_match_all("#([0-9]+)\s+beginbfrange(.*)endbfrange#ismU", $stream, $ranges, PREG_SET_ORDER);
     for ($j = 0; $j < count($chars); $j++) {
      $count = $chars[$j][1];
      $current = explode("\n", trim($chars[$j][2]));
      for ($k = 0; $k < $count && $k < count($current); $k++) {
        if (preg_match("#<([0-9a-f]{2,4})>\s+<([0-9a-f]{4,512})>#is", trim($current[$k]), $map))
          $transformations[str_pad($map[1], 4, "0")] = $map[2];
      }
    }
    for ($j = 0; $j < count($ranges); $j++) {
      $count = $ranges[$j][1];
      $current = explode("\n", trim($ranges[$j][2]));
      for ($k = 0; $k < $count && $k < count($current); $k++) {
        if (preg_match("#<([0-9a-f]{4})>\s+<([0-9a-f]{4})>\s+<([0-9a-f]{4})>#is", trim($current[$k]), $map)) {
          $from = hexdec($map[1]);
          $to = hexdec($map[2]);
          $_from = hexdec($map[3]);
           for ($m = $from, $n = 0; $m <= $to; $m++, $n++)
            $transformations[sprintf("%04X", $m)] = sprintf("%04X", $_from + $n);
        } elseif (preg_match("#<([0-9a-f]{4})>\s+<([0-9a-f]{4})>\s+\[(.*)\]#ismU", trim($current[$k]), $map)) {
          $from = hexdec($map[1]);
          $to = hexdec($map[2]);
          $parts = preg_split("#\s+#", trim($map[3]));
           for ($m = $from, $n = 0; $m <= $to && $n < count($parts); $m++, $n++)
            $transformations[sprintf("%04X", $m)] = sprintf("%04X", hexdec($parts[$n]));
        }
      }
    }
  }
  function getTextUsingTransformations($texts, $transformations) {
    $document = "";
    for ($i = 0; $i < count($texts); $i++) {
      $isHex = false;
      $isPlain = false;
       $hex = "";
      $plain = "";
      for ($j = 0; $j < strlen($texts[$i]); $j++) {
        $c = $texts[$i][$j];
        switch($c) {
          case "<":
            $hex = "";
            $isHex = true;
      $isPlain = false;
          break;
          case ">":
            $hexs = str_split($hex, $this->multibyte); // 2 or 4 (UTF8 or ISO)
            for ($k = 0; $k < count($hexs); $k++) {
               $chex = str_pad($hexs[$k], 4, "0"); // Add tailing zero
              if (isset($transformations[$chex]))
                $chex = $transformations[$chex];
              $document .= html_entity_decode("&#x".$chex.";");
            }
            $isHex = false;
          break;
          case "(":
            $plain = "";
            $isPlain = true;
      $isHex = false;
          break;
          case ")":
            $document .= $plain;
            $isPlain = false;
          break;
          case "\":
            $c2 = $texts[$i][$j + 1];
            if (in_array($c2, array("\", "(", ")"))) $plain .= $c2;
            elseif ($c2 == "n") $plain .= '\n';
            elseif ($c2 == "r") $plain .= '\r';
            elseif ($c2 == "t") $plain .= '\t';
            elseif ($c2 == "b") $plain .= '\b';
            elseif ($c2 == "f") $plain .= '\f';
            elseif ($c2 >= '0' && $c2 <= '9') {
              $oct = preg_replace("#[^0-9]#", "", substr($texts[$i], $j + 1, 3));
              $j += strlen($oct) - 1;
              $plain .= html_entity_decode("&#".octdec($oct).";", $this->convertquotes);
            }
            $j++;
          break;
           default:
            if ($isHex)
              $hex .= $c;
            elseif ($isPlain)
              $plain .= $c;
          break;
        }
      }
      $document .= "\n";
    }
     return $document;
  }
}