Один массив в двух.php файлах, массив в файле № 2 не распознан

У меня есть два файла.php в одной папке на моем компьютере. Первый файл называется "Client Instructions.php", а второй - "form_data_checker.php".

В файле "Client Instructions.php" у меня есть этот фрагмент кода:

$required = array('name', 'comments');
require 'form_data_checker.php';

В файле "form_data_checker.php" у меня есть этот код:

if(empty($temp) && in_array($key, $required)){ // etc.}

Я использую DreamWeaver, и похоже, что мое утверждение "require" правильно объединяет два файла. Однако, когда я запускаю свою программу, я получаю сообщения об ошибках, что переменная $ required не распознается как массив.

Может ли кто-нибудь помочь мне понять, почему мой массив $ required не распознается в моем коде в файле "form_data_checker.php"?

Вот точное сообщение об ошибке, которое я получаю:

Notice: Undefined variable: expected in C:\xampp\htdocs\introducingphp\form_data_checker.php on line 16

Warning: in_array() expects parameter 2 to be array, null given in C:\xampp\htdocs\introducingphp\form_data_checker.php on line 16

Спасибо!

Хорошо, я включаю все содержимое двух файлов, потому что я действительно хотел бы решить эту проблему. Вот "Client Instructions.php":

<?php
require './includes/form_data_checker.php'; 
$myErrors = array();
$somethingsMissing = array();
$expectedInfo = array();
$requiredInfo = array();

if (isset($_POST['send'])){
    $to = 'test@test.com';
    $subject = 'Feedback from Client Information form';
    $expectedInfo = array('name', 'email', 'comments');
    $requiredInfo = array('name', 'comments');
}
?>

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Client Contact Information</title>
</head>

<body>
<h1>Client Information</h1>
<?php if ($myErrors || $somethingsMissing) { ?>
<p class="warning"> Please fix the item(s) indicated. </p>
<?php } ?>
<form name="contact" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
    <p>
        <label for="name"> Name:
        <?php if ($somethingsMissing && in_array('name', $somethingsMissing)) { ?>
        <span class="warning"> Please enter your name </span>
        <?php } ?>
        </label>
        <input type="text" name="name" id="name">
    </p>
    <p>
        <label for"email"> Email (optional):
                <?php if ($somethingsMissing && in_array('email', $somethingsMissing)) { ?>
        <span class="warning"> Please enter your email </span>
                <?php } ?>
        </label>
        <input type="email" name="email" id="email">
    <p>
        <label for="address"> Address:
                <?php if ($somethingsMissing && in_array('address', $somethingsMissing)) { ?>
        <span class="warning"> Please enter your address </span>
                <?php } ?>
        </label>
        <input type="text" name="address" id="address">
    </p>
    <p>
        <input type="submit" name="send" id="send" value="Submit Information">
    </p>
<form>
<pre>
<?php

if($_GET){
    echo 'Contents of the $_GET array: <br>';
    print_r($_GET);
} elseif ($_POST) {
    echo 'Contents of the $_POST array: <br>';
    print_r($_POST);
}
?>
</pre>
</body>
</html>

и вот "form_data_checker.php":

<?php
foreach ($_POST as $formFieldKeyName => $clientEnteredDataItem){
    $tempClientData = is_array($clientEnteredDataItem) ? $clientEnteredDataItem : trim($clientEnteredDataItem);

    if(empty($tempClientData) && in_array($formFieldKeyName, $requiredInfo)){
        $somethingsMissing[]=$formFieldKeyName;
        $$formFieldKeyName='';
    } else if(in_array($formFieldKeyName, $expectedInfo)){
        $$formFieldKeyName = $tempClientData;
    }
}
?>

5 ответов

Решение

Проблема в том, что

require './includes/form_data_checker.php'; 

первая строка, которая вызывается перед тем, как вы на самом деле объявляете $requiredInfo, чтобы убедиться, что файл вызывается после объявления массива, я переместил require заявление. Я думаю, что это должно решить проблему.

<?php

$myErrors = array();
$somethingsMissing = array();
$expectedInfo = array();
$requiredInfo = array();

if (isset($_POST['send'])){
    $to = 'test@test.com';
    $subject = 'Feedback from Client Information form';
    $expectedInfo = array('name', 'email', 'comments');
    $requiredInfo = array('name', 'comments');
}

require './includes/form_data_checker.php'; 
?>

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Client Contact Information</title>
</head>

<body>
<h1>Client Information</h1>
<?php if ($myErrors || $somethingsMissing) { ?>
<p class="warning"> Please fix the item(s) indicated. </p>
<?php } ?>
<form name="contact" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
    <p>
        <label for="name"> Name:
        <?php if ($somethingsMissing && in_array('name', $somethingsMissing)) { ?>
        <span class="warning"> Please enter your name </span>
        <?php } ?>
        </label>
        <input type="text" name="name" id="name">
    </p>
    <p>
        <label for"email"> Email (optional):
                <?php if ($somethingsMissing && in_array('email', $somethingsMissing)) { ?>
        <span class="warning"> Please enter your email </span>
                <?php } ?>
        </label>
        <input type="email" name="email" id="email">
    <p>
        <label for="address"> Address:
                <?php if ($somethingsMissing && in_array('address', $somethingsMissing)) { ?>
        <span class="warning"> Please enter your address </span>
                <?php } ?>
        </label>
        <input type="text" name="address" id="address">
    </p>
    <p>
        <input type="submit" name="send" id="send" value="Submit Information">
    </p>
<form>
<pre>
<?php

if($_GET){
    echo 'Contents of the $_GET array: <br>';
    print_r($_GET);
} elseif ($_POST) {
    echo 'Contents of the $_POST array: <br>';
    print_r($_POST);
}
?>
</pre>
</body>
</html>

Нет необходимости использовать глобалы. это должно работать даже без него.

Попробуй использовать global:

global $required;
if(empty($temp) && in_array($key, $required)){ // etc.}
$_GLOBALS['required'] = array('name', 'comments');
require 'form_data_checker.php';

//form_data_checker.php
if(empty($temp) && in_array($key, $_GLOBALS['required'])){ // etc.}

Вышеуказанный метод также может работать. Тем не менее, это не очень хорошая практика. Вместо этого используйте переменные $_SESSION[].

Проблема в том, что вы включаете файл "form_data_checker.php", прежде чем определить $requiredInfo, поскольку $requiredInfo еще не определено, что приводит к предупреждению, что параметр 2 не является массивом.

Обновите файл "Client Instructions.php", чтобы "form_data_checker.php" выполнялся после определения и заполнения $requiredInfo массив.

"Client Instructions.php" должен выглядеть следующим образом после изменения:

<?php
$myErrors = array();
$somethingsMissing = array();
$expectedInfo = array();
$requiredInfo = array();

if (isset($_POST['send'])){
    $to = 'test@test.com';
    $subject = 'Feedback from Client Information form';
    $expectedInfo = array('name', 'email', 'comments');
    $requiredInfo = array('name', 'comments');
}

// now when 'form_data_checker.php' is called, $requiredInfo will be defined
require './includes/form_data_checker.php'; 
?>

<!DOCTYPE HTML>
<html>
<head>
....
Другие вопросы по тегам