2017-02-13 2 views
0

Я пытаюсь следовать учебнику PHP Lynda, и я застрял в проверке на страницах CRUD. Я пытался выяснить, что пошло не так, но я не могу найти, откуда исходит ошибка, хотя это уже указано в ошибке. Я смущен, потому что я использую ту же проверку для создания темы, и она выполняется просто отлично, но для создания страницы я получаю ошибку - Notice: Undefined index: visible in D:\wd-stuff\ampps\www\cms.widgetcorp\includes\validation.php on line 14.Примечание: Неопределенный индекс - Ошибка PHP

Ниже приведен полный код, над которым я работаю.

PS: У меня есть вход радио, видимый.

PS2: Я прочитал ссылку, которая обрабатывала индекс Undefined, но он не ответил на мой вопрос. Такая же проверка работает отлично от другой формы (new_subject.php), которая в основном такая же, как и new_page.php.

new_page.php

require_once '../includes/session.php'; 
    require_once '../includes/functions.php'; 
    require_once '../includes/connection.php'; 
    require_once '../includes/validation.php'; 

    getSelectedContent(); 

    if (!$is_subject) { 
     redirect_to("manage_content.php"); 
    } 

    if (isset($_POST['submit'])) { 

     // validations 

     $req_fields = array("menu_name", "position", "visible", "content"); 
     validatePresence($req_fields); 
     $field_with_length = array ("menu_name" => 30); 
     validateLenght($field_with_length); 


     if (empty($errors)) { 

      $s_id = $is_subject['id']; 
      $menu_name = mysqlPrep($_POST['menu_name']); 
      $position = (int) $_POST['position']; 
      $visible = (int) $_POST['visible']; 
      $content = mysqlPrep($_POST['content']); 

      $qry = "INSERT INTO pages ("; 
      $qry .= " subject_id, menu_name, position, visible, content"; 
      $qry .= ") VALUES ("; 
      $qry .= " {$s_id}, '{$menu_name}', {$position}, {$visible}, '{$content}'"; 
      $qry .= ")"; 
      $result = mysqli_query($conn, $qry); 

      if ($result) { 
       $_SESSION['msg'] = "Page added."; 
       redirect_to("manage_content.php?subject=" . urlencode($is_subject['id'])); 
      } else { 
       $_SESSION['msg'] = "Page Creation Failed"; 
      } 

     } 
    } 

    include_once '../includes/layouts/header.php'; 

validation.php

$errors = array(); 

function isDataPresent($value) 
{ 
    return (isset($value) && $value !== ""); 
} 

function validatePresence($fields) 
{ 
    global $errors; 

    foreach ($fields as $field) { 
     $value = trim($_POST[$field]); 
     if (!isDataPresent($value)) { 
      $errors[$field] = str_replace("_", " ", ucfirst($field)) . " can't be blank"; 
     } 
    } 
} 

function isLengthValid($value, $max) 
{ 
    return (strlen($value) <= $max); 
} 

function validateLenght($fields) 
{ 
    global $errors; 
    foreach ($fields as $field => $max) { 
     $value = trim($_POST[$field]); 
     if (!isLengthValid($value, $max)) { 
      $errors[$field] = str_replace("_", " ", ucfirst($field)) . " is too long"; 
     } 
    } 
} 

Я также думал, просто комбинируя два. Но главная цель моего поста - понять, почему валидация работает в одной форме, но не с другой, которая в основном одинакова.

new_subject.php

require_once '../includes/session.php'; 
require_once '../includes/functions.php'; 
require_once '../includes/connection.php'; 
require_once '../includes/validation.php'; 

