форма с экраном подтверждения и загрузкой изображения

Я застрял в создании формы с PHP, который имеет экран подтверждения и поле для загрузки изображения. Идея состоит в том, чтобы заполнить форму и загрузить файл на экране ввода, имея возможность перейти на экран подтверждения, где я вижу свое содержимое (включая имя файла), а также иметь возможность вернуться на экран ввода, чтобы выбрать другой файл, если мы хотим (на тот момент мне все еще нужно было видеть мое имя файла). Наконец, с экрана подтверждения, если я нажму кнопку отправить, мой контент будет зарегистрирован в CSV-файле (для изображения мне нужно зарегистрировать путь к файлу)

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

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

Вот мой код, я использую три файла index.php и lib / send.php и complete.html
Некоторые слова написаны на японском, но это не важно.

Кто-то, пожалуйста, помогите мне выполнить эту задачу.

    <?php
mb_internal_encoding("UTF-8");

require("./lib/send.php");
$sendForm = new SendForm();

$mode = "";

$name_sei = "";
$name_mei = "";
$email = "";
$sex = "1";
$birth_year = "";
$birth_month = "";
$birth_day = "";
$image = "";
$comments = "";

$error_msg = array();
//vdd($_POST['mode']);
if (isset($_POST['mode']) && ($_POST['mode'] == 'back' || $_POST['mode'] == 'confirm' || $_POST['mode'] == 'complete')) {
$mode = $_POST['mode'];
//vdd($mode);

$error_num = 0;

$data = $sendForm->checkPostData();
//vdd($data);

$name_sei = $data['input_data']['name_sei'];
$name_mei = $data['input_data']['name_mei'];
$email = $data['input_data']['email'];
$sex = $data['input_data']['sex'];
$birth_year = $data['input_data']['birth_year'];
$birth_month = $data['input_data']['birth_month'];
$birth_day = $data['input_data']['birth_day'];
$image = $data['input_data']['image'];
//vdd($image);
$comments = $data['input_data']['comments'];

if ($data['error_num'] > 0 && $mode != 'back') {
$mode = "error";
$error_msg = $data['error_msg'];
}

if ($mode == "complete") {

$sendForm->send($data['input_data']);
}
}

if ($mode != "confirm" && $mode != "complete") {

?>

<!DOCTYPE html>
<html>
<head>
<title>お問い合わせ</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="css/style.css" rel="stylesheet">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>

</head>
<body>
<h1>お問い合わせ</h1>
<h2>入力画面</h2>

<form action="./index.php" method="post" enctype="multipart/form-data">
<input type="hidden" name="mode" value="confirm">

<div class="formBox"><div>
<label for="name"><span class="req">*</span>名前:</label>
<input class="name_input" type="text" name="name_sei" value="<?php echo $name_sei; ?>" placeholder="山田">&nbsp;<input class="name_input" type="text" name="name_mei" value="<?php echo $name_mei; ?>" placeholder="太郎">
<?php
if (isset($error_msg['name'])) {
echo "<br><span class=\"alert\">{$error_msg['name']}</span>\n";
}
?>
</div>

<div>
<label for="email"><span class="req">*</span>メールアドレス:</label>
<input type="text" name="email" value="<?php echo $email;?>" placeholder="yourmail@example.com">
<?php
if (isset($error_msg['email'])) {
echo "<br><span class=\"alert\">{$error_msg['email']}</span>\n";
}
?>
</div>

<div>
<label for="sex"><span class="req">*</span>性別:</label>
<input type="radio" class="radio_input" name="sex" value="1"<?php if($sex == 1) echo " checked=\"checked\"" ?>>男性
<input type="radio" class="radio_input" name="sex" value="2"<?php if($sex == 2) echo " checked=\"checked\"" ?>>女性
<?php
if (isset($error_msg['sex'])) {
echo "<br><span class=\"alert\">{$error_msg['sex']}</span>\n";
}
?>
</div>

<div>
<label for="birthday"><span class="req">*</span>生年月日:</label>
<select name="birth_year">
<option value="">--</option>
<?php
$start_year = 1948;
$last_year = date("Y");
for ($i = $start_year; $i <= $last_year; $i++) {
$selected = "";
if ($i == $birth_year) $selected = " selected=\"selected\"";

echo "<option value=\"{$i}\"{$selected}>{$i}</option>\n";
}
?>
</select>
年&nbsp;
<select name="birth_month">
<option value="">--</option>
<?php
for ($i = 1; $i <= 12; $i++) {
$selected = "";
if ($i == $birth_month) $selected = " selected=\"selected\"";

echo "<option value=\"{$i}\"{$selected}>{$i}</option>\n";
}
?>
</select>
月&nbsp;
<select name="birth_day">
<option value="">--</option>
<?php
for ($i = 1; $i <= 31; $i++) {
$selected = "";
if ($i == $birth_day) $selected = " selected=\"selected\"";

echo "<option value=\"{$i}\"{$selected}>{$i}</option>\n";
}
?>
</select>
日
<?php
if (isset($error_msg['birth'])) {
echo "<br><span class=\"alert\">{$error_msg['birth']}</span>\n";
}
?>
</div>

<div>
<label for="file"><span class="req">*</span>プロフィール画像:</label>
<input type="file" name="image" id="image" value="<?php echo $image;?>"><br><small class="hint">プロフィール画像はJPG,PNGのみで2MBまで</small>
<?php
//vdd($image);
if (isset($error_msg['image'])) {
echo "<br><span class=\"alert\">{$error_msg['image']}</span>\n";
}
?>
</div>

<div>
<label for="comments"><span class="req">*</span>一言コメント</label>
<textarea name="comments"><?php echo $comments; ?></textarea>
<?php
if (isset($error_msg['comments'])) {
echo "<br><span class=\"alert\">{$error_msg['comments']}</span>\n";
}
?>
</div>

<div class="button">
<button type="submit" id="submit" class="btn-submit">確認する</button>
</div>

</div>
</form>

</body>
</html>

<?php
//====================フォームここまで============================//
} else if ($mode == "confirm") {
//====================確認画面ここから============================//
?>

<!DOCTYPE html>
<html>
<head>
<title>contact confirm</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="css/style.css" rel="stylesheet">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script>
function back_form() {
$('#mode').val('back');
$('#formConform').submit();
}
</script>
</head>
<body>
<h1>お問い合わせ</h1>
<h2>確認画面</h2><form action="index.php" method="POST" id="formConform" enctype="multipart/form-data">
<input type="hidden" name="mode" value="complete" id="mode"><input type="hidden" name="name_sei" value="<?php echo $name_sei; ?>">
<input type="hidden" name="name_mei" value="<?php echo $name_mei; ?>">
<input type="hidden" name="email" value="<?php echo $email; ?>">
<input type="hidden" name="sex" value="<?php echo $sex; ?>">
<input type="hidden" name="birth_year" value="<?php echo $birth_year; ?>">
<input type="hidden" name="birth_month" value="<?php echo $birth_month; ?>">
<input type="hidden" name="birth_day" value="<?php echo $birth_day; ?>">
<input type="hidden" name="image" value="<?php echo $image; ?>">
<?php
//vdd($image);
?>
<input type="hidden" name="comments" value="<?php echo $comments; ?>">

<div>
<table class="form">

<tr>
<th><p><span class="req">*</span>名前</p></th>
<td>
<?php echo $name_sei; ?>&nbsp;&nbsp;<?php echo $name_mei; ?>
</td>
</tr>

<tr>
<th><p><span class="req">*</span>メールアドレス</p></th>
<td>
<?php echo $email; ?>
</td>
</tr>

<tr>
<th><p><span class="req">*</span>性別</p></th>
<td>
<?php
if ($sex == 1) {
echo "男性";
} else {
echo "女性";
}
?>
</td>
</tr>

<tr>
<th><p><span class="req">*</span>生年月日</p></th>
<td>
<?php
$year_str = $birth_year;
?>
<?php echo $year_str."年 ". $birth_month."月 ".$birth_day."日 ";?>
</td>
</tr>

<tr>
<th><p><span class="req">*</span>プロフィール画像</p></th>
<td>
<?php echo $_FILES['image']['name']; ?>
</td>
</tr>

<tr>
<th><p><span class="req">*</span>一言コメント</p></th>
<td>
<?php echo $comments; ?>
</td>
</tr>

</table>
</div><div>
<div class="return">
<button type="button" onClick="back_form()">戻る</button>
</div>
<div class="send">
<button type="submit">送信する</button>
</div>
</div>

</body>
</html>

<?php
//====================確認画面ここまで============================//
}
?>

