Problem z formularzem - AJAX PHP

1

Cześć wszystkim, jestem Michał, miło mi. Mam kilka miesięcy komerycjnego doświadczenia, ale musiałem się zwolnić z pracy i od kilku miesięcy uczę się programować na własną rękę. Ta miłość rodzi sie w bólu, ale mam zapas cieprliwości i apap, więc się nie zniechęcam :) Jednak tym razem napotkałem ścianę i nie potrafię dojść do przyczyny problemu, utknąłem.

Do meritum. Mam formularz z opcją dodawania załączników. Przerobiłem skrypt pod swoje wymagania i w zasadzie działa, mail z zawartością dochodzi, ale po submicie wyświetla mi się pusta strona z adresem pliku php. Uparłem się, żeby to wywołać bez przeładowania, po wysyłce wyrzucić ramkę z podziękowaniami.

Googlowałem, min. na stackoverflow znalazłem kilka rozwiązań wykorzystującej AJAX. Skrypt jquery się niby wykonuje poprawnie (pokazuje "test"), konsola pokazuje, że został wykonany plik "secondform.php"(plik z instrukcją formularza), ale na skrzynce jest pusto, a wystarczy, że przywróce submit przez html (nie wiem czy dobrze się wyrażam) i mail dociera. Wrzuciłem też bez przeróbek skrypt, na którym bazowałem i efekt był taki sam - jquery sukces, brak wiadomości na skrzynce.

Moje wnioski są następujące:

  1. Jeśli wykonam submit klasycznie bez jquery @ dochodzi, więc PHP jest ok
  2. Jeśli wykonam submit przez jquery pokazuje się sukces, ale wydaje mi się, że tu jest problem z przekazywaniem zawartości formularza do PHP
  3. Ewentualnie problem leży po stronie serwera lub konfiguracji (to mój ostatni pomysł)
  4. Mam nadzieje, że nie mam nigdzie głupiej literówki :(

Jeśli ktoś znajdzie chwilę czasu na odpowiedź, to gotowe rozwiązanie będzie super, ale bardziej będę wdzięczny za udzielenie wskazówek jak diagnozować takie problemy z ewentualnym wyjaśnieniem tej konkretnej sytuacji, żebym mógł zrozumieć problem. Coś na zasadzie ryby i nauki łowienia :) Poniżej wklejam kody.

Do usłyszenia. Pozdrawiam

formularz:

<form name="mailForm" id="mailForm" method="post" action="" enctype="multipart/form-data">
                            <div>
                                <input type="text" class="input-field" name="userName" id="userName" placeholder="Imię" />
                                <input type="text" class="input-field" name="userEmail" id="userEmail" placeholder="E-mail" />
                                <input type="text" class="input-field" name="userPhone" id="userPhone" placeholder="Tel. kontaktowy" />
                            </div>
                            <div> <input type="text" class="input-field" name="device" id="device" placeholder="Model" />
                                <select name="topic">
                                    <option value="Nie wybrano">Rodzaj usterki</option>
                                    <option value="Uszkodzony ekran">Uszkodzony ekran</option>
                                    <option value="Nie włącza się">Nie włącza się</option>
                                    <option value="Nie ładuje się">Nie ładuje się</option>
                                    <option value="Inny">Inny</option>
                                </select>
                            </div>
                            <textarea name="userMessage" id="userMessage" class="input-field" id="userMessage" placeholder="Krótki opis usterki"></textarea>
                            <input type="text" class="input-field" name="userPrice" id="userPrice" placeholder="Propozycja ceny" />
                            <div class="attachment-row">
                                <input type="file" class="input-field" name="attachment[]">
                            </div>
                            <span>
                                <span class="add-btn" onClick="addMoreAttachment();" title="Add More Attachments">Dodaj kolejne</span>
                                <input type="submit" name="send" class="btn-submit" value="Wyślij" />
                            </span>
                            <div id="statusMessage">
                                <?php
                        if (! empty($message)) {
                            ?>
                                <p class='<?php echo $type; ?>Message'>
                                    <?php echo $message; ?>
                                </p>
                                <?php
                        }
                        ?>
                            </div>
                        </form>

jquery:

     $("#mailForm").on('submit', (function(e) {
        e.preventDefault();
        $.ajax({
            url: "./php/secondform.php",
        type: "POST",
        data:  new FormData(this),
        contentType: false,
        cache: false,
        processData:false,
            success: function(data) {

                alert("test"); // show response from the php script.
            }            
        });
    }));

Instrukcja formularza:

<?php

