顯示文章

這裡允許您檢視這個會員的所有文章。請注意, 您只能看見您有權限閱讀的文章。


文章 - supermico

頁: [1]
1
barcode查價程式, 每次掃完條碼, 新輸入的商品都是顯示在最後1行, 量多的話在最下面很難看到. 請問要怎樣改為新的顯示在最上面一筆. 謝謝!

程式碼如下 :

<?
      // 若barcode有問題,則跳警告訊息
      // 邏輯:剛進來,不秀錯誤訊息
      // 在原本的form按enter,且 barcode變數為空 (可能為誤按enter) 則秀錯誤訊息
      // 在原本的form按enter,且 barcode變數無法找到對應商品(可能為掃錯條碼) 則秀錯誤訊息
      if (
            (
               (
                  $reenter
                  &&
                  $barcode == ''
                  // 從原程式按 enter,且為空白
               )
            )
            ||
            (
               (
                  $reenter
                  &&
                  count(get_sql("SELECT * FROM Products WHERE Barcode='$barcode'")) == 0
               ) // 找不到東西
            )
      ) {
         if ( ! isset($_REQUEST['cheat'])) {
            show_alert('No item found! Please ask store manager or check again. 條碼掃描錯誤,可能掃到非屬系統條碼,或為空白,請重新掃描');
         }
      }

      // 將 barcodes 統計成一個 'barcode' => 'amount' 的陣列
      // 例:
      // "4712257800116,4712257800116, 4712257800222"
      // 轉換成
      // Array (
      // 4712257800116,2
      // 4712257800222,1
      // )
      // 目的:計算每個商品的個數 (amount)
      //
      //
      $barcodes_ary = explode(',', $barcodes);
      $barcodes_hash = array ();
      foreach ($barcodes_ary as $b) {
         if (array_key_exists($b, $barcodes_hash)) {
            $barcodes_hash[$b] += 1;
         } else {
            $barcodes_hash[$b] = 1;
         }
      }
      // print_r($barcodes_hash);
      //
      //
      //

      if ($reenter == 0) {
         // 清掉 session 當中 amount 開頭的變數
         foreach ($_SESSION as $k => $v) {
            if (substr($k,0,6) == 'amount') {
               unset($_SESSION[$k]);
            }
         }
      }
      foreach ($barcodes_hash as $b => $amount) {
         if ($barcodes_ary == array(''))continue; // 第一次進入此程式:不理
         $ary = get_sql("SELECT * FROM Products WHERE Barcode='$b' Order by ProductName");
         // print_r($ary);
         if ( count($ary) == 0 ) {
            continue;
         } //  找不到對應的資料庫:不理
         $pid  = $ary[0]['ProductID'];
         $pn   = $ary[0]['ProductName'];
         $unit = $ary[0]['UnitID'];

         // 取得單位
         $ary2 = get_sql("SELECT UnitName FROM Units WHERE UnitID = '$unit'");
         $unit = $ary2[0]['UnitName'];

         // $price = $ary[0]['Price'];

?>
         <TR>
         <TD><? echo "$pn"; ?></TD>
         <TD>
            <INPUT TYPE=hidden NAME=productid<?=$pid?>        VALUE='<?=$pid?>'>
            <!-- <INPUT TYPE=text   NAME=amount<?=$pid?>    SIZE=3 VALUE='<?=$amount?>'> -->
<?
         // 製作下拉式選單。依據 config.inc 裡頭設定的變數決定下拉式的內容是一到多少。
         $candidates = array();
         for($i=1; $i <= DropDownMaxValue; $i++) {
            $candidates[]=$i;
         }
         // echo get_select("amount$pid", $candidates, $amount);




         $str = "<SELECT NAME='amount$pid' onchange='transfer(\"amount$pid\", document.form1.amount$pid.value)'>\n";

         $has_requested_option = false;
         $str2 = '';
         foreach ($candidates as $c) {
            if (isset($_REQUEST["amount${pid}option$c"])) {
               $if_selected = 'SELECTED';
               $has_requested_option = true;
               $_SESSION["amount$pid"] = $c;

               $price = get_range_price($pid, $c);// 既然取得了 amount ,就可以推出 price 來

            } else {
               $if_selected = '';
            }
            $str2 .= "<OPTION VALUE='$c' $if_selected> $c\n";
         }

         if (! $has_requested_option) {
            // 再繞一遍,看能不能對到先前留下來的 session 值
            $str2 = '';
            foreach ($candidates as $c) {
               if (isset($_SESSION["amount$pid"]) && $_SESSION["amount$pid"] == $c) {
                  $if_selected = 'SELECTED';
                  $_SESSION["amount$pid"] = $c;

                  $price = get_range_price($pid, $c);// 既然取得了 amount ,就可以推出 price 來

               } else {
                  $if_selected = '';
               }
               $str2 .= "<OPTION VALUE='$c' $if_selected> $c\n";
            }
         }

         $price = isset($price) ? $price : get_range_price($pid, 1); // 剛近來時

         $str2 .= "</SELECT>\n";
         $str .= $str2;
         echo $str;

?>
         </TD>
         <!-- <TD><?=$amount?></TD> -->
         <TD><?=$unit  ?></TD>
         <TD><?=$price; ?></TD>

         <? unset($price); ?>

         </TR>
<?              } ?>

2
web就是 php+mysql
放的是商品資料.

除了精簡kernel的device外,對網路流量與記憶體控制,
freebsd的kernel應該還有調整的空間吧?
但似乎都找不到這樣的討論與文獻.