и вот код в lib / send.php

<?php

function vd($data) {
echo "<pre>", var_dump($data), "</pre>";
}
function vdd($data) {
echo "<pre>", var_dump($data), "</pre>";
die;
}

class SendForm {

function checkPostData() {

$name_sei = "";
$name_mei = "";
$email = "";
$sex = "1";
$birth_year = "";
$birth_month = "";
$birth_day = "";
$image = "";
$comments = "";

$error_msg = array();
$error_num = 0;
$error_birthday_num = 0;
$uploadOk = 0;

if (isset($_POST['name_sei'])) {
$name_sei = trim(htmlspecialchars($_POST['name_sei']));
}
if (isset($_POST['name_mei'])) {
$name_mei = trim(htmlspecialchars($_POST['name_mei']));
}
if (isset($_POST['email'])) {
$email = trim(htmlspecialchars($_POST['email']));
}
if (isset($_POST['sex'])) {
$sex = trim(htmlspecialchars($_POST['sex']));
}
if (isset($_POST['birth_year'])) {
$birth_year = trim(htmlspecialchars($_POST['birth_year']));
}
if (isset($_POST['birth_month'])) {
$birth_month = trim(htmlspecialchars($_POST['birth_month']));
}
if (isset($_POST['birth_day'])) {
$birth_day = trim(htmlspecialchars($_POST['birth_day']));
}
if (isset($_FILES['image'])) {
$image = ($_FILES['image']);
//vdd($image);
}
if (isset($_POST['comments'])) {
$comments = trim(htmlspecialchars($_POST['comments']));
}if ($name_sei == "" || $name_mei == "") {
$error_msg['name'] = "入力されていません。";
$error_num++;
} else if ( (strpos($name_sei, ',') !== false) || ((strpos($name_mei, ',') !== false)) ) {
$error_msg['name'] = "カンマの使用はできません。";
$error_num++;
} else if (mb_strlen($name_sei) > 10 || mb_strlen($name_mei) > 10) {
$error_msg['name'] = "10文字までで入力してください。";
$error_num++;
}

if ($email == "") {
$error_msg['email'] = "入力されていません。";
$error_num++;
} else if (!preg_match('|^[0-9a-z_./?-]+@([0-9a-z-]+\.)+[0-9a-z-]+$|', $email)) {
$error_msg['email'] = "メールアドレスの形式が正しくありません。";
$error_num++;
}

if ($birth_year == "" || $birth_month == "" || $birth_day == "") {
$error_msg['birth'] = "生年月日が正しく選択されていません。";
$error_num++;
} else if ((!is_numeric($birth_year) || $birth_year < 1948 || $birth_year > date("Y") || $birth_year != round($birth_year)) || (!is_numeric($birth_month) || $birth_month < 1 || $birth_month > 12 || $birth_month != round($birth_month)) || (!is_numeric($birth_day) || $birth_day < 1 || $birth_day > 31 || $birth_day != round($birth_day))) {
$error_msg['birth'] = "生年月日が選択幅に含まれていません。";
$error_num++;
} else if (checkdate($birth_month, $birth_day, $birth_year) == false) {
$error_msg['birth'] = "日付は存在しません。";
$error_num++;
}

function file_check($fileName) {

$check_result = mime_content_type($fileName);
if ( ($check_result == "image/png") || ($check_result == "image/jpeg") || ($check_result == "image/jpg") ) {
return true;
} else {
return false;
}
}

if (isset($_FILES['image'])) {
$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["image"]["name"]);
$uploadOk = 1;
$imageFileType = pathinfo($target_file,PATHINFO_EXTENSION);
}
// Check if the file is sent via post
if(isset($_FILES["image"])) {
if ($_FILES["image"]["tmp_name"]!== "") {
if($imageFileType == "jpg" || $imageFileType == "png" || $imageFileType == "jpeg") {
if ($_FILES["image"]["size"] < 2097152) {
if (file_check($_FILES["image"]["tmp_name"]) == true) {
$uploadOk = 1;
} else {
$error_msg['image'] = "File is not an image or has an incorrect extension.";
$uploadOk = 0;
$error_num++;
}
} else {
$error_msg['image'] = "Your file is too large. ";
$uploadOk = 0;
$error_num++;
}
} else {
$error_msg['image'] = "Only JPG, JPEG & PNG files are allowed. ";
$uploadOk = 0;
$error_num++;
}
} else {
$error_msg['image'] = "You need to upload a file first. ";
$uploadOk = 0;
$error_num++;
}

if ($uploadOk == 0) {
echo "Sorry, your file was not uploaded.";
} else {
if (move_uploaded_file($_FILES["image"]["tmp_name"], $target_file)) {
echo "The file ". basename( $_FILES["image"]["name"]). " has been uploaded.";
} else {
echo "Sorry, there was an error uploading your file.";
}
}
}

if ($comments == "") {
$error_msg['comments'] = "入力されていません。";
$error_num++;
} else if (mb_strlen($comments) > 200) {
$error_msg['comments'] = "200文字までで入力してください。";
$error_num++;
}

$input_data = array();
//vdd($input_data);

//vdd($image);
$input_data['name_sei'] = $name_sei;
$input_data['name_mei'] = $name_mei;
$input_data['email'] = $email;
$input_data['sex'] = $sex;
$input_data['birth_year'] = $birth_year;
$input_data['birth_month'] = $birth_month;
$input_data['birth_day'] = $birth_day;
//vdd($_FILES['image']);
$input_data['image'] = $image;
//vdd($input_data['image']);
$input_data['comments'] = $comments;// vdd($input_data);
return array('input_data' => $input_data, 'error_num' => $error_num, 'error_msg' => $error_msg);

}

// 送信
function send($data) {
mb_language("uni");
mb_internal_encoding("UTF-8");
$name_sei = $data['name_sei'];
$name_mei = $data['name_mei'];
$email = $data['email'];
$sex = $data['sex'];
$birth_year = $data['birth_year'];
$birth_month = $data['birth_month'];
$birth_day = $data['birth_day'];
$image = $data['image'];
//vdd($image);
$comments = $data['comments'];

$sex_str = "";
if ($sex == 1) {
$sex_str = "男性";
} else {
$sex_str = "女性";
}

$name_str = $name_sei . " " . $name_mei;

$year_str = $birth_year;

$birth_day_str = $year_str."年 " .$birth_month."月 ".$birth_day."日";

// converting to suit csv function
function convertToSuitCSV($html) {
$needle = '"';
$lastPos = 0;
$positions = array();

while (($lastPos = strpos($html, $needle, $lastPos))!== false) {
$positions[] = $lastPos;
$lastPos = $lastPos + strlen($needle);
}

for ($i = count($positions) - 1; $i >= 0; $i--) {
$html = substr_replace($html, '"', $positions[$i], 0);
}
return '"'.$html.'"';
}

// csv

$header = array('名前', 'メールアドレス', '性別', '生年月日', '登録時間', '一言コメント');
function encode_items($arrayToEncode) {
foreach($arrayToEncode as $key => $value) {
$arrayToEncode[$key] = mb_convert_encoding($value, "SJIS", "UTF-8");
}
return $arrayToEncode;
}

$header_encoded = encode_items($header);

$today = date("Ymd");
$register_time = date("Y-m-d H:i");
$comments = htmlspecialchars_decode($comments);
$comments_suited = convertToSuitCSV($comments);

$csvData ="{$name_str},{$email},{$sex_str},{$birth_day_str},{$register_time},{$comments_suited}";

$csvData = mb_convert_encoding($csvData, "SJIS", "UTF-8");
$csvData = htmlspecialchars_decode($csvData);

$file = fopen("{$today}.csv","a");

if (filesize("{$today}.csv") == 0){
fputcsv($file, $header_encoded);

if($file) {
fwrite($file,$csvData."\n");
fclose($file);
}
} else {
if($file) {
fwrite($file,$csvData."\n");
fclose($file);
}
}

// ありがとう画面へ遷移させる
$redirect_path = "./complete.html";
header("Location: {$redirect_path}");

exit;
}
}

?>

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector