phpindexingundefinednotice

Notice "undefined index", but this continued to work until I completed the code


Firstly i added text view with notice(and some warning too) about my problem. Notice: Undefined index: first_name in C:\my_projects\phplearn\www\ch07\create_user.php on line 17 Notice: Undefined index: last_name in C:\my_projects\phplearn\www\ch07\create_user.php on line 19 Notice: Undefined index: email in C:\my_projects\phplearn\www\ch07\create_user.php on line 21 Notice: Undefined index: bio in C:\my_projects\phplearn\www\ch07\create_user.php on line 23 Notice: Undefined index: facebook_url in C:\my_projects\phplearn\www\ch07\create_user.php on line 25 Notice: Undefined index: twitter_handle in C:\my_projects\phplearn\www\ch07\create_user.php on line 40 Notice: Undefined index: user_pic in C:\my_projects\phplearn\www\ch07\create_user.php on line 49 Notice: Trying to access array offset on value of type null in C:\my_projects\phplearn\www\ch07\create_user.php on line 49 Notice: Undefined index: user_pic in C:\my_projects\phplearn\www\ch07\create_user.php on line 57 Notice: Trying to access array offset on value of type null in C:\my_projects\phplearn\www\ch07\create_user.php on line 57 Warning: Header may not contain more than a single header, new line detected in C:\my_projects\phplearn\www\stack\scripts\app_config.php on line 63

The problem started when I added this piece of code:

($_FILES[$image_fieldname]['error'] == 0)
or redirectToError("сервер не может получить выбранное вами изображение.", $php_errors[$_FILES[$image_fieldname]['error']]);


