作者 主題: [問題]PHP function內如果有HTML的表單物件,該物件是否無法被別的function所呼叫  (閱讀 6813 次)

0 會員 與 1 訪客 正在閱讀本文。

熱血阿益

  • 可愛的小學生
  • *
  • 文章數: 6
    • 檢視個人資料
    • http://goodjoy1003.homedns.org
HI各位前輩:
光看標題可能還不夠清楚,所以我寫的詳細一點
我的問題如下
在同一個檔案內a.php內有許2個function
function a() & function b()
function a() 會產生HTML 表單物件
代碼: [選擇]
<select name="f_s1"></select>
function b() 會連結資料庫然後從 function a()所產生的 HTML 表單物件 $_POST['f_s1'] 抓取資料及寫到資料庫裡
但是我發現當 function b() 在抓取該 HTML 表單物件 $_POST['f_s1'] 的值是抓不到的
因此我想 $_POST['f_s1'] 也是屬於 function a()內的區域變數所以只能在 function a()內應用。
這問題勞煩各位前輩幫我解答一下了
謝謝...

熱血阿益

  • 可愛的小學生
  • *
  • 文章數: 6
    • 檢視個人資料
    • http://goodjoy1003.homedns.org
我的程式碼如下
« 回覆 #1 於: 2006-09-06 14:13 »
代碼: [選擇]

<?
//filename:r_parts_info_form2.php
require_once("./conf/db_conf.php");
require_once("./conf/func.php");
if(isYou()==FALSE)
{header("Location: http://".$_SERVER['HTTP_HOST']."/RMA/error.php?e002=ture");  //帶到別頁的標準用法
}

