Ошибка PHP: Примечание: Неопределенный индекс:

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

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

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

Надеюсь, что это ясно.

Спасибо

EDIT: Извините, забыл упомянуть, что они уходят, когда пользователь отправляет данные. Но когда они впервые попадают на страницу, она отображает эту ошибку. Как я могу избавиться от него, чтобы он не отображал его?

Это код:

 <?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; } ?> 

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

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

 $month = array_key_exists('month', $_POST) ? $_POST['month'] : null; 

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

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

 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, я могу гарантировать, что позже вы будете страдать от головных болей. Есть много отличных стабильных выпусков, некоторые из которых просты, как простые объектные модели, которые доступны для скачивания.

Очевидно, что $ _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 } 

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

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

  error_reporting(E_ERROR|E_WARNING); 

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

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

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

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

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

Я думаю, что не может быть элементов формы по имени «месяц» или «оп». Можете ли вы проверить, есть ли в HTML-источнике (на странице, которая приводит к ошибке при отправке), html-элементы, которые он имеет над именами

undefined index означает, что ключ массива не установлен, выполните var_dump($_POST);die(); перед строкой, которая выдает ошибку и видит, что вы пытаетесь получить ключ массива, который не существует.

это просто означает, что массив $ _POST в этом случае не имеет элемента с именем, который не определен в вашей ошибке. PHP выдает NOTICE вместо ПРЕДУПРЕЖДЕНИЯ ОШИБКИ FATAL.

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

Убедитесь, что вы использовали метод = "post" в форме, с которой вы отправляете данные.

 <?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 

Я определил все переменные, которые были первым, что я проверил. Я знаю, что это не требуется в 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. Я думаю, что вход очень хорошо продезинфицирован. Не пытаясь быть грубым, просто показывая, что я сделал. Когда дело дошло до электронной почты, я также проверил, соответствует ли он правильному формату. Я думаю, что реальный ответ заключается в том, что некоторые переменные являются локальными, а некоторые являются глобальными. Я сейчас работаю без ошибок, поэтому, пока я очень занят, я соглашусь отключить ошибки в качестве своего ответа. Не беспокойтесь, я пойму, это просто не жизненно важно прямо сейчас!

очевидно, что GET и / или POST-переменные (ы) do (es) не существуют. просто проверьте, если «isset». (Псевдокод):

 if(isset($_GET['action'];)) {$action = $_GET['action'];} else { RECOVER FROM ERROR CODE } 

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

 <?php error_reporting(0); @ini_set('display_errors', 0); //THE REST OF THE CODE ?> 

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

Вы никогда не должны доверять POSTed или GETed vars без надлежащей дезинфекции входных данных. В вашем примере, даже если существует $ month, вы не можете быть уверены, что это число. Прежде всего, вы должны добавить что-то вроде этого в начало ваших скриптов:

 // Stop PHPs dangerous name handling function undefined_name_error($errno, $errstr, $errfile='', $errline=0, $errcontext=NULL) { if (stripos($errstr, 'undefined') !== false) return trigger_error("$errstr in $errfile on line $errline;\t", E_USER_ERROR); else return false; } set_error_handler('undefined_name_error', E_NOTICE); 

И если ваш скрипт не работает после этого, вы должны исправить свой код.