【问题标题】:PHP : Variable does not show value in Function while shows directelyPHP:变量在函数中不显示值,而直接显示
【发布时间】:2015-04-21 10:01:46
【问题描述】:

我的代码有问题。我为addms.php 文件发布了一些字段数据。

  <form id="signup" Name="signup" method="post" action="addsms.php?act=add"> <h1>SMS Detail Here!</h1>
    User Refrence Code:<input name="rfcd" type ="text" class="a" id="rfcd" placeholder="Enter Refrence Code" /><br>
    Total SMS Count: &nbsp &nbsp <input name="smsc" type ="text" class="a" id="smsc" placeholder="Enter SMS Count" /><br>
            Total SMS Amount: <input name="amnt" type ="text" class="a" id="amnt" placeholder="Enter SMS Amount" /><br>

<input type ="submit" Name="submit"  value="Submit" class="outset" />
</form>

addsms.php

   <?php
 require_once("./include/connect.php");
 require_once("./include/fg_membersite.php");


 if($_GET['act'] == 'add')
{
$rf_cd = $_POST['rfcd'];
$sms_c = $_POST['smsc'];
$am_nt = $_POST['amnt'];


  // echo $rf_cd;
  // exit;
    //I can Get value of variable  "$rf_cd"  at above line. while not able to get value in any function,





if ($rf_cd == NULL || $sms_c == NULL || $am_nt == NULL  )
{
    header("Location:sms.php?field=miss");

}




    else
        if(checkref_id_from_user() == true && checkref_id_from_user_data() == true )
            {

                  $get_detail = "select total_sms, total_sms_amount from user_data where ref_id = '$rf_cd'";
                  $res1 = Run($get_detail);

                    if(mysql_num_rows($res1) > 0){
                    while ($rows = mysql_fetch_object($res1)) {
                    $srn++;
                    $sms_oldcont = $rows->total_sms;
                    $sms_amnt_oldcont = $rows->total_sms_amount;
                    }
                    }

                    $inqry = "UPDATE user_data SET total_sms = '$sms_c' + '$sms_oldcont', total_sms_amount ='$am_nt'+ '$sms_amnt_oldcont' where ref_id = '$rf_cd' ";
                    $resinqry = Run($inqry);
                    if(!$resinqry)
                    {
                        echo $resinqry;
                    }
                    else
                    {
                        header("Location:sms.php?add=done");
                    }


            }

        else 
        if(checkref_id_from_user() == true && checkref_id_from_user_data() == false)
            {
                $inqry = "Insert into user_data (ref_id,total_sms,total_sms_amount) VALUES('$rf_cd','$sms_c','$am_nt')";
                $resinqry = Run($inqry);
                if(!$resinqry)
                {
        echo $resinqry;
                }
                else
                {
        header("Location:sms.php?add=done");
                }
            }

         // if($result && mysql_num_rows($result) > 0 && )
        else
        {
            header("Location:sms.php?refid=notavailable");
        }
    }

    else 
    {
        echo 'oh';
        //header("Location:sms.php?refid=notavailable");
    }





  function checkref_id_from_user(){

        $qry = "select ref_id from user where ref_id='".$rf_cd."'";
        echo $qry;
        $result = Run($qry);
        echo $result;
        exit;
        if($result && mysql_num_rows($result) > 0)
                {
                    return true;
                }
                return false; 

    }

    function checkref_id_from_user_data()
    {

        $checkrefid = "select ref_id from user_data where ref_id = '$rf_cd'";
        $res = Run($checkrefid);
        if(mysql_num_rows($res) > 0)
        {
        return true;
        }
        return false;

    }




?>

我可以在 if 条件下的任何地方获取变量“$rf_cd”的值。虽然无法在任何函数中获取值,但“$rf_cd”我想在我的函数中使用此值从数据库中获取信息。

 $checkrefid = "select ref_id from user_data where ref_id = '$rf_cd'";
 echo  $checkrefid;
 exit

上面的查询显示了“Select ref_id from user_data where ref_id = ''”的结果。 虽然这应该显示变量 $rf_cd 的值。

【问题讨论】:

  • 您需要了解如何将参数传递给函数的基本知识,如果您不希望有人删除您的数据库,还需要注意 sql 注入主题。
  • 警告:这看起来是terrifyingly insecure,为了您,我希望这不是在公共互联网上。您需要确保所有用户参数都是properly escaped,否则您将面临应用程序受损的严重风险。尽可能使用准备好的语句和占位符,以确保您不会遇到此类错误。如果你已经编写了自己的数据库层函数Run,那你就犯了一个大错误。

标签: php mysql post


【解决方案1】:

在读取函数之前关闭 if 语句 }。为了获得良好的形式,我总是在我的脚本顶部列出函数。

【讨论】:

  • 如果我在脚本顶部列出我的函数,这将显示相​​同的结果,这是我的问题。顺便说一句,我通过将该变量设为全局来获得解决方案。
【解决方案2】:

您可以将 $rf_cd 声明为这些函数的参数,并在调用它们时传递它(最佳解决方案)。

您还可以使用“global”关键字从全局范围访问 $rf_cd 变量。

function checkref_id_from_user(){
    global $rf_cd;
    ...
}

 function checkref_id_from_user_data() {
    global $rf_cd;
    ...
}

【讨论】:

  • 为什么不使用goto 而不是一个函数,让这个100% 不可维护?
  • 也许你应该把整个代码写下来只是因为它有问题? php 中有“全局”,它仍然在旧的遗留代码中使用。我提供了不同的解决方案。
  • @tadman 我认为 global 不会使该代码比现在更糟,但我想主题启动者应该知道什么是“全局”。此外,我澄清说第一个解决方案(将变量作为参数传递给函数)是最好和更可取的方式。
  • 我喜欢你的第一个建议,但是你忽略了你自己的建议,在你的例子中使用这个 global 垃圾,完全推翻了你的论点。
【解决方案3】:

你试过在函数中使用 global 吗?

如果您希望函数能够访问被动变量,则需要定义它们。

特效

myFunction() {
global $LoggedUser, $OtherGlobalVars
}

【讨论】:

  • 坏主意,为什么不直接解析到函数呢?
  • 我个人更喜欢对一些变量使用全局变量,因为我有一些函数已经解析了很多直接变量。通常是被动变量,例如当前登录的用户。
  • 对不起,我不明白你为什么会因为个人喜好而拒绝投票。经常使用全局范围。
  • @MrGulerod 全局变量非常混乱,除非你有非常好的理由,否则应该完全避免使用它们。如果您普遍使用全局变量,您将遇到冲突,而这些对调试来说非常非常令人沮丧。不建议人们随便使用全局变量。您在自己的代码库中所做的事情是您关心的问题,但本网站试图推广最佳实践。
  • 对不起。我不知道那个 global 有这些问题。
猜你喜欢
  • 1970-01-01
  • 2016-03-05
  • 1970-01-01
  • 2021-12-05
  • 2020-09-04
  • 1970-01-01
  • 1970-01-01
  • 2016-07-16
  • 1970-01-01
相关资源
最近更新 更多