Один массив в двух.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>
....