if(!empty($_POST["send"])) {

   require("/home/PHPMailer/src/PHPMailer.php");
   require("/home/PHPMailer/src/SMTP.php");
   require("/home/PHPMailer/src/Exception.php");


    $mail = new PHPMailer\PHPMailer\PHPMailer();
    $mail->IsSMTP();
    $mail->SMTPDebug = 0;
    $mail->SMTPAuth = TRUE;
    $mail->SMTPSecure = 'tls';
    $mail->Port = 587;
    $mail->Host = 'smtp.gmail.com';
    
    $mail->Username = "[email protected]";
    $mail->Password = "blablabla";
    
    $mail->Mailer = "smtp";
    
    if (isset($_POST["userEmail"])) {
        $userEmail = $_POST["userEmail"];
    }
    if (isset($_POST["userName"])) {
        $userName = $_POST["userName"];
    }
    if (isset($_POST["userPhone"])) {
        $userPhone = $_POST["userPhone"];
    }
    if (isset($_POST["device"])) {
        $subject = $_POST["device"];
    }
    if (isset($_POST["topic"])) {
        $topic = $_POST["topic"];
    }
    if (isset($_POST["userMessage"])) {
        $description = $_POST["userMessage"];
    }
    if (isset($_POST["userPrice"])) {
        $userPrice = $_POST["userPrice"];
    } 
    header("content-type: application/json; charset=utf-8");
    $headers = "MIME-Version: 1.0\r\nContent-type: text/plain; charset=utf-8\r\nContent-Transfer-Encoding: 8bit";
    $message = nl2br("Kontakt: $userPhone\r\n");
    $message.= nl2br("E-mail: $userEmail\r\n\r\n");
    $message.= nl2br("Urządzenie: $subject\r\n");
    $message.= nl2br("Usterka: $topic\r\n");
    $message.= nl2br("Opis usterki: $description\r\n");
    $message.= nl2br("Cena: $userPrice\r\n");
    $mail->SetFrom($userEmail, $userName);
    $mail->AddReplyTo($userEmail, $userName);
    $mail->AddAddress("[email protected]"); // set recipient email address
    
    $mail->Subject = $topic;
    $mail->WordWrap = 80;
    $mail->MsgHTML($message);
    $mail->CharSet = 'UTF-8';
    $mailer->Encoding = 'quoted-printable';
    
    $mail->IsHTML(true);
    
    
    if (! empty($_FILES['attachment'])) {
        $count = count($_FILES['attachment']['name']);
        if ($count > 0) {
            // Attaching multiple files with the email
            for ($i = 0; $i < $count; $i ++) {
                if (! empty($_FILES["attachment"]["name"])) {
                    
                    $tempFileName = $_FILES["attachment"]["tmp_name"][$i];
                    $fileName = $_FILES["attachment"]["name"][$i];
                    $mail->AddAttachment($tempFileName, $fileName);
                }
            }
        }
    }
    if (! $mail->Send()) {
        $message = "Problem in sending email";
        $type = "error";
    } else {
        $message = "Mail sent successfully";
        $type = "success";
    }
}
?>
0

Niestety nie mam czasu dokładnie Ci odpowiedzieć, ale zobacz tutaj:

https://stackoverflow.com/questions/5392344/sending-multipart-formdata-with-jquery-ajax

i generalnie szukaj wg. frazy "jquery ajax send multipart form data"

0

@mr.white: Rozumiem, że secondform.php zwraca Ci informację, że email nie został wysłany?

Tak jeszcze na szybko, prawdopodobnie warunek if na początku pliku nie przepuszcza Cię dalej :)

0

@TomRZ: próbowałem na różne sposoby i efekt ten sam. jquery sukces, wiadomości brak

@leonpro778 Nic mi nie zwraca. W sytuacji, kiedy wykonywał submit przez html też mi nic nie wyrzucał alertu, ale wiadomość przychodziła.
Jak w konsoli klikne na secondform.php w zakładce Network to pokazuje się to:

Status Code: 200 OK
Remote Address: 188.68.240.143:80
Referrer Policy: no-referrer-when-downgrade
Cache-Control: max-age=60
Connection: Upgrade, Keep-Alive
Content-Length: 0
Content-Type: text/html
Date: Wed, 31 Jul 2019 12:24:15 GMT
Expires: Wed, 31 Jul 2019 12:25:15 GMT
Keep-Alive: timeout=3, max=100
Server: Apache
Upgrade: h2,h2c
Vary: User-Agent
X-Powered-By: PHP/7.0.32
Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: pl-PL,pl;q=0.9,en-US;q=0.8,en;q=0.7
Connection: keep-alive
Content-Length: 41000
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryiujU8IBvBQ6D9Vmk
DNT: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36 OPR/62.0.3331.99
X-Requested-With: XMLHttpRequest
userName: tester
userEmail: [email protected]
userPhone: 123213
device: Samsung S8
topic: Uszkodzony ekran
userMessage: 12312321
userPrice: 213
attachment[]: (binary)
1

Wywal na chwilę if z $_POST['name'] i sprawdź. Nie mam teraz jak tego sprawdzić ale chyba w ten sposób nie prześlesz POST'a z name naciśniętego przycisku.

0
leonpro778 napisał(a):

Wywal na chwilę if z $_POST['name'] i sprawdź. Nie mam teraz jak tego sprawdzić ale chyba w ten sposób nie prześlesz POST'a z name naciśniętego przycisku.

@leonpro778 O Stary, dzięki! Ja tu rzeźbie, rzeźbie i siwieje, i pewnie bym nie wymyślił. Jakbym mógł wysłać Ci piwko, to bym to zrobił :D Może siedzisz w krypto? Jak tak, to podeślij mi adres portfela i token, który Cie interesuje - postawię Ci piwko ;) Dzięki jeszcze raz!

Problem rozwiązany, można zamknąć wątek :)

0

Piwka bym się napił (i za godzinę idę właśnie :) ) ale portfela krypto nie posiadam :D Niemniej jednak dzięki :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1