Вставка формы PHP в Mysql, почта и загрузка в той же форме

0

У меня есть php-форма, которая при работе будет вставлять в db, уведомление по электронной почте и разрешать дополнительную загрузку документа. Работает часть db & mail, однако загрузка файла не работает. В какой-то момент мне удалось загрузить файл на отдельной странице. Сейчас у меня есть error_reporting (-1); в php.ini, и в файле журнала Apache ничего не отображается, указывая, где находится ошибка. Я пытаюсь сделать слишком много в одной форме? Есть ли способ получить более подробные сообщения об ошибках, чтобы выяснить, что происходит не так?

<?php
include('connect.php');
if((isset($_POST['username']) && !empty($_POST['username']))
&& (isset($_POST['email']) && !empty($_POST['email']))
&& (isset($_POST['city']) && !empty($_POST['city']))
&& (isset($_POST['state']) && !empty($_POST['state']))
&& (isset($_POST['file1']) && !empty($_POST['file1']))
&& (isset($_POST['file2']) && !empty($_POST['file2']))){
//if((isset($_POST['username']) && (!empty($_POST['username']))) && (isset($_POST['email']) && !empty($_POST['email'])) && (isset($_POST['subject']) && !empty($_POST['subject']))){
    print_r($_POST);
    $username = $_POST['username'];
    $email = $_POST['email'];
    $city = $_POST['city'];
    $state = $_POST['state'];

    $name= $_FILES['file']['name'];
    $tmp_name= $_FILES['file']['tmp_name'];
    $submitbutton= $_POST['submit'];
    $position= strpos($name, "."); 
    $fileextension= substr($name, $position + 1);
    $fileextension= strtolower($fileextension);
    $file1= $_POST['file1'];

    $to = "[email protected]";
    $headers = "From : " . $email;

    if( mail($to, $username, $city, $headers)){
        echo "<strong>E-Mail Sent successfully, we will get back to you soon.</strong>";

        $query = "INSERT INTO 'contact' (username, email, city, state, file1, file2) VALUES ('$username', '$email', '$city', '$state', '$zip', '$file1', '$file2')";
        $result = mysqli_query($connection, $query);

    if (isset($name)) {
    $path= 'uploads/';
    if (!empty($name)){
    if (move_uploaded_file($tmp_name, $path.$name)) {
    echo 'Uploaded!';
    }
    }
    }
    }
}

?>
<html><head></head><body>
<div class="container">

<form class="form-contact" method="POST" multipart/form-data>

<input type="name" name="username" id="inputusername" class="auto-style7" placeholder="Your Name" required><span class="auto-style6">
<input type="email" name="email" id="inputEmail" class="auto-style7" placeholder="Your E-Mail Address">
<input type="name" name="city" id="inputcity" class="auto-style7" placeholder="Your City">
<input type="name" name="state" id="inputstate" class="auto-style7" placeholder="Your State">

<p></p>
Select file1: <input type="file" name="file1"> 
Select file2: <input type="file" name="file2">
<br>
<button class="btn btn-lg btn-primary btn-block" type="submit">Send</button></form>
</div>
</body>
</html>
  • 0
    Добавить: ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); наверху, и сообщать с ошибкой.
  • 1
    если он не говорит enctype = 'multipart / form-data'
Показать ещё 4 комментария
Теги:

2 ответа

0

Вот как я бы пересмотрел ваш исходный код:

<?php
// turn on error reporting
error_reporting(E_ALL);
ini_set('display_errors', 1);

include('connect.php');

if ($_SERVER['REQUEST_METHOD'] === 'POST') {

    // trim all POSTed values
    $_POST = array_map('trim', $_POST);

    // no need to use isset() just use !empty()
    // note: empty('') is true, but empty(' ') is false hence why trimming is good to do
    if (!empty($_POST['username'])
        && !empty($_POST['email'])
        && !empty($_POST['city'])
        && !empty($_POST['state'])) {

        $username = $_POST['username'];
        $email = $_POST['email'];
        $city = $_POST['city'];
        $state = $_POST['state'];

        // now let deal with the file inputs  
        // you have 2 file inputs with name attributes: file1 and file2

        // we'll store only validated files in an array
        $files = [];
        foreach (['file1', 'file2'] as $name) {
            // always check that it is a legit file
            // todo: add more validation and sanitization
            if (isset($_FILES[$name]['tmp_name'])
                && file_exists($_FILES[$name]['tmp_name'])
                && is_uploaded_file($_FILES[$name]['tmp_name'])
                && $_FILES[$name]['error'] === UPLOAD_ERR_OK) {
                $files[$name] = $_FILES[$name];
            }
        }

        $to = "[email protected]";
        $headers = "From : " . $email;

        if (mail($to, $username, $city, $headers)) {
            echo "<strong>E-Mail Sent successfully, we will get back to you soon.</strong>";
            // use prepared statements
            // todo: learn about SQL injection 
            $query = "INSERT INTO contact(username, email, city, state, file1, file2) VALUES (?, ?, ?, ?, ?, ?)";
            $stmt = mysqli_prepare($connection, $query);
            $stmt->bind_param("ssssss", 
                $username, 
                $email, 
                $city, 
                $state,
                // ensure files were provided before getting their names
                isset($files['file1']['name']) ? $files['file1']['name'] : '', 
                isset($files['file2']['name']) ? $files['file2']['name'] : ''
            );

            $stmt->execute();

            // upload the files
            $path= 'uploads/';
            foreach (['file1', 'file2'] as $name) {
                if (isset($files[$name]) 
                    && move_uploaded_file($files[$name]['tmp_name'], $path . $files[$name]['name'])) {
                    echo 'Uploaded!';
                }
            }
        }
    }
}
?>

Также ваша форма должна иметь атрибут enctype:

<form class="form-contact" method="POST" enctype="multipart/form-data">

Хорошо читать

0

Я сделал исправления, и он работает на 50%. File2 загружает, выбираю ли я 1 или 2 файла, но "file1" никогда не работает.

    $name= $_FILES['file1']['name'];
    $name= $_FILES['file2']['name'];
    $tmp_name= $_FILES['file1']['tmp_name'];
    $tmp_name= $_FILES['file2']['tmp_name'];
    $submitbutton= $_POST['submit'];
    $position= strpos($name, "."); 
    $fileextension= substr($name, $position + 1);
    $fileextension= strtolower($fileextension);
    $description= $_POST['description_entered'];

    if (isset($name)) {
    $path= 'uploads/';
    if (!empty($name)){
    if (move_uploaded_file($tmp_name, $path.$name)) {


<html>
Select file1: <input type="file" multiple="multiple" name="file1"> 
Select file2e: <input type="file" multiple="multiple" name="file2">
</html> 

У меня есть отчет об ошибках, ошибки при запуске и т.д. Все установлено, но до сих пор ничего не регистрировалось, как если бы ошибок не было.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню