2015-06-15 9 views
6

Używam jquery i ajax do przesyłania formularzy bez przeładowywania strony, a następnie w zależności od wyniku (czy jest to sukces, czy błąd) drukuję wiadomość dwóch różnych elementów div. Ponieważ sukces i błąd w ajax tylko sprawdza połączenie klient/serwer, echo niektóre rzeczy z PHP, gdy kwerenda się powiedzie iw zależności od tego warunkuję co zrobić z wiadomością. Jquery/ajax część wygląda tak (zwykle używam dwóch różnych div, ale dla uproszczenia przykładu będę używać alertów):Sprawdź za pomocą jquery, czy wynik/echo z PHP zaczyna się od "abc"

success: function (result) { 
    if (result == 'success') { 
     alert("Success!"); 
    } else { 
     alert("There was an error."); 
    } 
}, 

Działa to doskonale, ale chciałbym, aby poprawić jego użyteczność.

Teraz pytanie brzmi: czy mogę użyć w if (result == części czegoś podobnego do str.match? Na przykład, jeśli wystąpiły jakieś problemy z uruchomieniem zapytania, wyświetliłabym echo w php echo "Error: >error description here<";. Czy mógłbym w jakiś sposób użyć str.match(/^Error/) w moim warunku if i wyświetlić całą wiadomość?

+2

Można tak właśnie traktują 'result' jako normalna zmienna łańcuchowa java –

+0

@NaguibIhab nie wiedział, że jQuery jest kompatybilny z Javą – Pinoniq

+1

@Naguib nie wiedziałeś, że java i javascript są dwoma całkowicie oddzielnymi językami? –

Odpowiedz

19

Do tego zadania nie należy używać dopasowywania ciągów znaków. Użyj kodów odpowiedzi HTTP - po to są! http_response_code funkcja w PHP jest przeznaczony do dokładnego tym celu:

<?php 
if (/* error condition */) { 
    http_response_code(400); // "Bad request" response code 
    echo 'Invalid parameters'; 
} 
else { 
    echo 'Success'; // response code is 200 (OK) by default 
} 

Następnie można użyć jQuery za done i fail callbacków obsłużyć dwa przypadki osobno:

$.ajax(url, params) 
    .done(function(response) { alert('all good: ' + response); }) 
    .fail(function(response) { alert('error: ' + response); }) 
+4

To powinno być zaakceptowaną odpowiedzią, znacznie lepiej wykorzystać http, niż próbować podejrzanych ciągów pasujących do strony klienta. –

+0

Nie myślałem o używaniu kodów odpowiedzi http, ponieważ moja znajomość jquery jest dość ograniczona, więc nawet nie przyszło mi do głowy, aby z nich korzystać. Zmienię zaakceptowaną odpowiedź na twoją, tak jak mi się bardziej podoba, ma więcej użyteczności. Trzymam się sukcesu i błędu, ponieważ nie używam odroczonych obiektów. Również alert powinien zostać zmieniony z odpowiedzi na response.responseText, w przeciwnym razie zwraca [object Object]. JSON.stringify (response) działa, aby zobaczyć całą zawartość przekazywanego obiektu. Dzięki zbadaniu go i zastosowaniu go w moim kodzie nauczyłem się nowych rzeczy o jquery, więc podwójne rekwizyty na to. – vove

+0

Zmieniając odpowiedź na response.responseText Mam na myśli to dla części błędu, w przeciwnym razie przekazuje całą odpowiedź z kodem błędu itp. – vove

8

Aby sprawdzić, czy message rozpoczyna się Error: można użyć indexOf:

if (result.indexOf('Error:') === 0) { 
    // Starts with `Error:` 
} 

indexOf zwróci index począwszy od 0 gdzie Error: znajduje się w ciągu result.

referencyjny: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/String/indexOf

Sposób indexOf() zwraca indeks ciągu wywołującego obiektu String pierwszego wystąpienia określonej wartości, rozpoczynając wyszukiwanie na fromIndex. Zwraca -1, jeśli wartość nie zostanie znaleziona.

+4

Tom fenech to poprawna odpowiedź. Nie znaczy to, że jest to niepoprawne, po prostu rozwiązuje problem meta.prawdziwym problemem jest zwrócenie przez serwer błędu 200 na adres – Pinoniq

+0

Z drugiej strony * istnieją * usługi WWW, które zwracają komunikat o błędzie ze statusem "200 OK". –

+0

Zauważ, że op kontroluje oba końce historii. I jestem ostatnią osobą, która mówi, że te usługi sieciowe są dobre. Coś z owcami skaczącymi z klifów i nas mówiącymi, żeby tego nie robili. – Pinoniq

2

aby odpowiedzieć na pytanie "poprawił" twoje pytanie, zrobiłbym trochę JSON.

php:

// Twój kod tutaj i utworzyć tablicę asocjacyjną tak:

if($errors){ 
    $data(
    'results'=>'errors', 
    'message'=>'it failed' 
); 
}else{ 
    $data(
    'results'=>'success', 
    'message'=>'it worked' 
); 
} 

echo json_encode($data); 

a następnie Twoje js byłoby somthing jak:

success: function (result) { 
    if (result.results == 'success') { 
     alert(result.message); 
    } else if (result.results == 'errors' { 
     alert(result.message); 
    } 
}, 

Powiązane: http://www.dyn-web.com/tutorials/php-js/json/array.php#assoc

Powiązane problemy