【问题标题】:Ignore if variable does not exist如果变量不存在则忽略
【发布时间】:2014-05-24 18:59:52
【问题描述】:

我检查表单的所有字段是否都存在。为此,我有一个错误数组。

但是如果Geschlecht 行中的值不是'Paar',那么我必须忽略Tag2、Monat2、Jahr2 以及Gebdatum2,因为如果@987654327,它们在我的表单中不存在@ 是 Mann 或 Frau。否则我会得到:

在…中为 foreach() 提供的参数无效

我用unset 尝试过,但它并没有真正起作用。

else if(isset($_POST['submit']) AND $_POST['submit']=='Daten ändern'){ 
    // Fehlerarray anlegen 
    $errors = array(); 

    if(!isset ($_POST['Email'], 
              $_POST['Show_Email'], 
              $_POST['PLZ'], 
              $_POST['Wohnort'], 
              $_POST['Geschlecht'], 
              $_POST['Tag'],
              $_POST['Monat'],
              $_POST['Jahr'], 
              $_POST['Tag2'],
              $_POST['Monat2'],
              $_POST['Jahr2'], 
              $_POST['MSN'])) 


        $errors = "Bitte benutzen Sie das Formular aus Ihrem Profil"; 


 else{ 

      $emails = array(); 
        $sql = "SELECT 
                       Email 
                FROM 
                       User 
               "; 
        $result = mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error()); 
        while($row = mysql_fetch_assoc($result)) 
            $emails[] = $row['Email']; 

        $sql = "SELECT 
                       Email 
                FROM 
                       User 
                WHERE 
                       ID = '".mysql_real_escape_string($_SESSION['UserID'])."'
               "; 
        $result = mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error()); 
        $row = mysql_fetch_assoc($result); 

        if(trim($_POST['Email'])=='') 
            $errors[]= "Bitte geben Sie Ihre Email-Adresse ein."; 
        elseif(!preg_match('§^[\w\.-]+@[\w\.-]+\.[\w]{2,4}$§', trim($_POST['Email']))) 
            $errors[]= "Ihre Email Adresse hat eine falsche Syntax."; 
        elseif(in_array(trim($_POST['Email']), $emails) AND trim($_POST['Email'])!= $row['Email'])
            $errors[]= "Diese Email-Adresse ist bereits vergeben."; 
        } 
        if(count($errors)){ 
            echo "Ihre Daten konnten nicht bearbeitet werden.<br>\n". 
                 "<br>\n"; 
            foreach($errors as $error) 

                echo $error."<br>\n"; 
            echo "<br>\n". 
                 "Zurück zum <a href=\"".$_SERVER['PHP_SELF']."\">Profil</a>\n";
        } 
        else{ 

         $Gebdatum = sprintf("%04d-%02d-%02d", $_POST['Jahr'], $_POST['Monat'], $_POST['Tag']);
         $Gebdatum2 = sprintf("%04d-%02d-%02d", $_POST['Jahr2'], $_POST['Monat2'], $_POST['Tag2']); 

        $sql = "UPDATE 
                        User 
                SET 
                        Email =  '".mysql_real_escape_string(trim($_POST['Email']))."',
                        Show_Email = '".mysql_real_escape_string(trim($_POST['Show_Email']))."',
                        Wohnort = '".mysql_real_escape_string(trim($_POST['Wohnort']))."',
                        PLZ = '".mysql_real_escape_string(trim($_POST['PLZ']))."',
                        Geschlecht = '".mysql_real_escape_string(trim($_POST['Geschlecht']))."',
                        Gebdatum = '".mysql_real_escape_string(trim($Gebdatum))."',
                        Gebdatum2 = '".mysql_real_escape_string(trim($Gebdatum2))."',
                        MSN = '".mysql_real_escape_string(trim($_POST['MSN']))."'
                WHERE 
                        ID = '".mysql_real_escape_string($_SESSION['UserID'])."'
               ";    
        mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error()); 
        echo "Ihre Daten wurden erfolgreich gespeichert.<br>\n". 
             "Zurück zu <a href=\"".$_SERVER['PHP_SELF']."\">Mein Profil</a><br>\n";
    } 
} 

