Ошибка PHP: Примечание: неопределенный индекс: - PullRequest
10 голосов
/ 17 декабря 2010

Я работаю над корзиной покупок на PHP, и мне кажется, что я получаю эту ошибку "Замечание: неопределенный индекс:" во всех видах мест.Ошибка относится к похожему биту кодирования в разных местах.Например, у меня есть фрагмент кода, который вычисляет цену пакета с месяцами, на которые пользователь решает подписаться.У меня есть следующие переменные, к которым относятся ошибки:

    $month = $_POST['month'];
    $op = $_POST['op'];

Переменная $ month - это число, которое пользователь вводит в форму, а переменная $ op - это разные пакеты, значения которых хранятся в vriable, которыйпользователь выбирает из переключателей в форме.

Я надеюсь, что это как-то понятно.

Спасибо

РЕДАКТИРОВАТЬ: Извините, забыл упомянуть, что они уходяткогда пользователь отправляет данные.Но когда они впервые попадают на страницу, отображается эта ошибка.Как я могу избавиться от него, чтобы он не отображался?

-

Это код:

<?php
    $pack_1 = 3;
    $pack_2 = 6;
    $pack_3 = 9;
    $pack_4 = 12;
    $month = $_POST['month'];
    $op = $_POST['op'];
    $action = $_GET['action'];

    if ( $op == "Adopter" ) {
       $answer = $pack_1 * $month;
    }

    if ( $op == "Defender" ) {
      $answer = $pack_2 * $month;
    }

    if ( $op == "Protector" ) {
      $answer = $pack_3 * $month;
    }

    if ( $op == "Guardian" ) {
      $answer = $pack_4 * $month;
    }

    switch($action) {   
        case "adds":
            $_SESSION['cart'][$answer][$op];
            break;
    }
?>  

Ответы [ 15 ]

27 голосов
/ 17 декабря 2010

Вы пытаетесь получить доступ к индикаторам в массиве, которые не установлены. Это вызывает уведомление.

Скорее всего, вы заметили это сейчас, потому что ваш код перемещен на сервер, где в php.ini установлено error_reporting, включающее E_NOTICE. Либо подавьте уведомления, установив error_reporting равным E_ALL & ~E_NOTICE (не рекомендуется), либо убедитесь, что индекс существует, прежде чем пытаться получить к нему доступ:

$month = array_key_exists('month', $_POST) ? $_POST['month'] : null;
13 голосов
/ 17 декабря 2010

Вы помещаете обработчик формы в тот же сценарий, что и форма? Если это так, он пытается выполнить обработку до того, как будут установлены значения записей (все выполняется).

Обернуть весь код обработки в условие, которое проверяет, была ли форма даже отправлена.

if(isset($_POST) && array_key_exists('name_of_your_submit_input',$_POST)){
//process form!
}else{
//show form, don't process yet!  You can break out of php here and render your form
}

Скрипты выполняются сверху вниз при процедурном программировании. Вы должны убедиться, что программа знает, чтобы игнорировать логику обработки, если форма не была отправлена. Аналогично, после обработки вы должны перенаправить на страницу успеха что-то вроде

header('Location:http://www.yourdomainhere.com/formsuccess.php');

Я бы не стал привыкать подавлять уведомления или ошибки.

Пожалуйста, не обижайтесь, если я предлагаю, чтобы, если у вас возникли эти проблемы и вы пытаетесь создать корзину для покупок, вы вместо этого использовали зрелое решение для электронной коммерции, такое как Magento или OsCommerce. Корзина для покупок - это интерфейс, который требует высокой степени безопасности, и если вы боретесь с подобными проблемами POST, я могу гарантировать, что позже вас будут мучить головные боли. Есть много отличных стабильных выпусков, некоторые из которых так же просты, как простые объектные модели, которые доступны для скачивания.

3 голосов
/ 17 декабря 2010

Очевидно, что $ _POST ['month'] не установлено. Возможно, в вашем определении формы HTML есть ошибка, или это может быть вызвано чем-то другим. Независимо от причины, вы всегда должны проверять, существует ли переменная перед ее использованием, поэтому

if(isset($_POST['month'])) {
   $month = $_POST['month'];
} else {
   //month is not set, do something about it, raise an error, throw an exception, orwahtever
}
2 голосов
/ 24 сентября 2013

Это просто уведомления php, похоже, что конфигурации php.ini не соответствуют стандартам vtiger, Вы можете отключить это сообщение, установив сообщение об ошибке на E_ALL & ~ E_NOTICE in php.ini Например, error_reporting(E_ALL&~E_NOTICE), а затем перезапустите apache , чтобы отразить изменения.

2 голосов
/ 17 декабря 2010

Как мне избавиться от него, чтобы он не отображался?

Люди здесь пытаются сказать вам, что это непрофессионально (и это так), но в вашем случае вы должны просто добавить следующее в начало вашего приложения:

 error_reporting(E_ERROR|E_WARNING);

Это отключит отчеты E_NOTICE. E_NOTICES - это не ошибки, а уведомления, как следует из названия. Вам лучше проверить это и доказать, что неопределенные переменные не приводят к ошибкам. Но распространенным случаем является то, что они просто неформальны и совершенно нормальны для обработки ввода с помощью PHP.

Кроме того, в следующий раз Google сначала сообщит об ошибке.

1 голос
/ 04 июля 2015

Попробуйте это:

$month = ( isset($_POST['month']) ) ? $_POST['month'] : '';

$op = ( isset($_POST['op']) ) ? $_POST['op'] : '';
0 голосов
/ 26 сентября 2017

Убедитесь, что метки правильно закрыты. И закрывающий тег не будет включен в цикл. (если он содержится в циклической структуре).

0 голосов
/ 01 мая 2017

