2014-12-21 193 views
0

我买了本书“PHP和MySql Web开发”(2008年10月),但不明白以下代码应该如何工作。这应该是首页并输出:http://i.imgur.com/jMBALZh.jpg?1在php脚本中定义变量

但是,一旦加载,第一次错误发生在未定义的变量上。长脚本,相关章节是定义变量的起点。

<?php 
// This file is the main body of the Warm Mail application. 
// It works basically as a state machine and shows users the 
// output for the action they have chosen. 

//***************************************************************************** 
// Stage 1: pre-processing 
// Do any required processing before page header is sent 
// and decide what details to show on page headers 
//***************************************************************************** 

    include ('include_fns.php'); 
    session_start(); 
    //create short variable names 
    @$username = $_POST['username']; 
    @$passwd = $_POST['passwd']; 
    @$action = $_REQUEST['action']; 
    @$account = $_REQUEST['account']; 
    @$messageid = $_GET['messageid']; 

    @$to = $_POST['to']; 
    @$cc = $_POST['cc']; 
    @$subject = $_POST['subject']; 
    @$message = $_POST['message']; 

    @$buttons = array(); 

    //append to this string if anything processed before header has output 
    $status = ''; 

    // need to process log in or out requests before anything else 
    if ($username || $password) { 
    if(login($username, $passwd)) { 
     $status .= "<p style=\"padding-bottom: 100px\">Logged in successfully.</p>"; 
     $_SESSION['auth_user'] = $username; 
     if(number_of_accounts($_SESSION['auth_user'])==1) { 
     $accounts = get_account_list($_SESSION['auth_user']); 
     $_SESSION['selected_account'] = $accounts[0]; 
     } 
    } else { 
     $status .= "<p style=\"padding-bottom: 100px\">Sorry, we could not log you in with that 
        username and password.</p>"; 
    } 
    } 

    if($action == 'log-out') { 
    session_destroy(); 
    unset($action); 
    $_SESSION=array(); 
    } 

    //need to process choose, delete or store account before drawing header 
    switch ($action) { 
    case 'delete-account': 
     delete_account($_SESSION['auth_user'], $account); 
    break; 

    case 'store-settings': 
     store_account_settings($_SESSION['auth_user'], $_POST); 
    break; 

    case 'select-account': 
     // if have chosen a valid account, store it as a session variable 
     if(($account) && (account_exists($_SESSION['auth_user'], $account))) { 
     $_SESSION['selected_account'] = $account; 
     } 
    break; 
    } 

    // set the buttons that will be on the tool bar 
    $buttons[0] = 'view-mailbox'; 
    $buttons[1] = 'new-message'; 
    $buttons[2] = 'account-setup'; 

    //only offer a log out button if logged in 
    if(check_auth_user()) { 
    $buttons[4] = 'log-out'; 
    } 

//***************************************************************************** 
// Stage 2: headers 
// Send the HTML headers and menu bar appropriate to current action 
//***************************************************************************** 
    if($action) { 
    // display header with application name and description of page or action 
    do_html_header($_SESSION['auth_user'], "Warm Mail - ". 
        format_action($action), 
        $_SESSION['selected_account']); 
    } else { 
    // display header with just application name 
    do_html_header($_SESSION['auth_user'], "Warm Mail", 
        $_SESSION['selected_account']); 
    } 

    display_toolbar($buttons); 