【问题讨论】:

    标签: php validation unset


    【解决方案1】:

    拆分错误检查

    if(!isset ($_POST['Email'],     # Check fields that you always need
          $_POST['Show_Email'], 
          $_POST['PLZ'], 
          $_POST['Wohnort'], 
          $_POST['Geschlecht'], 
          $_POST['Tag'],
          $_POST['Monat'])
          $_POST['Jahr']
          $_POST['MSN']){ 
    
          $errors[] = "Bitte benutzen Sie das Formular aus Ihrem Profil"; 
          #     ^^^ $errors should always be an Array       
    }
    else
    {
            # Do a separate check for Gender=Couple
            if($_POST['Geschlecht']=="Paar" && 
              !isset(
                $_POST['Tag2'],
                $_POST['Monat2'],
                $_POST['Jahr2'], 
              )
            ) {
    
                 $errors[] = "Bitte benutzen Sie das Formular aus Ihrem Profil"; # Text sollte was Anderes sein für Paare... 
                  #     ^^^ $errors should always be an Array
            }
    
    }
    

    用 if 语句重写 Paare 的 sql

    然后你可以做如下检查:

    $sql = "UPDATE User SET ";
    $sql .= "Email = '" . //.... email;
    #   ^^^ add to string in PHP
    
    if ($_POST['Geschlecht']=="Paar") { 
      $sql .=  " Gebdatum2 = '". //....  
    }
    
    $sql .= "WHERE ID = '". //...
    

    但如果这是一个关键的应用程序......

    那么您可能需要从数据库中提取Geschlecht 以获取可信输入,以确定这是夫妻还是个人的记录,因为您无法信任$_POST['Geschlecht'] 的值。

    如果您想允许用户使用此表单更改Geschlecht,则不适用。

    【讨论】:

      【解决方案2】:

      谢谢。我按你说的试过了,但是我得到了一个

      解析错误:语法错误,第 146 行 /customers/5/f/d/regio-privat.com/httpd.www/myprofile.php 中的意外 T_VARIABLE

      这是检查 Geschlecht == Paar 之前的行

      $errors[] = "Bitte benutzen Sie das Formular aus Ihrem Profil";
      

      因为我想允许用户更改我这样设置的状态

      elseif(isset($_POST['submit']) AND $_POST['submit']=='Daten ändern'){ 
                  // Fehlerarray anlegen 
                  $errors = array(); 
                  // Prüfen, ob alle Formularfelder vorhanden sind 
                  if(!isset ($_POST['Email'], 
                            $_POST['Show_Email'], 
                            $_POST['PLZ'], 
                            $_POST['Wohnort'], 
                            $_POST['Geschlecht'], 
                            $_POST['Tag'],
                            $_POST['Monat'],
                            $_POST['Jahr'], 
                            $_POST['MSN']) || ($geschlecht=='Paar' && !isset($_POST['Tag2'], $_POST['Monat2'],$_POST['Jahr2'])))
      
      
                      // Ein Element im Fehlerarray hinzufügen 
                      $errors = "Bitte benutzen Sie das Formular aus Ihrem Profil"; 
                  else{ ...some email check....  
      

      这似乎可行,并且当用户更改状态时,数据也会以正确的方式写入数据库。我只收到一些通知 虽然 Geschlecht 是 Mann 或 Frau,但我明白了

      注意:未定义变量:第 142 行 ...myprofile.php 中的 geschlecht 注意:未定义索引:第 186 行 ...myprofile.php 中的 Jahr2 注意:未定义索引:...myprofile 中的 Monat2。 php on line 186 注意:未定义索引:Tag2 in ...myprofile.php on line 186 Ihre Daten wurden erfolgreich gespeichert.

      和帕尔这个

      注意:未定义变量:...myprofile.php 中第 142 行 Ihre Daten wurden erfolgreich gespeichert 中的 geschlecht。

      “geschlecht”通知与此行相关

        $_POST['MSN']) || ($geschlecht=='Paar' && !isset($_POST['Tag2'], $_POST['Monat2'],$_POST['Jahr2'])))
      

      第 186 行包含此内容

      $Gebdatum2 = sprintf("%04d-%02d-%02d", $_POST['Jahr2'], $_POST['Monat2'], $_POST['Tag2']);
      

      所以我必须想办法避免这些消息。

      【讨论】:

        猜你喜欢
        • 2017-02-15
        • 2012-03-28
        • 2022-01-18
        • 1970-01-01
        • 2015-03-21
        • 2019-07-02
        • 1970-01-01
        • 1970-01-01
        • 2018-12-23
        相关资源
        最近更新 更多