Próbuję nauczyć się najlepszego sposobu pisania zapytań. Rozumiem także znaczenie zachowania spójności. Do tej pory losowo używałem pojedynczych cudzysłowów, podwójnych cudzysłowów i odwrotnych zwrotów bez jakiejkolwiek realnej myśli.
Przykład:
$query = 'INSERT INTO table (id, col1, col2) VALUES (NULL, val1, val2)';
Ponadto, w powyższym przykładzie, uważają, że table
, col1
, val1
, itd. Mogą być zmienne.
Jaki jest na to standard? Co robisz?
Czytam tutaj odpowiedzi na podobne pytania przez około 20 minut, ale wydaje się, że nie ma ostatecznej odpowiedzi na to pytanie.
"tablename"
Pojedyncze cudzysłowy są dla literałów, np'this is a some text'
. Znaczniki wsteczne nigdy nie są używane w standardowym języku SQL. (Jeśli chcesz podać podwójny cudzysłów w identyfikatorze, wpisz go dwa razy jako"odd""tablename"
. Podobnie, podwójne pojedyncze cudzysłowy w literałach, jak'Conan O''Brien'
.)Odpowiedzi:
Znaki wsteczne należy stosować do identyfikatorów tabeli i kolumny, ale są one konieczne tylko wtedy, gdy identyfikator jest słowem kluczowym zastrzeżonym MySQL lub gdy identyfikator zawiera znaki spacji lub znaki spoza ograniczonego zestawu (patrz poniżej) Często zaleca się unikanie używania zastrzeżonych słów kluczowych w miarę możliwości jako identyfikatory kolumn lub tabel, unikając problemu cytowania.
W przypadku ciągów znaków, takich jak na
VALUES()
liście, należy używać pojedynczych cudzysłowów . Podwójne cudzysłowy są obsługiwane przez MySQL również dla wartości ciągów, ale pojedyncze cudzysłowy są szerzej akceptowane przez inne RDBMS, więc dobrym zwyczajem jest stosowanie pojedynczych cudzysłowów zamiast podwójnych.MySQL oczekuje także
DATE
iDATETIME
wartości literalne być jedno-cytowany jako ciągi znaków, takich jak'2001-01-01 00:00:00'
. Zapoznaj się z dokumentacją literatury daty i godziny, aby uzyskać więcej szczegółów, w szczególności alternatywy dla używania łącznika-
jako ogranicznika segmentu w ciągach daty.Korzystając z twojego przykładu, zacytowałbym podwójnie ciąg PHP i użyłem pojedynczych cudzysłowów na wartościach
'val1', 'val2'
.NULL
jest słowem kluczowym MySQL i specjalną (nie) wartością, dlatego nie jest cytowany.Żaden z tych identyfikatorów tabeli lub kolumny nie jest słowem zastrzeżonym ani nie wykorzystuje znaków wymagających cytowania, ale i tak zacytowałem je za pomocą odwrotnych znaków (więcej o tym później ...).
Funkcje rodzime dla RDBMS (na przykład
NOW()
w MySQL) nie powinny być cytowane, chociaż ich argumenty podlegają tym samym regułom cytowania ciągów znaków lub identyfikatorów, o których już wspomniano.Zmienna interpolacja
Wzory cytowania dla zmiennych nie zmieniają się, chociaż jeśli zamierzasz interpolować zmienne bezpośrednio w ciągu, musi być on podwójnie cytowany w PHP. Po prostu upewnij się, że poprawnie zmieniłeś znaczenia zmiennych do użycia w SQL. ( Zalecane jest użycie zamiast tego interfejsu API obsługującego przygotowane instrukcje, jako zabezpieczenia przed wstrzyknięciem SQL ).
Przygotowane wyciągi
Podczas pracy z przygotowanymi wyciągami zapoznaj się z dokumentacją, aby ustalić, czy należy wstawić symbole zastępcze wyciągów. Najbardziej popularnym API dostępne w PHP, PDO i MySQLi spodziewać nienotowanych zastępcze, jak większość przygotowanych API oświadczenie w innych językach:
Znaki wymagające cytowania wstecznego w identyfikatorach:
Zgodnie z dokumentacją MySQL nie trzeba cytować identyfikatorów (backtick) przy użyciu następującego zestawu znaków:
Możesz użyć znaków poza tym zestawem jako identyfikatorów tabeli lub kolumn, w tym na przykład białych znaków, ale musisz je zacytować (cofnąć).
źródło
Istnieją dwa typy cytatów w MySQL:
'
do dołączania literałów łańcuchowych`
do dołączania identyfikatorów, takich jak nazwy tabel i kolumnI
"
jest jeszcze jeden przypadek szczególny. Może być używany jednocześnie do jednego z wyżej wymienionych celów, w zależności od serwera MySQLsql_mode
:"
postać może być stosowane do osłaniania literały ciągów podobnie jak'
ANSI_QUOTES
trybie"
znak może być używany do otaczania identyfikatorów podobnie jak`
Poniższe zapytanie spowoduje wygenerowanie różnych wyników (lub błędów) w zależności od trybu SQL:
ANSI_QUOTES wyłączone
Zapytanie wybierze literał ciągu, w
"column"
którym kolumnafoo
jest równa łańcuchowi"bar"
Włączono ANSI_QUOTES
Zapytanie wybierze kolumnę, w
column
której kolumnafoo
jest równa kolumniebar
Kiedy używać czego
"
, aby twój kod stał się niezależny od trybów SQLźródło
(Powyżej są dobre odpowiedzi dotyczące natury SQL twojego pytania, ale może to być również istotne, jeśli nie znasz PHP.)
Być może warto wspomnieć, że PHP obsługuje łańcuchy jedno- i podwójnie cudzysłowy inaczej ...
Ciągi cytowane są „literałami” i są właściwie ciągami WYSIWYG. Łańcuchy z podwójnym cudzysłowem są interpretowane przez PHP pod kątem możliwego podstawienia zmiennych (backticks w PHP nie są dokładnie łańcuchami; wykonują polecenie w powłoce i zwracają wynik).
Przykłady:
źródło
Wsteczne są zwykle używane do wskazania
identifier
i, jak również, są bezpieczne przed przypadkowym użyciem Zarezerwowanych słów kluczowych .Na przykład:
W tym przypadku backticks pomoże serwerowi zrozumieć, że
database
w rzeczywistości jest to nazwa bazy danych, a nie identyfikator bazy danych.To samo można zrobić dla nazw tabel i nazw pól. Jest to bardzo dobry nawyk, jeśli otacza się identyfikator bazy danych backtickami.
Teraz o podwójnych cytatach i pojedynczych cytatach (Michael już o tym wspomniał).
Ale aby zdefiniować wartość, musisz użyć pojedynczego lub podwójnego cudzysłowu. Zobaczmy inny przykład.
Tutaj celowo zapomniałem zawrzeć
title1
cytaty. Teraz serwer przyjmietitle1
jako nazwę kolumny (tj. Identyfikator). Aby wskazać, że jest to wartość, musisz użyć podwójnego lub pojedynczego cudzysłowu.Teraz, w połączeniu z PHP, podwójne cudzysłowy i pojedyncze cudzysłowy znacznie ułatwiają pisanie zapytań. Zobaczmy zmodyfikowaną wersję zapytania w twoim pytaniu.
Teraz, używając podwójnych cudzysłowów w PHP, utworzysz zmienne
$val1
i$val2
użyjesz ich wartości, tworząc w ten sposób idealnie poprawne zapytanie. Lubićzrobi
źródło
MySQL, symbole te są wykorzystywane do oddzielania zapytanie
`
,"
,'
i()
."
lub'
są używane do dołączania wartości podobnych do łańcucha"26-01-2014 00:00:00"
lub'26-01-2014 00:00:00'
. Symbole te są tylko dla ciągi, funkcje zagregowane nie podobanow
,sum
albomax
.`
służy do dołączania nazw tabel lub kolumn, npselect `column_name` from `table_name` where id='2'
(
i)
po prostu dołącz części zapytania, npselect `column_name` from `table_name` where (id='2' and gender='male') or name='rakesh'
.źródło
Literały łańcuchowe w MySQL i PHP są takie same.
Więc jeśli ciąg zawiera pojedyncze cudzysłowy, możesz użyć podwójnych cudzysłowów, aby zacytować ciąg, lub jeśli zawiera podwójne cudzysłowy, możesz użyć pojedynczych cudzysłowów, aby zacytować ciąg. Ale jeśli ciąg zawiera zarówno pojedyncze cudzysłowy, jak i podwójne cudzysłowy, musisz uciec od tego, który był używany do cytowania tego ciągu.
Najczęściej używamy pojedynczych cudzysłowów dla wartości ciągu SQL, więc musimy używać podwójnych cudzysłowów dla ciągu PHP.
I możesz użyć zmiennej w podwójnie cytowanym ciągu PHP:
Ale jeśli
$val1
lub$val2
zawiera pojedyncze cudzysłowy, spowoduje to, że SQL będzie niepoprawny. Więc musisz uciec przed użyciem go w sql; po tomysql_real_escape_string
jest. (Chociaż przygotowane oświadczenie jest lepsze.)źródło
W połączeniu z PHP i MySQL podwójne cudzysłowy i pojedyncze cudzysłowy znacznie ułatwiają pisanie zapytań.
Załóżmy teraz, że używasz zmiennej post post do zapytania MySQL, użyj go w następujący sposób:
Jest to najlepsza praktyka wykorzystywania zmiennych PHP w MySQL.
źródło
Było tu wiele pomocnych odpowiedzi, których kulminacją są dwa punkty.
ORAZ jak powiedział @MichaelBerkowski
Zdarzają się jednak przypadki, w których identyfikator nie może być zastrzeżonym słowem kluczowym ani zawierać białych znaków lub znaków poza ograniczonym zestawem, ale koniecznie wymaga od nich odwrotnych znaków .
PRZYKŁAD
123E10
to poprawna nazwa identyfikatora, ale także poprawnaINTEGER
literał.[Nie wchodząc w szczegóły, w jaki sposób uzyskasz taką nazwę identyfikatora], Załóżmy, że chcę utworzyć tymczasową tabelę o nazwie
123456e6
.Brak BŁĘDU w backticks.
BŁĄD, gdy nie używa się backicks.
Jednak
123451a6
jest perfekcyjnie nazwa identyfikator (bez tylnych kleszczy).Dzieje się tak całkowicie, ponieważ
1234156e6
jest to również liczba wykładnicza.źródło
Jeśli tabela cols i wartości są zmiennymi, istnieją dwa sposoby:
W przypadku podwójnych cytatów
""
pełne zapytanie:Lub
Z pojedynczymi cytatami
''
:Użyj znaczników wstecz,
``
gdy nazwa kolumny / wartości jest podobna do słowa kluczowego zastrzeżonego MySQL.Uwaga: jeśli oznaczasz nazwę kolumny nazwą tabeli, użyj tylnych znaczników w następujący sposób:
`table_name`
.`column_name`
<- Uwaga: wyklucz.
z tyknięć.źródło
W przypadku ciągów znaków, takich jak na liście VALUES (), należy używać pojedynczych cudzysłowów.
Znaki wsteczne są zwykle używane do wskazania identyfikatora, a także zabezpieczają przed przypadkowym użyciem zastrzeżonych słów kluczowych.
W połączeniu z PHP i MySQL podwójne cudzysłowy i pojedyncze cudzysłowy znacznie ułatwiają pisanie zapytań.
źródło
Poza wszystkimi (dobrze wyjaśnionymi) odpowiedziami nie wymieniono poniższych pytań i często odwiedzam to pytanie.
W skrócie; MySQL myśli, że chcesz robić matematykę na własnej tabeli / kolumnie i interpretuje łączniki, takie jak „e-mail”, jako
e
minusmail
.Zastrzeżenie: Pomyślałem więc, że dodam to jako odpowiedź „FYI” dla tych, którzy są zupełnie nowi w pracy z bazami danych i mogą nie rozumieć już opisanych terminów technicznych.
źródło
Serwery SQL i MySQL, PostgreySQL, Oracle nie rozumieją podwójnych cudzysłowów („). Dlatego twoje zapytanie powinno być wolne od podwójnych cudzysłowów (”) i powinno używać tylko pojedynczych cudzysłowów (').
Podróż powrotna (`) jest opcjonalna do użycia w SQL i jest używana dla nazwy tabeli, nazwy bazy danych i nazw kolumn.
Jeśli próbujesz napisać zapytanie w swoim zapleczu, aby wywołać MySQL, możesz użyć podwójnego cudzysłowu („) lub pojedynczego cudzysłowu ('), aby przypisać zapytanie do zmiennej, takiej jak:
Jeśli
where
w zapytaniu znajduje się instrukcja i / lub próbainsert
uzyskania wartości i / lubupdate
wartości, która jest łańcuchem, użyj pojedynczego cudzysłowu (') dla takich wartości, jak:Jeśli chcesz uniknąć tego zamieszania, gdy używasz podwójnych cudzysłowów („) i pojedynczych cudzysłowów ('), zalecamy trzymanie się pojedynczych cudzysłowów ('), będzie to obejmować odwrotny ukośnik (), taki jak:
Problem z podwójnymi („) lub pojedynczymi (”) cudzysłowami powstaje, gdy musieliśmy przypisać pewną wartość dynamiczną i wykonać pewne połączenie łańcuchowe, takie jak:
W razie potrzeby postępuj zgodnie z cytatami w JavaScript
źródło