if(isset($_POST['Reset'])){r_parts_Main_func("reset",isYou()); }
if(isset($_POST['modify'])){r_parts_Main_func("modify",isYou()); }
if(isset($_POST['submit'])){r_parts_Main_func("submit",isYou()); }
if(isset($_GET['del'])) {r_parts_Main_func("del",isYou()); }
function createTableView($isyou)
{
    if($isyou==true)
    {
        $q_parts = new DB('localhost', 'rmadb', '', 'RMA');
        $query_string = "select r_cus_name, r_cus_mod_model_name,r_par_parts_no,r_par_description,r_cus_mod_sn ".
                        "from r_customer_file join r_customer_model_file on r_cus_sn = r_cus_mod_cus_sn ".
                        "join r_parts_file on r_cus_mod_sn = r_par_cus_mod_sn ".
                        "where r_cus_show = \"1\" AND r_cus_mod_show = \"1\" AND r_par_show = \"1\" ".
                        "ORDER BY r_par_c_date DESC ";
        if(!$q_parts->open()){ die($q_parts->error()); }
        if(!$q_parts->query($query_string)){ die($q_parts->error()); }
        printf("<table align=\"center\" border=\"1\">");
        printf("<tr><th>Customer Name</th><th>Model Name</th><th>Parts N.O.</th><th>Parts Description</th><th>Function</th></tr>");
        while ($row = $q_parts->fetchArray())
        {
            printf("<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>".
                "<a href=%s?model_name=%s&parts_no=%s&r_cus_mod_sn=%s&del=1>DEL</a> | ".
                "<a href=%s?model_name=%s&parts_no=%s&r_cus_mod_sn=%s&mdf=1>Modify</a>".
                "</td></tr>\n",$row['0'],$row['1'],$row['2'],$row['3'],$PHP_SELF,$row['1'],$row['2'],$row['4'],  $PHP_SELF,$row['1'],$row['2'],$row['4']);
        }
        printf("</table>");
    }
}
function r_parts_Main_func($func,$isyou)
{
    if($isyou==true){
        switch($func){
            case "submit":
                $sql_inst= "insert into `r_parts_file` (`r_par_cus_mod_sn`,`r_par_model_name`,`r_par_parts_no`,`r_par_description`,`r_par_show`,`r_par_c_date`) ".
                "values ('".$_POST['r_cus_mod_sn']."','".$_POST['model_name']."','".$_POST['parts_no']."','".$_POST['parts_description']."','1',now())";
                $inst_parts = new DB('localhost', 'rmadb', '', 'RMA');
                printf("%s",$sql_inst);
                if(!$inst_parts->open()){ die($inst_parts->error()); }
                if(!$inst_parts->query($sql_inst)){ die($inst_parts->error()); }
                $inst_parts->freeResult();
                $inst_parts->close();
                //header("Location: http://".$HTTP_HOST.$PHP_SELF);  //帶到別頁的標準用法
                break;
            case "modify":
                $sql_mdf = "update `r_parts_file`".
                           "set `r_par_description`='".$_POST['parts_description']."',`r_par_model_name`='".$_POST['model_name']."',".
                           "r_par_cus_mod_sn='".$_POST['r_cus_mod_sn']."',r_par_parts_no='".$_POST['parts_no']."' ".
                           "where `r_par_parts_no`='".$_GET['parts_no']."' AND r_par_model_name='".$_GET['model_name']."' AND r_par_cus_mod_sn='".$_GET['r_cus_mod_sn']."'";
                printf("%s",$sql_mdf);
                /*$q2_parts = new DB('localhost', 'rmadb', '', 'RMA');
                if(!$q2_parts->open()){ die($q2_parts->error()); }
                if(!$q2_parts->query($sql_mdf)){ die($q2_parts->error()); }
                header("Location: http://".$HTTP_HOST.$PHP_SELF); //帶到別頁的標準用法*/                
                break;
            case "reset":
                header("Location: http://".$HTTP_HOST.$PHP_SELF);
                break;
            case "del":
                $sql_del= "update `r_parts_file`".
                          "set `r_par_show`='0'".
                          "where `r_par_parts_no`='".$_GET['parts_no']."' AND r_par_model_name='".$GET['model_name']."' AND r_par_cus_mod_sn='".$_GET['r_cus_mod_sn']."'";
                //printf("%s",$sql_del);
                $del_parts= new DB('localhost', 'rmadb', '', 'RMA');
                if(!$del_parts->open()){ die($del_parts->error()); }
                if(!$del_parts->query($sql_del)){ die($del_parts->error()); }
                $del_parts->freeResult();
                $del_parts->close();
                //printf("del=%s",$del);
                header("Location: http://".$HTTP_HOST.$PHP_SELF);  //帶到別頁的標準用法
                break;
            default:
                header("Location: http://".$HTTP_HOST.$PHP_SELF);
        }
    }else{
        header("Location: http://".$_SERVER['HTTP_HOST']."/RMA/error.php?e002=ture");  //帶到別頁的標準用法
    }
}
function ItemModelname($status)
{
    $q_model_name = new DB('localhost', 'rmadb', '', 'RMA');
    $query_string2 = "select r_cus_mod_sn,r_cus_name,r_cus_mod_model_name ".
                     "from r_customer_file join r_customer_model_file ".
                     "on r_cus_sn = r_cus_mod_cus_sn ".
                     "where r_cus_show =\"1\" AND r_cus_mod_show =\"1\";";
    if(!$q_model_name->open()){ die($q_model_name->error());}
    if(!$q_model_name->query($query_string2)){ die($q_model_name->error()); }
    switch ($status){
        case "mdf":
            printf("<select name='model_name' onchange=\"changeC_SN(this.form)\" disabled=\"true\">");
            printf("<option value='%s' selected>%s</option>",$_GET['model_name'],$_GET['model_name']);
            while ($row1 = $q_model_name->fetchArray())
            {
                printf("<option value=%s>%s-%s</option>",$row1['2'],$row1['1'],$row1['2']);
            }
            printf("</select>");
            printf("<input type=\"hidden\" name=\"r_cus_mod_sn\" value=\"%s\">\n",$_GET['r_cus_mod_sn']);
            $q_model_name->freeResult();
            $q_model_name->close();
            break;
        case "nor":
            printf("<select name='model_name' onchange=\"changeC_SN(this.form)\">");
            printf("<option value=\"-1\">---Select One Pls---</option>");
            while ($row1 = $q_model_name->fetchArray())
            {
                printf("<option value=%s>%s-%s</option>",$row1['2'],$row1['1'],$row1['2']);
            }
            printf("</select>");
            printf("<input type=\"hidden\" name=\"r_cus_mod_sn\">\n");
            $q_model_name->freeResult();
            $q_model_name->close();            
            break;
        default:
            printf("<select name='model_name' onchange=\"changeC_SN(this.form)\">");
            printf("<option value=\"-1\">---Select One Pls---</option>");
            while ($row1 = $q_model_name->fetchArray())
            {
                printf("<option value=%s>%s-%s</option>",$row1['2'],$row1['1'],$row1['2']);
            }
            printf("</select>");
            printf("<input type=\"text\" name=\"r_cus_mod_sn\">\n");
            $q_model_name->freeResult();
            $q_model_name->close();            
    }
}

function ItemPartsdescription($status)
{
    $sql_mdf = "SELECT `r_par_parts_no`,`r_par_description`".
               "FROM `r_parts_file`".
               "WHERE `r_par_show`='1' AND `r_par_parts_no`='".$_GET['parts_no']."';";
$q2_parts = new DB('localhost', 'rmadb', '', 'RMA');
if(!$q2_parts->open()){ die($q2_parts->error()); }
if(!$q2_parts->query($sql_mdf)){ die($q2_parts->error()); }
switch($status){
  case "mdf":
      $row2=$q2_parts->fetchAssoc();
      printf("<textarea name='parts_description' cols='15' rows='4'>%s</textarea>",$row2['r_par_description']);
      $q2_parts->freeResult();
      $q2_parts->close();
      break;
  case "nor":
      printf("<textarea name='parts_description' cols='15' rows='4'></textarea>");
      break;
  default:
      printf("<textarea name='parts_description' cols='15' rows='4'></textarea>");
}
}