引述: "hoyo"
頻寬加大、靜態網頁 html、標準的程式、資料庫設計、安全防護

比你調那兩個或更多參數有用多了,不過

高效率的 cpu、高轉速的硬碟、server 網路卡

可能比以上還關鍵,重點是

你的 web 裝什麼東東

3
想當web server , kernel想重編 , 怎麼設定參數 , 系統會跑比較快?
如 :
options CHILD_MAX=?
options "MAXMEM=(1280*1024)"

可以請有經驗的專家 , 指導我們一下該設定那些參數嗎 ?
謝謝.

4
為何我怎麼執行都會出現:
Parse error: parse error, unexpected '=' in /home/www/monitor.php on line 13

引述: "騎老鼠上班"
感謝twu2學長的提醒,沒辦法在指令列下執行,的確只能用wget的方式。
在沒有找到方法前,小弟先整理好這個php檔,架個apache,先用wget執行了,
希望未來有可以直接下php指令的方式。

monitor.php的內容:
代碼: [選擇]
<?
$terminal="192.168.1.23";
$web2="192.168.1.11";
$sql="192.168.1.7";
$mail="192.168.1.8";
$web1="10.0.0.3";

$web=80;
$ftp=21;
$pop3=110;
$smtp=25;
$sql=1433;
$term=3389;

$fp[0] = fsockopen($terminal, $term);
$fp[1] = fsockopen($web1, $web);
$fp[2] = fsockopen($web1, $ftp);
$fp[3] = fsockopen($web2, $web);
$fp[4] = fsockopen($sql, $sql);
$fp[5] = fsockopen($mail, $pop3);
$fp[6] = fsockopen($mail, $smtp);

$message1[0]="Terminal_Service_Fail!";
$message1[1]="web1_WEB_Fail!";
$message1[2]="web1_FTP_Fail!";
$message1[3]="web2_WEB_Fail!";
$message1[4]="SQL_MS-SQL_Fail!";
$message1[5]="Mail_POP3_Fail!";
$message1[6]="Mail_SMTP_Fail!";

$message2[0]="Terminal_Service_Live!";
$message2[1]="web1_WEB_Live!";
$message2[2]="web1_FTP_Live!";
$message2[3]="web2_WEB_Live!";
$message2[4]="SQL_MS-SQL_Live!";
$message2[5]="Mail_POP3_Live!";
$message2[6]="Mail_SMTP_Live!";

$fop = fopen("$DOCUMENT_ROOT/db/monitor.log","r",1);
for ($i=0; $i<7; $i++) {
$chks[$i] = fgets($fop,50);
$no[$i] = intval(substr($chks[$i], 0, 6));
}

for ($i=0; $i<7; $i++) {
if(!$fp[$i]) {
  mail("我的email帳號", "$message1[$i]", "$message1[$i]", "From: monitor@mail\r\n"."X-Mailer: PHP/" . phpversion());
  $no[$i]++;
  if ($no[$i]==2) {
  $ch = curl_init();
  curl_setopt ($ch, CURLOPT_URL, "https://webtoair.hinet.net/cgi-bin/send.pl?id=HINET帳號&passwd=HINET密碼&tran_type=now&tel=手機號碼&message=$message1[$i]");
  curl_exec($ch);
  curl_close($ch);
  }
  $chks[$i] = substr("00000".$no[$i],-6).$message1[$i];
}
else {
  if ($no[$i]>1) {  
  mail("我的email帳號", "$message2[$i]", "$message2[$i]", "From: monitor@mail\r\n"."X-Mailer: PHP/" . phpversion());
  $ch = curl_init();
  curl_setopt ($ch, CURLOPT_URL, "https://webtoair.hinet.net/cgi-bin/send.pl?id=HINET帳號&passwd=HINET密碼&tran_type=now&tel=手機號碼&message=$message2[$i]");
  curl_exec($ch);
  curl_close($ch);
  }
  $chks[$i] = "000000".$message2[$i];
}
}
  $fop = fopen("$DOCUMENT_ROOT/db/monitor.log","w+",1);
  $output="";
  for ($i=0; $i<7; $i++) {
    $output = $output.$chks[$i]."\n";
  }
  fwrite($fop, $output);
?>

cron的內容:
代碼: [選擇]
*/5 * * * * wget --delete-after 192.168.1.150/monitor.php

monitor.log的內容:
代碼: [選擇]
000000Terminal_Service_Live!
000000web1_WEB_Live!
000000web1_FTP_Live!
000000web2_WEB_Live!
000000SQL_MS-SQL_Live!
000000Mail_POP3_Live!
000000Mail_SMTP_Live!


monitor.log表示目前的狀況,放在網站根目錄db目錄中,
假設web1_FTP有錯誤的話會變成這樣:
代碼: [選擇]
000000Terminal_Service_Live!
000000web1_WEB_Live!
000003web1_FTP_Fail!
000000web2_WEB_Live!
000000SQL_MS-SQL_Live!
000000Mail_POP3_Live!
000000Mail_SMTP_Live!

其中Fail的地方數字3表示連續3次偵測都是Fail

說明:
發生Fail後每五分鐘會收到message1的email Fail通知,
第二次Fail時才會發簡訊通知,因為偶爾server需要重新開機,
通常可在第二次偵測內完成,不會發簡訊,免得浪費錢。
第三次後每五分鐘發email Fail通知,不發簡訊。

第二次Fail之後只要回復正常後,就會發出message2的email Live通知,
並且發簡訊,然後把計數器歸零,不再做任何通知。

頁: [1]