2011-06-18 6 views
5

EDYCJA: Myślę, że coś wymyśliłem. - Ta postać - - wydaje się ją łamać. Jeśli używam "zwykłego" apostrofu ('), wygląda na to, że działa dobrze, jeśli zastąpię każdy spięty apostrof w nim zwykłym, to przesyła go w porządku. Tak, następne pytanie: dlaczego czy ten fantazyjny apostrof łamie CodeIgniter lub PHP? Zakładam, że to błąd CI, ale popraw mnie, jeśli się mylę. Tak czy inaczej, oto pytanie, opublikowany pierwotnie, chciałbym jeszcze docenić pewien wgląd dlaczego tak się dzieje i czy jest tam dużo mogę zrobić:


mam łzawienie włosy się nad tym. Jest to całkowicie dziwne i po prostu nie mogę tego rozwiązać.

Po pierwsze, mam podstawową formę:

<?php $attributes = array('class' => 'form1'); $selected=""; 
echo form_open('admin/edit_page/'.$page->row('id'), $attributes); ?> 

    <div>    
     <?php echo form_error('title'); ?> 
     <label>Page Title:</label><input type="text" maxlength="100" name="title" value="<?php echo $page->row('title');?>" /> 
    </div> 

    <div class="textarea"> 
     <?php echo form_error('content'); ?> 
     <label>Page Content:</label><textarea name="content"><?php echo $page->row('content');?></textarea> 
    </div> 

    <div class="no"> 
     <input type="submit" value="Submit"/> 
    </div> 

</form> 

Dalej, mam odpowiedni Funkcja CI:

function edit_page($id) 
{ 
    $this->form_validation->set_rules('title', 'Title', 'trim|required|max_length[50]'); 
    $this->form_validation->set_rules('content', 'Content', 'trim|required'); 

    // If validation has failed... 
    if ($this->form_validation->run() == FALSE) 
    { 
     $data['page'] = $this->gallery_model->get_page($id); 

     $this->load->view('admin/header'); 
     $this->load->view('admin/editpage', $data); 
     $this->load->view('admin/footer'); 
    } 
    else // Validation successful 
    { 
     $title = $this->input->post('title'); 
     $content = $this->input->post('content'); 
     $this->gallery_model->edit_page($id, $title, $content); 
     redirect('admin'); 
    } 

} 

Wszystko OK tak daleko, tak? Oto, gdzie zaczyna się szalony problem.

  • mogę „ręcznie” wpisz wszelkie dane Lubię w polu zawartości. Klikam Prześlij, wszystkie prace zgodnie z oczekiwaniami - baza danych jest aktualizowana o moje nowe dane, wszystko jest dobre na świecie.
  • Potrafię skopiować i wkleić 15 akapitów Lorem Ipsum lub cokolwiek innego w polu. Hit, hooray.
  • Jednak: - Próbuję skopiować i wkleić zawartość ze strony klienta, szczególnie ta strona: http://jeremywebbphotography.com/biog.php - Aktualizuję jego witrynę, ponieważ moje umiejętności programistyczne znacznie się poprawiły. Oto, gdzie rzeczy idą dziwnie - po naciśnięciu save after copy-pasting to, formularz przeładowuje, pojawia się błąd "Pole zawartości jest wymagane", a moja kopia-wklej do pola znika.
  • Jeśli biegnę WebKit inspektor na trybie sieciowym i uchwycić żądanie przesłania formularza, mogę wyraźnie zobaczyć mój egzemplarz wklejony tekst w tablicy $ _POST ...
  • Jeśli jednak zacznę mój edit_page funkcję z die("Content is ".$_POST['content']); - IT USUNIĘTO SIEBIE. Dane wyjściowe mówią dosłownie "Content is". To wszystko.
  • Powyższe działa zgodnie z oczekiwaniami w polu title - wpływa tylko na treść.
  • Rozumiem, że mogą istnieć jakieś zabawne znaki specjalne lub coś, co powoduje to w kopiowanej zawartości (nawet jeśli nie ma) - ale jeśli ją skopiujesz i wkleisz, usuń najpierw wszystko aż do pierwszego słowa " Biog ", następnie prześlij (więc dosłownie przesyłasz jedną linię), to samo dzieje się nadal!.

WTF trwa ?!

Czego potwierdziły to nie jest:

  • Moja przeglądarka (najnowszy Chrome Dev Mac OS X Snow Leopard - próbował w Safari i Firefox, ten sam problem)
  • CI XSS filtrowania lub bezpieczeństwa Dezynfekcja - wszystko to zniknęło, bez powodzenia
  • Zatwierdzenie formularza CI. Wyłączyłem to również.
  • Dane, które przesyłam (rodzaj) - patrz końcowy punkt opisowy.
  • Próbowano również uruchamiać htmlspecialchars i htmlentities poprzez zasady sprawdzania poprawności formularzy, bez cygara.

Dzięki za pomoc. Aby wyjaśnić, oto zrzut ekranu jak jestem skopiowanie i wklejenie go:

How I'm copy-pasting

- i wreszcie, szybki zrzut rzeczywistego wyjścia stronę po złożeniu (sorry about (Nic na terenie hotelu, prawda?) z wonks CSS, pracuję na nim):

How it looks

+0

Jaka jest wartość "post_max_size" i "suhosin.post.max_value_length" (jeśli zainstalowano suhosin)? – netcoder

+0

Właśnie zaktualizowałem moje pytanie około 10 sekund temu - myślę, że udało mi się ustalić, co to jest. Suhosin nie jest zainstalowany (na razie jest to MAMP), nie myśl, że "post_max_size" jest istotny, ponieważ przesłałem znacznie więcej danych (15 pasów) Lipsum. – Jack

+0

Jakiego zestawu znaków używa strona formularza? – netcoder

Odpowiedz

1

Proponuję użyć biblioteki Text Helper i używać jej ascii_to_entities funkcję:

$this->load->helper('text'); 
$content = $this->input->post('content'); 
$content = ascii_to_entities($content); 


ascii_to_entities():

przeliczać ASCII podmiotom znaków, w tym wysokiej znaków MS Word ASCII i które mogą powodować problemy podczas korzystania ze strony internetowej, dzięki czemu mogą być wyświetlane konsekwentnie niezależnie od ustawień przeglądarki lub zapisanych r pewnie w bazie danych. Istnieje pewna zależność od obsługiwanych zestawów znaków serwera, więc może nie być w 100% niezawodny we wszystkich przypadkach, ale w większości przypadków powinien poprawnie identyfikować znaki spoza zakresu normalnego (jak znaki akcentowane).

2

Nie wiem, czy pomogłoby to w ogóle, ale spróbuj użyć $this->input->post('postvar') zamiast $_POST['postvar']. Wierzę, że CodeIgniter używa tej funkcji do prawidłowego odkażania i kodowania danych pocztowych.