2010-12-16 3 views
10

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

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

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

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

Спасибо

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

Пожалуйста, разместите остальную часть кода. Неопределенная ошибка индекса означает, что данные сообщения для этого ключа не отправляются, а индексы - «месяц» и «оп». Что-то либо устанавливает это обратно в NULL, либо вообще не отправляется, и есть проблема с формой. – DeaconDesperado 2010-12-16 21:54:54

+0

Пожалуйста, поместите весь свой код ... чтобы мы могли его просмотреть. – 2010-12-16 21:56:02

+1

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

ответ

27

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

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

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

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

0

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

0

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

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

3

Очевидно $ _POST [ «месяца»] не установлен. Возможно, в вашем определении формы 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

How I can get rid of it so it doesnt display it?

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

error_reporting(E_ERROR|E_WARNING); 

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

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

13

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

-1

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

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

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

0

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

-3

Вы никогда не должны доверять 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); 

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

1

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

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

$op = (isset($_POST['op'])) ? $_POST['op'] : ''; 
0
<?php 
if ($_POST['parse_var'] == "contactform"){ 


     $emailTitle = 'New Email From KumbhAqua'; 
     $yourEmail = '[email protected]'; 

     $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 
-1

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

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

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

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

-1

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

Смежные вопросы