2013-06-26 10 views
5

Zapisuję numer SQL query w tabeli bazy danych, więc zapisuję kryteria, które mają być używane bez względu na to, czy do bazy danych wprowadzono więcej rekordów.Jak zapisać zapytanie SQL do tabeli?

Czy istnieje poprawny typ danych i składnia do użycia w celu przechowywania instrukcji zapytania. Ustawiłem typ danych jako VARCHAR(1055), ponieważ uważam, że to wystarczy. Czy istnieje MySQL function, który upewni się, że tekst jest poprawnie zapisany pod względem cytatów i pojedynczego ciągu znaków.

Aktualizacja: Powód do zapisywania zapytania

możemy pozwolić użytkownikom systemu, aby utworzyć listę danych kontaktowych opartych na innych użytkowników systemu, więc one tworzyć zapytania przy użyciu formularza, aby wybrać powiedzieć wszyscy użytkownicy z rodzaj pracy wykonawczej.

Powyższa kwerenda jest następnie zapisywana w bazie danych, dzięki czemu nawet w przypadku dodania nowego użytkownika do typu zadania wykonawczego jego dane kontaktowe będą uwzględniane podczas wysyłania wiadomości.

Myślę, że jest to najlepszy sposób na zrobienie tego ... czy masz jakieś pomysły?

+0

Skąd to zapisujesz? Bezpośrednio z konsoli? Z PHP? Z PhpMyAdmin? –

+0

Zapytanie SQL samo w sobie jest po prostu łańcuchem, więc 'varchar' wydaje mi się właściwym typem danych. Zapisanie zapytania jest jednak bardzo nietypowe. Wyobrażam sobie, że istnieje lepszy sposób na zrealizowanie tego, co próbujesz osiągnąć. Wydaje się również, że tworzysz dodatkowe potencjalne punkty wstrzykiwania SQL w swojej aplikacji, więc będziesz chciał upewnić się, że instrukcje są odpowiednio oczyszczone. – David

+0

Z PHP sprawdź aktualny powód zapytania – surfer190

Odpowiedz

3

VARCHAR(1055) nigdy nie będzie wystarczająco. Po prostu użyj TEXT, typu danych MySQL dla tekstu o dowolnej długości (zwanego również CLOB w innych bazach danych).

Więcej informacji tła:

Niemniej jednak, myślę, że powinieneś modelować zapytanie w taki czy inny sposób w warstwie aplikacji, zamiast przechowywania zwykły tekst SQL w bazie danych . Po zmianie schematu wszystkie te instrukcje SQL mogą być niepoprawne. Powodzenia, więc migracja!

Inną wadą twojego podejścia jest to, że tworzysz duży problem bezpieczeństwa, jeśli użytkownicy mogą wprowadzać dowolny kod SQL. Sprytne stażysta którego umowa nie została przedłużona może przechowywać

DROP DATABASE my_database. 
+0

Cóż, myślę, że chroniłem przed tym, nie dopuszczając bezpośredniego wpisu SQI i nigdy nie zamieszczam zapytania, jest ono przechowywane w zmiennych sesji i jest generowane przez system. – surfer190

+0

@ StephenH: Chciałem tylko mieć pewność. –

1

Brak prawidłowego typu danych do zapisania zapytania.

Ale zawsze można usunąć znaki HTML za pomocą znaków HTML-code.

Albo można użyć PHP htmlentities() konwertować znaki

0

Wierzę, że to nie jest właściwe podejście. Nie należy przechowywać wynikowego zapytania w bazie danych, ale zamiast tego należy przechowywać parametry, które spowodowały utworzenie tego sql. W swojej implementacji, gdy chcesz zmienić to zapytanie, musisz przeanalizować przechowywany kod SQL, aby pobrać parametry, aby wyświetlić formularz filtru dla użytkownika.Jednak jeśli zachowasz swoje parametry, zawsze możesz zregenerować zapytanie w razie potrzeby i łatwo możesz wyświetlić bieżący formularz filtra.

Jeśli upierasz się przy zapisywaniu swojego SQL tho, jak wspomniano wcześniej, TEKST jest poprawnym typem pola, ponieważ znacznie mniej prawdopodobne jest odcięcie łańcucha sql przy limicie wielkości pola.