Я определил все переменные, которые я проверял первым. Я знаю, что это не требуется в PHP, но старые привычки сильно умирают. Затем я санировал информацию следующим образом:

if ($_SERVER["REQUEST_METHOD"] == "POST") {
  if (empty($_POST["name1"])) {
    $name1Err = " First Name is a required field.";
  } else {
      $name1 = test_input($_POST["name1"]);
    // check if name only contains letters and whitespace
      if (!preg_match("/^[a-zA-Z ]*$/",$name1)) {
      $name1Err = "Only letters and white space allowed";

конечно, test_input - это еще одна функция, которая выполняет обрезку, strilashes и htmlspecialchars. Я думаю, что вход довольно хорошо санирован. Не пытаться быть грубым, просто показывая, что я сделал. Когда дело дошло до электронной почты, я также проверил, был ли это правильный формат. Я думаю, что реальный ответ заключается в том, что некоторые переменные являются локальными, а некоторые глобальными. Пока у меня все работает без ошибок, так что, хотя я сейчас очень занят, я приму в качестве ответа отключение ошибок. Не волнуйтесь, я пойму, что это сейчас не жизненно важно!

0 голосов
/ 05 мая 2016

Чтобы скрыть все ошибки, код для этого :

<?php 
      error_reporting(0);
      @ini_set(‘display_errors’, 0);
//THE REST OF THE CODE
 ?>
0 голосов
/ 01 апреля 2016
<?php
if ($_POST['parse_var'] == "contactform"){


        $emailTitle = 'New Email From KumbhAqua';
        $yourEmail = 'xyz@gmail.com';

        $emailField = $_POST['email'];
        $nameField = $_POST['name'];
        $numberField = $_POST['number'];
        $messageField = $_POST['message'];  

        $body = <<<EOD
<br><hr><br>
    Email: $emailField <br /> 
    Name:  $nameField <br />
    Message: $messageField <br />


EOD;

    $headers = "from: $emailField\r\n";
    $headers .= "Content-type: text/htmml\r\n";
    $success =  mail("$yourEmail", "$emailTitle", "$body", "$headers");

    $sent ="Thank You ! Your Message Has Been sent.";

}

?>


 <!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=iso-8859-1" />
<title>:: KumbhAqua ::</title>

    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
        <link rel="stylesheet" href="style1.css" type="text/css">

</head>

<body>
    <div class="container">
        <div class="mainHeader">
            <div class="transbox">

              <p><font color="red" face="Matura MT Script Capitals" size="+5">Kumbh</font><font face="Matura MT Script Capitals" size="+5" color=                                                                           "skyblue">Aqua</font><font color="skyblue"> Solution</font></p>
              <p ><font color="skyblue">Your First Destination for Healthier Life.</font></p>
                    <nav><ul>
                        <li> <a href="KumbhAqua.html">Home</a></li>
                        <li> <a href="aboutus.html">KumbhAqua</a></li>
                        <li> <a href="services.html">Products</a></li>
                        <li  class="active"> <a href="contactus.php">ContactUs</a></li>

                    </ul></nav>
                </div>
            </div>
        </div>
                    <div class="main">
                        <div class="mainContent">
                            <h1 style="font-size:28px; letter-spacing: 16px; padding-top: 20px; text-align:center; text-transform: uppercase; color:                                    #a7a7a7"><font color="red">Kumbh</font><font color="skyblue">Aqua</font> Symbol of purity</h1>
                                <div class="contactForm">
                                    <form name="contactform" id="contactform" method="POST" action="contactus.php" >
                                        Name :<br />
                                        <input type="text" id="name" name="name" maxlength="30" size="30" value="<?php echo "nameField"; ?>" /><br />
                                         E-mail :<br />
                                        <input type="text" id="email" name="email" maxlength="50" size="50" value="<?php echo "emailField"; ?>" /><br />
                                         Phone Number :<br />
                                        <input type="text" id="number" name="number" value="<?php echo "numberField"; ?>"/><br />
                                         Message :<br />
                                        <textarea id="message" name="message" rows="10" cols="20" value="<?php echo "messageField"; ?>" >Some Text...                                        </textarea>
                                        <input type="reset" name="reset" id="reset" value="Reset">
                                        <input type="hidden" name="parse_var" id="parse_var" value="contactform" />
                                        <input type="submit" name="submit" id="submit" value="Submit"> <br />

                                        <?php  echo "$sent"; ?>

                                    </form>
                                        </div>  
                            <div class="contactFormAdd">

                                    <img src="Images/k1.JPG" width="200" height="200" title="Contactus" />
                                    <h1>KumbhAqua Solution,</h1>
                                    <strong><p>Saraswati Vihar Colony,<br />
                                    New Cantt Allahabad, 211001
                                    </p></strong>
                                    <b>DEEPAK SINGH &nbsp;&nbsp;&nbsp; RISHIRAJ SINGH<br />
                                    8687263459 &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;8115120821 </b>

                            </div>
                        </div>
                    </div>

                            <footer class="mainFooter">
                            <nav>
                            <ul>
                                <li> <a href="KumbhAqua.html"> Home </a></li>
                                <li> <a href="aboutus.html"> KumbhAqua </a></li>
                                <li> <a href="services.html"> Products</a></li>
                                <li class="active"> <a href="contactus.php"> ContactUs </a></li>
                            </ul>
                                <div class="r_footer">


          Copyright &copy; 2015 <a href="#" Title="KumbhAqua">KumbhAqua.in</a> &nbsp;&nbsp;&nbsp;&nbsp; Created and Maintained By-   <a title="Randheer                                                                                                                                                                                                                             Pratap Singh "href="#">RandheerSingh</a>                                                                            </div>  
                            </nav>
                            </footer>
    </body>
</html> 

    enter code here
...