Mam problemy z zapytaniem wstawiania w MySQL. Oto, co chcę zrobić:

W jednym z pól w mojej tabeli chcę wstawić kilka adresów URL i ich tytuły. Buduję to zapytanie w ten sposób:

?content=<title of webpage>%%<url of webpage>%%<title of webpage>%%<url of webpage>%%

I tak dalej, w zależności od liczby adresów URL.

Problem polega na tym, że jeśli adres URL zawiera coś takiego jak „?var=jakaśwartość”, moje zapytanie zostanie przerwane, ponieważ MySQL pomyśli, że deklaruję nową zmienną.

Jak mogę to osiągnąć?

0
jnfr 11 czerwiec 2011, 20:59
1
Jakiego kodu używasz do wstawiania tych danych?
 – 
Pekka
11 czerwiec 2011, 21:00
2
Czy zestaw narzędzi bazy danych PHP zawiera symbole zastępcze? To, co wygląda na problem, jest w rzeczywistości DUŻYM problemem. W obecnej konfiguracji jesteś narażony na ataki typu SQL injection, jeśli jeden „URL” zawierał złośliwą składnię SQL.
 – 
DavidO
11 czerwiec 2011, 21:13
Konstruuję zapytanie w JavaScript, a następnie używam AJAX do przekazania go do funkcji PHP w celu wstawienia do bazy danych MySQL
 – 
jnfr
11 czerwiec 2011, 22:19
Okej, myślę, że konstruowanie zapytania w JavaScript to zła praktyka. Zdecydowałem się na użycie metody PHP form POST z mysql_real_escape_string po stronie serwera i działa świetnie. Dziękuję!
 – 
jnfr
11 czerwiec 2011, 23:43

2 odpowiedzi

Najlepsza odpowiedź

Myślę, że powinieneś uciec od sekwencji za pomocą \

Jeśli używasz PHP, możesz użyć następującego polecenia (ma wiele form):

  • Styl proceduralny

    string mysqli_real_escape_string ( mysqli $link , string $escapestr )
    
  • Styl obiektowy

    string mysqli::escape_string ( string $escapestr )
    
    string mysqli::real_escape_string ( string $escapestr )
    
0
Andrei Sfat 12 czerwiec 2011, 11:24

Oto jak używać symboli zastępczych w PHP (który podejrzewam, że jest językiem, którego używasz)

$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $value);

$name = 'one';
$value = 1;
$stmt->execute();

Pobrałem to z php.net

Symbole zastępcze, korzystające z przygotowanych instrukcji, pełnią kilka funkcji, ale jedną z nich jest bezpieczne oddzielenie danych od kodu, aby zniknął problem, który opisujesz.

Cytując z wyżej wymienionej strony:

Parametry przygotowanych sprawozdań nie muszą być cytowane; kierowca zajmuje się tym automatycznie. Jeśli aplikacja korzysta wyłącznie z przygotowanych instrukcji, programista może mieć pewność, że nie nastąpi wstrzyknięcie SQL (jednak jeśli inne części zapytania są budowane z nieuniknionymi danymi wejściowymi, wstrzyknięcie SQL jest nadal możliwe).

0
DavidO 11 czerwiec 2011, 23:53