2011-09-22 14 views
6

Dostaję dane do mojej bazy danych bez żadnego problemu, używając mysql_real_escape_string.W PHP, jak utworzyć kwerendę mySQL select, która zawiera zarówno cudzysłowy, jak i apostrofy?

Więc wpis w bazie danych mogą być:

1/4" Steve's lugnuts 

Więc to doskonale w bazie danych.
Teraz chcę wyszukać dokładnie to. Ale zepsułoby to albo "albo" (próbowałem wielu rzeczy, i zawsze gdzieś się męczę).

Oto, co mam teraz: (user_input pochodzi z formularza na poprzednia strona)

$user_input=mysql_real_escape_string($_REQUEST['user_input']); 
$search_row=mysql_query("SELECT * FROM some_table WHERE some_column LIKE '%$user_input%' "); 
while($search = mysql_fetch_array($search_row)) 
      {stuff happens} 

echo "<form action='search_results.php' method='post'>"; 
echo "<input name='user_input' type='text' size='50' value='" . $user_input. "'>"; 
echo "<input type='submit' value='Lookup Parts' />"; 
echo "</form>"; 

Ale problem w tym, że nie może wydawać się stać bynajmniej błędów
polu wyszukiwania (który ma wypełnić z tego, co już umieścić w) po prostu ma.

1/4\" Steve\ 

Co robię? g źle?

Odpowiedz

5

pole wyszukiwania (który ma wypełnić z tego, co już umieścić w) ma tylko 1/4\" Steve\

oczywiście ma!
Złapałeś ucieczkę. mysql_real_escape_string jest tylko dla SQL! ale używasz jego wyniku dla html. Podczas gdy w HTMLu musisz użyć zupełnie innego sposobu ucieczki.

więc uczynić go

$user_input=mysql_real_escape_string($_REQUEST['user_input']); 
$search_row=mysql_query("SELECT * FROM some_table WHERE some_column LIKE '%$user_input%' "); 
while($search = mysql_fetch_array($search_row)) 
      {stuff happens} 


$user_input =htmlspecialchars($_REQUEST['user_input'],ENT_QUOTES); // here it goes 

echo "<form action='search_results.php' method='post'>"; 
echo "<input name='user_input' type='text' size='50' value='$user_input'>"; 
echo "<input type='submit' value='Lookup Parts' />"; 
echo "</form>"; 

również pamiętać, że nie ma sensu w powtarzając takie duże kawałki HTML. Tylko blisko tag PHP i następnie napisać czysty HTML:

?> 
<form action='search_results.php' method='post'> 
<input name='user_input' type='text' size='50' value='<?=$user_input?>'> 
<input type='submit' value='Lookup Parts' /> 
</form> 

Wygląda o wiele bardziej przejrzysty, czytelny i wygodny

+0

To jest dokładnie ten problem, który miałem. Chciałbym móc wybrać dwie odpowiedzi, ponieważ chociaż doskonale pasowało to do mojego konkretnego problemu, odpowiedź Tomasa T. była bardzo pouczająca i prawdopodobnie ludzie będą również poszukiwać, kiedy tu dotrą. Dzięki za tonę! –

+0

Również ... o tym, że wszystkie są echem PHP ... To wszystko jest w pętli rekursywnej w PHP w każdym razie - Nie sądzę, że mogę wyjść z PHP bez bałagania tego typu rzeczy. –

+0

nie ma absolutnie nic do zepsucia. Wszystko będzie dobrze w pętli. –

-1

Wydrukuj swój sentece "SELECT * FROM some_table WHERE some_column LIKE '% $ user_input%'", aby zobaczyć, co robi (i ucieka).

Nie rozwiązanie, ale spójrz na mysqli lub pdo (http://stackoverflow.com/questions/548986/mysql-vs-mysqli-in-php), mają narzędzia do przygotowanych oświadczeń.

0

Nie wiem, czy to na pewno pomoże, ale czy nie należy uciec na kwerendę i innym razem na html?

$query = sprintf("SELECT * FROM some_table WHERE some_column LIKE '%s' ", mysql_real_escape_string($user_input)); 

echo "<input name='user_input' type='text' size='50' value='".htmlentities($user_input)."'>"; 

edit

być może nie chcesz zmienić (escape) Twój wkład ($ user_input) za każdym przesłaniu ..although jeśli jej tylko "i" ów wpływ może nie znaczenia, tak czy owak

+0

tak, ale myślę, że OP również ma problemy z zapytaniem. – roymustang86

+0

Niestety to nie działa. Otrzymuję Ostrzeżenie: mysql_query() oczekuje, że parametr 2 będzie zasobem, łańcuch podany w search_results.php w wierszu 19, a także Ostrzeżenie: mysql_fetch_array() oczekuje, że parametr 1 będzie zasobem, wartość null podana w search_results.php na linii 20 . ..i być może najbardziej wymowny ... Dane, które mi przekazałeś, dają dokładnie to samo, co mam, gdzie pole wyszukiwania zawiera tylko 1/4 "Steve'a zamiast 1/4" lugnuts Steve'a. –

+0

i użyłeś pierwszej części, którą napisałem później, jak: $ search_row = mysql_query ($ query); a następnie przez chwilę ...? –

4

Cóż, problem jest właściwa cytując. Twój problem polega na tym, że potrzebujesz różnych cytowań dla MySQL i HTML, a ty prawdopodobnie możesz również ustawić magic_quotes_gpc!Przy cytowaniu, ty zawsze zacytować tekst na jakąś szczególną moc, jak:

  1. wartości ciągu dla zapytania mysql
  2. like wyrażenie kwerendy mysql
  3. Kod html
  4. json
  5. mysql wyrażenie regularne
  6. php wyrażenie regularne

Dla każdego przypadku potrzebujesz innego cytowania, ponieważ każde użycie jest obecne w innym kontekście składni. Oznacza to również, że cytowanie nie powinno być dokonywane na wejściu do PHP, ale na konkretnym wyjściu! Z tego powodu funkcje takie jak magic_quotes_gpc są zepsute (upewnij się, że jest wyłączone !!!).

Jakich metod można użyć do cytowania w tych konkretnych przypadkach? (Zapraszam do mnie poprawić, nie może być bardziej nowoczesne metody, ale one pracują dla mnie)

  1. mysql_real_escape_string($str)
  2. mysql_real_escape_string(addcslashes($str, "%_"))
  3. htmlspecialchars($str)
  4. json_encode() - tylko dla utf8! Używam mojej funkcji dla iso-8859-2
  5. mysql_real_escape_string(addcslashes($str, '^.[]$()|*+?{}')) - nie możesz użyć preg_quote w tym przypadku, ponieważ ukośnik odwrócony byłby dwa razy!
  6. preg_quote()

EDIT: W odniesieniu do pierwotnego pytania - jeśli poprawić podając, można to oczywiście używać żadnych znaków w ciągi, w tym pojedyncze i podwójne cudzysłowy.

+1

To jest * naprawdę * dobra odpowiedź! Jest to rzecz, która sprawia, że ​​ludzie chcą używać StackOverflow, myślę -! Chociaż Col. Shrapnel odpowiedział na moje pytanie konkretnie, było to OGROMNE w swoim zakresie, i będę często odwoływał się do twojej odpowiedzi. Awansuj dla Ciebie! –