@is_uploaded_file($_FILES[$image_fieldname]['tmp_name'])
or redirectToError('<pre>',"Ты в норме? Зачем ты это пытался загрузить? 
Запрос на отправку: файл назывался " , "{$_FILES[$image_fieldname]['tmp_name']}", '</pre>');

@getimagesize($_FILES[$image_fieldname]['tmp_name'])
or redirectToError('<pre>', "вы выбрали файл для своего фото, который не является изображением." , "{$_FILES[$image_fieldname]['tmp_name']}" , "не является файлом изображения.", '</pre>');

$now = time();
while (file_exists($upload_filename = $upload_dir . $now . '-' . $_FILES[$image_fieldname]['name'])) {
    $now++;
}

move_uploaded_file($_FILES[$image_fieldname]['tmp_name'], $upload_filename)
or redirectToError('<pre>',"возникла проблема сохранения вашего изображения в его постоянном месте. Ошибка, связанная с правами доступа при перемещении файла в {$upload_filename}", '</pre>');

This is all my code in this file.

<?php 
$link = require_once ('../stack/scripts/database_connection.php');

$upload_dir = HOST_WWW_ROOT . "uploads/profile_pics";
$image_fieldname = "user_pic";

$php_errors = array(1 => 'Превышен макс. размер файла, указанный в  php.ini', 
                    2 => 'Превышен макс. размер файла, указанный в форме HTML',
                    3 => 'Была отправлена только часть файла',
                    4 => 'Файл для отправки не был выбран.');



$first_name = trim($_REQUEST['first_name']);

$last_name = trim($_REQUEST['last_name']);

$email = trim($_REQUEST['email']);

$bio = trim($_REQUEST['bio']);

$facebook_url = str_replace("facebook.org", "facebook.com", trim($_REQUEST['facebook_url']));



if (preg_match("/^\s*(http:\/\/www.facebook.com\/)/" , $facebook_url)) {
    $facebook_url === true;
} else {
    $facebook_url = "http://www.facebook.com/" . $facebook_url;
}

$twitter_handle = trim($_REQUEST['twitter_handle']);
$twitter_url = "http://www.twitter.com/";
if (preg_match("/^\s*(@)/" , $twitter_handle)) {
  $twitter_url = $twitter_url . $twitter_handle;
}

($_FILES[$image_fieldname]['error'] == 0)
or redirectToError("сервер не может получить выбранное вами изображение.", $php_errors[$_FILES[$image_fieldname]['error']]);


@is_uploaded_file($_FILES[$image_fieldname]['tmp_name'])
or redirectToError('<pre>',"Ты в норме? Зачем ты это пытался загрузить? 
Запрос на отправку: файл назывался " , "{$_FILES[$image_fieldname]['tmp_name']}", '</pre>');

@getimagesize($_FILES[$image_fieldname]['tmp_name'])
or redirectToError('<pre>', "вы выбрали файл для своего фото, который не является изображением." , "{$_FILES[$image_fieldname]['tmp_name']}" , "не является файлом изображения.", '</pre>');

$now = time();
while (file_exists($upload_filename = $upload_dir . $now . '-' . $_FILES[$image_fieldname]['name'])) {
    $now++;
}

move_uploaded_file($_FILES[$image_fieldname]['tmp_name'], $upload_filename)
or redirectToError('<pre>',"возникла проблема сохранения вашего изображения в его постоянном месте. Ошибка, связанная с правами доступа при перемещении файла в {$upload_filename}", '</pre>');




$insert_sql = "INSERT INTO users (first_name, last_name, email, bio, facebook_url, twitter_handle)
 VALUES  ('{$first_name}', '{$last_name}', '{$email}', '{$bio}', '{$facebook_url}', '{$twitter_handle}');";

mysqli_query($link, $insert_sql)
or die(mysqli_error($link));


header("Location: show_user.php?user_id=" . mysqli_insert_id($link));



?>

<html>
<head>
<link href="../stack/css/phpMM.css" rel="stylesheet" type="text/css" />
</head>


<body>
<div id="header"> <h1>PHP & MySQL: The Missing Manual</h1></div>
<div id="example"> Пример 3.1</div>

<div id="content">
<p>Это запись той информации, которую вы отправили:</p>
<p>
Имя: <?php echo $first_name . " " . $last_name;?></br>
Адрес электронной почты: <?php echo $email;?></br>
<a href="<?php echo $facebook_url; ?>">Ваша страница на Facebook:</a></br>

<a href="<?php echo $twitter_url; ?>">Проверьте свой Twitter - канал</a></br>

</p>    
</div>

<div id="footer"></div>
</body>
</html> 

This is my first time I ask a question here, so I apologize if the form of my question is uncomfortable. Help, pls. Thx

UPD about header function. This is my AppConfig.php

<?php 

define("DEBUG_MODE", true);

define("SITE_ROOT", "/stack/");

define("HOST_WWW_ROOT", "C:/my_projects/phplearn/www/stack/");


define("DATABASE_HOST", "localhost");
define("DATABASE_USERNAME", "root");
define("DATABASE_PASSWORD", "");
define("DATABASE_NAME", "testdb");   


$testArray = [
  "key1" => "value1",
  "key2" => "value2",
  "key3" => "value3",
];


function debug_print($testArray) {
  if (DEBUG_MODE) {
    echo '<pre>' . print_r($testArray, 1) . '</pre>';
    echo generateCallTrace();
  }
}

/*My friend give me this function, im not good understand what`s going on here, eh*/
function generateCallTrace()
{
    $e = new Exception();
    $trace = explode("\n", $e->getTraceAsString());
    // reverse array to make steps line up chronologically
    $trace = array_reverse($trace);
    array_shift($trace); // remove {main}
    array_pop($trace); // remove call to this method
    $length = count($trace);
    $result = array();

    for ($i = 0; $i < $length; $i++)
    {
        $result[] = ($i + 1)  . ')' . substr($trace[$i], strpos($trace[$i], ' ')); // replace '#someNum' with '$i)', set the right ordering
    }

    return "\t" . implode("\n\t", $result);
}




function redirectToError($msg, $error_msg = null) {
  if ($error_msg != null) {
    header("Location: " . SITE_ROOT . "scripts/show_error.php?error_message={$msg}&system_error_message={$error_msg}");
  } else {
    header("Location: " . SITE_ROOT . "scripts/show_error.php?error_message={$msg}");
  }
  die();
}```

Solution

  • There are several issues with the code snippet you've posted but to make it work again you should fix your error message.

    From this:

    @is_uploaded_file($_FILES[$image_fieldname]['tmp_name']) 
    or redirectToError('<pre>',"Ты в норме? Зачем ты это пытался загрузить? 
    Запрос на отправку: файл назывался " , "{$_FILES[$image_fieldname]['tmp_name']}", '</pre>');
    

    To this:

    @is_uploaded_file($_FILES[$image_fieldname]['tmp_name']) 
    or redirectToError('<pre>',"Ты в норме? Зачем ты это пытался загрузить? Запрос на отправку: файл назывался " , "{$_FILES[$image_fieldname]['tmp_name']}", '</pre>');
    

    Why does your original error message don't work? There is a new line between "Зачем ты это пытался загрузить?" and "Запрос на отправку" in your original error message. Now, based on redirectToError function definition, second parameter will be passed directly to header function without any transformation/encoding. It means, you will pass a multi-line string to as a single HTTP header, which is HTTP protocol violation.

    Regarding other PHP Notices, they are shown because no POST data were sent to the page. You can add some very basic check to make sure your script is invoked by form submit:

    <?php
    if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
        // вернуть пользователя обратно на страницу формы
        header("Location: create_user.html");
    }
    
    
    $link = require_once ('../stack/scripts/database_connection.php');
    ...