function jsArray()
{
    $q_model_name = new DB('localhost', 'rmadb', '', 'RMA');
    $query_string2 = "select r_cus_mod_sn,r_cus_name,r_cus_mod_model_name ".
                     "from r_customer_file join r_customer_model_file ".
                     "on r_cus_sn = r_cus_mod_cus_sn ".
                     "where r_cus_show =\"1\" AND r_cus_mod_show =\"1\";";
    if(!$q_model_name->open()){ die($q_model_name->error());}
    if(!$q_model_name->query($query_string2)){ die($q_model_name->error()); }
    $i=0;
    while ($row = $q_model_name->fetchArray())
    {
        printf("\ttmpA%s= new Array(\"%s\",\"%s\",\"%s\")\n",$i,$row['0'],$row['1'],$row['2']);
        $i++;
    }
    $j=1+$i;
    $q_model_name->freeResult();
    $q_model_name->close();
    printf("function changeC_SN(fObj)\n");
    printf("{\n");
    for($k=0;$k<$i;$k++)
    {
        printf("\tif(fObj.model_name.options[%s].selected){fObj.cus_sn.value=tmpA%s[0];}\n",$k+1,$k);
    }
    printf("}\n");
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=big5" />
<title>無標題文件</title>
<script type="text/javascript">
<!--
<? jsArray(); ?>
//-->
</script>
</head>
<body>
<div align="center">
<form action="<?php echo&#40;$PHP_SELF&#41;?>" method="post" name="form1">
<table border="1" align="center">
    <tr>
        <td colspan="2">
            <div align="center">
                <?php if&#40;isset&#40;$mdf&#41; AND $mdf=1&#41;&#123; echo "Modify Record";&#125;else&#123; echo "Add New Record";&#125;?>
            </div>
        </td>
    </tr>
    <tr>
        <td>Model Name</td>
        <td>
        <?
            if(isset($mdf) AND $mdf="1")
            {
                ItemModelname("mdf");
            }else{
                ItemModelname("nor");
            }
        ?>
        </td>
    </tr>
    <tr>
        <td>Parts N.O.</td>
        <td>
        <?
            if(isset($mdf) AND $mdf="1")
            {
                printf("<input name='parts_no' type='text' value='%s' readonly='true'>",$_GET['parts_no']);
            }else{
                printf("<input name='parts_no' type='text'>");
            }
        ?>
        </td>
    </tr>
    <tr>
        <td>Parts Description</td>
        <td>
        <?
            if(isset($_GET['mdf']) AND $_GET['mdf']="1")
            {
                ItemPartsdescription("mdf");
            }else{
                ItemPartsdescription("nor");
            }
        ?>
        </td>
    </tr>
    <tr>
        <td colspan="2">
        <div align="right">
        <?
        if(isset($_GET['mdf']) AND $_GET['mdf']="1"){
            printf("<input name='modify' type='submit' value='Modify' />");
        }else{
            printf("<input name='submit' type='submit' value='Submit' />");
        }
        ?>
        <input name='Reset' type='submit' value='Reset' />
        </div>
        </td>
    </tr>
</table>
</form>
<? createTableView(isYou()); ?>
</div>
</body>
</html>

Darkhero

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3728
  • 性別: 男
    • 檢視個人資料
    • ㄚ凱隨手紀
引述: "熱血阿益"
HI各位前輩:
光看標題可能還不夠清楚,所以我寫的詳細一點
我的問題如下
在同一個檔案內a.php內有許2個function
function a() & function b()
function a() 會產生HTML 表單物件
代碼: [選擇]
<select name="f_s1"></select>
function b() 會連結資料庫然後從 function a()所產生的 HTML 表單物件 $_POST['f_s1'] 抓取資料及寫到資料庫裡
但是我發現當 function b() 在抓取該 HTML 表單物件 $_POST['f_s1'] 的值是抓不到的
因此我想 $_POST['f_s1'] 也是屬於 function a()內的區域變數所以只能在 function a()內應用。
這問題勞煩各位前輩幫我解答一下了
謝謝...


$_POST 是超全域變數,不會受到 function 的變數範圍影響。

或許是你沒搞清楚 Client 跟 Server 還有 php 程式的生命週期吧...

function b 應該是在 form submit 之後才去執行的,這樣才會正確取得 HTML form 送過來的 POST.
希望我們的討論是為了把問題解決,而不是爭論誰對誰錯.
『灌水才是重點,發文只是順便』
『我寧可讓不會釣魚的工程師餓死,也不想讓會餓死的工程師去攪沉公司....』
Blog: http://blog.darkhero.net/
秘密基地: http://www.darkhero.net/comic/
目前服務的網站: http://www.libook.com.tw/

熱血阿益

  • 可愛的小學生
  • *
  • 文章數: 6
    • 檢視個人資料
    • http://goodjoy1003.homedns.org
引述: "Darkhero"
引述: "熱血阿益"
HI各位前輩:
光看標題可能還不夠清楚,所以我寫的詳細一點
我的問題如下
在同一個檔案內a.php內有許2個function
function a() & function b()
function a() 會產生HTML 表單物件
代碼: [選擇]
<select name="f_s1"></select>
function b() 會連結資料庫然後從 function a()所產生的 HTML 表單物件 $_POST['f_s1'] 抓取資料及寫到資料庫裡
但是我發現當 function b() 在抓取該 HTML 表單物件 $_POST['f_s1'] 的值是抓不到的
因此我想 $_POST['f_s1'] 也是屬於 function a()內的區域變數所以只能在 function a()內應用。
這問題勞煩各位前輩幫我解答一下了
謝謝...


$_POST 是超全域變數,不會受到 function 的變數範圍影響。

或許是你沒搞清楚 Client 跟 Server 還有 php 程式的生命週期吧...

function b 應該是在 form submit 之後才去執行的,這樣才會正確取得 HTML form 送過來的 POST.


Hi Darkhero 前輩:
function b 是由HTML form 送出後呼叫的但是,怪的是function b卻還是無法抓取到
function a 所產生的 HTML form物件,
因此剛剛我有想到...會不會是各個function區塊擺放位置的關係...
有這個可能嗎?...或是有別的可能
(不好意思好像有點問的沒頭沒腦)

ricky

  • 區域板主
  • 鑽研的研究生
  • *****
  • 文章數: 669
    • 檢視個人資料
    • Ricky 碎碎唸
換個角度說明一下好了
function a ->產生一個$_POST的變數
這邊的$_POST 是a產生的並不是client端透過POST傳送過來的Data
所以只會成為function a的local變數
如果你想要徹底解決掉你的問題
可以在function a ,function b的開頭加上global $_POST;
將$_POST宣告成global變數
避免local $_POST跟系統傳送過來的$_POST混在一起
我的symfony作品:YOMOpets 寵物誌
有興趣可以一起來討論symfony喔
我的部落格:http://ricky.ez2.us/

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
何不在程式碼開頭處, 或是 r_parts_Main_func() 將 $_POST dump 出來,

看看有什麼東西在裏頭..  :roll:

熱血阿益

  • 可愛的小學生
  • *
  • 文章數: 6
    • 檢視個人資料
    • http://goodjoy1003.homedns.org
Hi各位前輩:
小弟剛剛用了吃奶的力氣把問題找了出來了,經過整理的內容如下
    。沒把有問題的變數整理出來好好的比對一下
    。藉由foreach 將 $_POST & $_GET這一對令人又愛又恨的陣列DUMP出來後,發現$_GET會在 HTML FORM 送出後消失所以我才會那麼的苦惱 Orz
    。延續上一點 因為$_GET裡面有我 查詢 資料庫的條件所以缺一不可
    。可以在表單內新增<input type="hidden">來放$_GET的值問題就可以解決了

感謝各位前輩的指導,因為小弟最近才開始利用function來組成畫面,
所以越寫越上癮(function依賴病),因此對於這種挫折真的是很難接受
才會問的那麼沒頭沒腦,我想過不了多久開始利用Class來寫的時候
遇到的問題可能會更多吧,所以我還是要多K點書多寫一點CODE。
感謝各位前輩...

Darkhero

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3728
  • 性別: 男
    • 檢視個人資料
    • ㄚ凱隨手紀
用 function 組成 html 原則上是OK的,也很多人這樣作。

重點還是回歸在 POST GET FORM 的處理方式..
要在 POST 同時把原來的 GET 變數帶入,那你原來 Form 的 action 就不能用 $PHP_SELF ,而是應該用 $_SERVER["REQUEST_URI"] 才對...

所以囉..充分的練習,尤其是基本的GET POST HTML Form 的處理與應用,甚至是混合的情況使用都是很重要的唷..^_^..
希望我們的討論是為了把問題解決,而不是爭論誰對誰錯.
『灌水才是重點,發文只是順便』
『我寧可讓不會釣魚的工程師餓死,也不想讓會餓死的工程師去攪沉公司....』
Blog: http://blog.darkhero.net/
秘密基地: http://www.darkhero.net/comic/
目前服務的網站: http://www.libook.com.tw/