if (isset($_POST['submit'])) { 
    $menu_name = mysqlPrep($_POST['menu_name']); 
    $position = (int) $_POST['position']; 
    $visible = (int) $_POST['visible']; 

    // validations 

    $req_fields = array("menu_name", "position", "visible"); 
    validatePresence($req_fields); 
    $field_with_length = array ("menu_name" => 30); 
    validateLenght($field_with_length); 


    if (!empty($errors)) { 
     $_SESSION['errors'] = $errors; 
     redirect_to('new_subject.php'); 
    } 

    $qry = "INSERT INTO subjects ("; 
    $qry .= "menu_name, position, visible"; 
    $qry .= ") VALUES ("; 
    $qry .= " '{$menu_name}', $position, $visible"; 
    $qry .= ")"; 
    $result = mysqli_query($conn, $qry); 

    if ($result === false) { 
     $_SESSION['msg'] = "Subject Creation Failed"; 
     redirect_to("new_subject.php"); 
    } 

    $_SESSION['msg'] = "Subject Created"; 
    redirect_to("manage_content.php"); 

} else { 
    redirect_to("new_subject.php"); 
} 

предмет форма

<form action="create_subject.php" method="post"> 
      <p>Menu name: 
       <input type="text" name="menu_name" value=""> 
      </p> 
      <p>Position: 
       <select name="position"> 
       <?php 
        $subject_set = getAllSubjects(); 
        $subject_cnt = mysqli_num_rows($subject_set); 
        for ($cnt = 1; $cnt <= $subject_cnt + 1; $cnt++) { 
         echo "<option value=\"{$cnt}\">{$cnt}</option>"; 
        } 
       ?> 
       </select> 
      </p> 
      <p>Visible: 
       <input type="radio" name="visible" value="0"> No 
       &nbsp; 
       <input type="radio" name="visible" value="1"> Yes 
      </p> 
      <input type="submit" name="submit" value="Create Subject"> 
     </form> 

страница формы

<form action="new_page.php?subject=<?= urlencode($is_subject['id']); ?>" method="post"> 
      <p>Menu name: 
       <input type="text" name="menu_name" value=""> 
      </p> 
      <p>Position: 
       <select name="position"> 
       <?php 
        $page_set = getAllPages($is_subject['id']); 
        $page_cnt = mysqli_num_rows($page_set); 
        for ($cnt = 1; $cnt <= $page_cnt + 1; $cnt++) { 
         echo "<option value=\"{$cnt}\">{$cnt}</option>"; 
        } 
       ?> 
       </select> 
      </p> 
      <p>Visible: 
       <input type="radio" name="visible" value="0"> No 
       &nbsp; 
       <input type="radio" name="visible" value="1"> Yes 
      </p> 
      <p>Content: <br> 
       <textarea rows="20" cols="80" name="content"></textarea> 
      </p> 
      <input type="submit" name="submit" value="Create Page"> 
     </form>[Validation error that I'm trying to reproduce][1] 
+2

Возможный дубликат [PHP: «Примечание: неопределенная переменная», «Примечание: неопределенный индекс» и «Примечание: неопределенное смещение»] (http://stackoverflow.com/questions/4261133/php-notice-undefined- variable-notice-undefined-index-and-notice-undef) – aynber

ответ

0

Это из-за ошибки в функции validatePresence(), который пытается проверить значение против условия, когда значение не может быть установлено, поэтому, почему выбрано E_NOTICE. Измените код этой функции к этому:

function validatePresence($fields) 
{ 
    global $errors; 

    foreach ($fields as $field) { 
     if (!isset($_POST[$field]) || trim($_POST[$field]) == '') { 
      $errors[$field] = str_replace("_", " ", ucfirst($field)) . " can't be blank"; 
     } 
    } 
} 

Затем, вы можете безопасно удалить код функции isDataPresent(), как это на самом деле не нужно больше после этого изменения.

+0

Благодарим вас за ответ. Я отредактировал свой пост и добавил другую обработку формы, о которой я говорил. – Oversoul

+0

Я вижу. Можете ли вы обновить свой вопрос, разместив HTML-код двух форм, которые вы упомянули? Тот, который работает, и тот, который вызывает ошибку. – ablopez

+0

Тематическая форма является той, которая работает. форма страницы - это та, где я получаю сообщение об ошибке. – Oversoul