//***************************************************************************** 
// Stage 3: body 
// Depending on action, show appropriate main body content 
//***************************************************************************** 
    //display any text generated by functions called before header 
    echo $status; 

    if(!check_auth_user()) { 
    echo "<p>You need to log in"; 

    if(($action) && ($action!='log-out')) { 
     echo " to go to ".format_action($action); 
    } 
    echo ".</p>"; 
    display_login_form($action); 
    } else { 
    switch ($action) { 
     // if we have chosen to setup a new account, or have just added or 
     // deleted an account, show account setup page 
     case 'store-settings': 

     case 'account-setup': 

     case 'delete-account': 
     display_account_setup($_SESSION['auth_user']); 
     break; 

     case 'send-message': 
     if(send_message($to, $cc, $subject, $message)) { 
      echo "<p style=\"padding-bottom: 100px\">Message sent.</p>"; 
     } else { 
      echo "<p style=\"padding-bottom: 100px\">Could not send message.</p>"; 
     } 
     break; 

     case 'delete': 
     delete_message($_SESSION['auth_user'], 
         $_SESSION['selected_account'], $messageid); 
     //note deliberately no 'break' - we will continue to the next case 

     case 'select-account': 

     case 'view-mailbox': 
     // if mailbox just chosen, or view mailbox chosen, show mailbox 
     display_list($_SESSION['auth_user'], 
        $_SESSION['selected_account']); 
     break; 

     case 'show-headers': 
     case 'hide-headers': 
     case 'view-message': 
     // if we have just picked a message from the list, or were looking at 
     // a message and chose to hide or view headers, load a message 
     $fullheaders = ($action == 'show-headers'); 
     display_message($_SESSION['auth_user'], 
         $_SESSION['selected_account'], 
         $messageid, $fullheaders); 
     break; 

     case 'reply-all': 
     //set cc as old cc line 
     if(!$imap) { 
      $imap = open_mailbox($_SESSION['auth_user'], 
           $_SESSION['selected_account']); 
     } 

     if($imap) { 
      $header = imap_header($imap, $messageid); 

      if($header->reply_toaddress) { 
      $to = $header->reply_toaddress; 
      } else { 
      $to = $header->fromaddress; 
      } 

      $cc = $header->ccaddress; 
      $subject = "Re: ".$header->subject; 
      $body = add_quoting(stripslashes(imap_body($imap, $messageid))); 
      imap_close($imap); 

      display_new_message_form($_SESSION['auth_user'], 
      $to, $cc, $subject, $body); 
     } 

     break; 

     case 'reply': 
     //set to address as reply-to or from of the current message 
     if(!$imap) { 
      $imap = open_mailbox($_SESSION['auth_user'], 
           $_SESSION['selected_account']); 
     } 

     if($imap) { 
      $header = imap_header($imap, $messageid); 
      if($header->reply_toaddress) { 
      $to = $header->reply_toaddress; 
      } else { 
      $to = $header->fromaddress; 
      } 
      $subject = "Re: ".$header->subject; 
      $body = add_quoting(stripslashes(imap_body($imap, $messageid))); 
      imap_close($imap); 

      display_new_message_form($_SESSION['auth_user'], 
            $to, $cc, $subject, $body); 
     } 

     break; 

     case 'forward': 
     //set message as quoted body of current message 
     if(!$imap) { 
      $imap = open_mailbox($_SESSION['auth_user'], 
           $_SESSION['selected_account']); 
     } 

     if($imap) { 
      $header = imap_header($imap, $messageid); 
      $body = add_quoting(stripslashes(imap_body($imap, $messageid))); 
      $subject = "Fwd: ".$header->subject; 
      imap_close($imap); 

      display_new_message_form($_SESSION['auth_user'], 
            $to, $cc, $subject, $body); 
     } 
     break; 

     case 'new-message': 
     display_new_message_form($_SESSION['auth_user'], 
           $to, $cc, $subject, $body); 
     break; 
    } 
    } 
//***************************************************************************** 
// Stage 4: footer 
//***************************************************************************** 
    do_html_footer(); 
?> 

我理解错误是由于$_POST是空的,因此不确定的变量,但为什么会这样写。 isthis代码错误或我缺少任何明显的东西。顺便说一句,include ('include_fns.php');不输出任何东西,只是一个函数列表。

+0

您通常使用'isset($ _ POST ['variableName'])'来避免这些类型的错误。 'isset()'返回一个布尔值。阅读更多关于它[这里](http://php.net/manual/en/function.isset.php) – simeg

+0

我不能通过所有的代码,但我看到的第一件事是,你的第一个如果statment评估一个“$密码”变量,而你声明这样的变量为“$ passwd” – kos

+0

这将有助于知道哪些变量未定义。发布这些值的表单在哪里?它在'include_fns.php'中吗? – RST

回答

1

首先,我想在所有事情上开始会议应该会更好。

Like simpe说,你必须检查你的GET,POST,SESSION等值,如果它们设置为任何值。

如果您想要更好的方法,我建议您检查它们是否已设置并且不是空的。

例如:想想查询字符串像

example.com/index.php?id=16 

isset($ _ GET [ '身份证'])将返回TRUE。没关系。

可是你知道我试图勾搭:

example.com/index.php?id= 

那么,它的设置。但是空的。

所以我建议:

if(isset($_POST['var']) && !empty($_POST['var'])) 

应该做的伎俩。

+0

我不明白。在我的例子中,它们是不同的。有时isset是不够的本身,当然在这个问题上可能不需要,但我认为检查价值内容是很重要的。 – Ali

+1

当你检查$ thing是否有值时,'isset()'是不够的。你关心的是变量$ thing可能不存在。 ** Empty($ thing)**首先检查'isset($ thing)'并返回true,如果它存在**则不存在**然后检查** $ thing **的值,如果返回true一个'空'值。所以:**!empty($ thing)** true时表示:它必须存在并且有一个有用的值。虚假意味着它可能不存在或没有任何有用的价值。 ** empty()**在内部执行** isset()**测试。正如手册中所述。 –

+0

我现在看到了。感谢您的意见。 – Ali