Te doy la bienvenida a nuestra comunidad, en este sitio vas a hallar la respuesta de lo que buscabas.
Solución:
Las comillas inversas se deben usar para identificadores de tablas y columnas, pero solo son necesarios cuando el identificador es una palabra clave reservada de MySQL, o cuando el identificador contiene caracteres de espacio en blanco o caracteres más allá de un conjunto limitado (ver más abajo) A menudo se recomienda evitar el uso de palabras clave reservadas como identificadores de columna o tabla cuando sea posible, evitando el problema de las citas.
Deben usarse comillas simples para string valores como en el VALUES()
lista. Las comillas dobles son compatibles con MySQL para string valores también, pero las comillas simples son más aceptadas por otros RDBMS, por lo que es un buen hábito usar comillas simples en lugar de dobles.
MySQL también espera DATE
y DATETIME
valores literales para ser comillas simples como cadenas como '2001-01-01 00:00:00'
. Consulte la documentación de Literales de fecha y hora para obtener más detalles, en particular, alternativas al uso del guión. -
como un delimitador de segmento en cadenas de fechas.
Entonces, usando su ejemplo, citaría dos veces el PHP string y use comillas simples en los valores 'val1', 'val2'
. NULL
es una palabra clave de MySQL, y un valor especial (no), y por lo tanto no está entre comillas.
Ninguno de estos identificadores de tabla o columna son palabras reservadas o utilizan caracteres que requieren comillas, pero los he citado de todos modos con comillas invertidas (más sobre esto más adelante …).
Funciones nativas del RDBMS (por ejemplo, NOW()
en MySQL) no deben citarse, aunque sus argumentos están sujetos a la misma string o reglas de citación de identificadores ya mencionadas.
Backtick (`) table & column ───────┬─────┬──┬──┬──┬────┬──┬────┬──┬────┬──┬───────┐ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ $query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`, `updated`) VALUES (NULL, 'val1', 'val2', '2001-01-01', NOW())"; ↑↑↑↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑↑↑↑↑ Unquoted keyword ─────┴┴┴┘ │ │ │ │ │ │ │││││ Single-quoted (') strings ───────────┴────┴──┴────┘ │ │ │││││ Single-quoted (') DATE ───────────────────────────┴──────────┘ │││││ Unquoted function ─────────────────────────────────────────┴┴┴┴┘
Interpolación variable
Los patrones de cotización para las variables no cambian, aunque si tiene la intención de interpolar las variables directamente en un string, debe estar entre comillas dobles en PHP. Solo asegúrese de haber escapado correctamente las variables para su uso en SQL. (Se recomienda utilizar una API que admita declaraciones preparadas en su lugar, como protección contra la inyección de SQL).
// Same thing with some variable replacements // Here, a variable table name $table is backtick-quoted, and variables // in the VALUES list are single-quoted $query = "INSERT INTO `$table` (`id`, `col1`, `col2`, `date`) VALUES (NULL, '$val1', '$val2', '$date')";
Declaraciones preparadas
Cuando trabaje con declaraciones preparadas, consulte la documentación para determinar si se deben citar o no los marcadores de posición de la declaración. Las API más populares disponibles en PHP, PDO y MySQLi, esperan no cotizado marcadores de posición, al igual que la mayoría de las API de declaraciones preparadas en otros idiomas:
// PDO example with named parameters, unquoted
$query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`) VALUES (:id, :col1, :col2, :date)";
// MySQLi example with ? parameters, unquoted
$query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`) VALUES (?, ?, ?, ?)";
Caracteres que requieren comillas invertidas en identificadores:
De acuerdo con la documentación de MySQL, no es necesario que entre comillas (comillas inversas) los identificadores con el siguiente conjunto de caracteres:
ASCII:
[0-9,a-z,A-Z$_]
(letras latinas básicas, dígitos 0-9, dólar, guión bajo)
Puede utilizar caracteres más allá de ese conjunto como identificadores de tabla o columna, incluidos los espacios en blanco, por ejemplo, pero luego debe citar (tildar al revés) ellos.
Además, aunque los números son caracteres válidos para identificadores, los identificadores no pueden consistir únicamente en números. Si lo hacen, deben estar envueltos en comillas invertidas.
Hay dos tipos de citas en MySQL:
'
para encerrar string literales`
para incluir identificadores como nombres de tablas y columnas
Y luego esta "
que es un caso especial. Podría usarse para uno de los propósitos mencionados anteriormente a la vez, según el servidor MySQL sql_mode
:
- Por defecto los
"
El carácter se puede utilizar para encerrar string literales como'
- En
ANSI_QUOTES
modo el"
El carácter se puede utilizar para encerrar identificadores como`
La siguiente consulta producirá diferentes resultados (o errores) según el modo SQL:
SELECT "column" FROM table WHERE foo = "bar"
ANSI_QUOTES inhabilitado
La consulta seleccionará el string literal "column"
donde columna foo
es igual a string "bar"
ANSI_QUOTES habilitado
La consulta seleccionará la columna column
donde columna foo
es igual a la columna bar
Cuando usar que
- Te sugiero que evites usar
"
para que su código se vuelva independiente de los modos SQL - Siempre cite identificadores ya que es una buena práctica (bastantes preguntas sobre SO discuten esto)
(Hay buenas respuestas arriba con respecto a la naturaleza SQL de su pregunta, pero esto también puede ser relevante si es nuevo en PHP).
Quizás es importante mencionar que PHP maneja cadenas entre comillas simples y dobles de manera diferente …
Las cadenas entre comillas simples son ‘literales’ y son más o menos cadenas WYSIWYG. PHP interpreta las cadenas entre comillas dobles para una posible sustitución de variables (las comillas invertidas en PHP no son exactamente cadenas; ejecutan un comando en el shell y devuelven el resultado).
Ejemplos:
$foo = "bar";
echo 'there is a $foo'; // There is a $foo
echo "there is a $foo"; // There is a bar
echo `ls -l`; // ... a directory list
Sección de Reseñas y Valoraciones
Si sostienes algún titubeo y forma de mejorar nuestro post eres capaz de escribir una observación y con placer lo ojearemos.