Estoy tratando de aprender la mejor manera de escribir consultas. También entiendo la importancia de ser coherente. Hasta ahora, he utilizado aleatoriamente comillas simples, comillas dobles y comillas inversas sin pensarlo realmente.
Por ejemplo:
$query = 'INSERT INTO table (id, col1, col2) VALUES (NULL, val1, val2)';
Además, en el ejemplo anterior, considera que tabla
, col1
, val1
, etc. pueden ser variables.
¿Cuál es la norma para esto? ¿Qué se hace?
Llevo unos 20 minutos leyendo respuestas a preguntas similares aquí, pero parece que no hay una respuesta definitiva a esta pregunta;
Los signos de retroceso deben usarse para los identificadores de tabla y columna, pero sólo 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 comillas.
Las comillas simples deben usarse para valores de cadena como en la lista VALUES()
. Las comillas dobles son soportadas por MySQL para valores de cadena también, pero las comillas simples son más ampliamente aceptadas por otros RDBMS, por lo que es un buen hábito usar comillas simples en lugar de dobles.
MySQL también espera que los valores literales DATE
y DATETIME
estén entre comillas simples como cadenas como '2001-01-01 00:00:00'
. Consulte la documentación de Date and Time Literals para más detalles, en particular las alternativas al uso del guión -
como delimitador de segmento en las cadenas de fecha.
Así que usando su ejemplo, yo pondría comillas dobles en la cadena PHP y usaría comillas simples en los valores 'val1', 'val2'
. NULL" es una palabra clave de MySQL, y un (no) valor especial, y por lo tanto no está entre comillas.
Ninguno de estos identificadores de tabla o columna son palabras reservadas o hacen uso de caracteres que requieran comillas, pero los he citado de todos modos con comillas (más sobre esto más adelante...).
Las funciones nativas del RDBMS (por ejemplo, NOW()
en MySQL) no deben ser entrecomilladas, aunque sus argumentos están sujetos a las mismas reglas de entrecomillado de cadenas o identificadores ya mencionadas.
Backtick (`) tabla & columna ───────┬┬┬────────────────────────┬───────────┬───────────┬───────────┬──────────────┐ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ $query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`, `updated`) VALUES (NULL, 'val1', 'val2', '2001-01-01', NOW())"; ↑↑↑↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑↑↑↑↑ Palabra clave no cotizada ─────┴┴┴┘ │││││││ │││││ Cadenas de comillas simples (') ───────────┴────┴──┴────┘ │ │ │││││ FECHA entre comillas (') ───────────────────────────┴──────────┘ │││││ Función sin comillas ─────────────────────────────────────────┴┴┴┴ ┴┘
Los patrones de citación para las variables no cambian, aunque si se pretende interpolar las variables directamente en una cadena, ésta debe ser de doble comilla en PHP. Sólo asegúrese de haber escapado adecuadamente las variables para su uso en SQL. (Se recomienda usar una API que soporte sentencias preparadas en su lugar, como protección contra la inyección SQL).
Lo mismo con algunos reemplazos de variables
// Aquí, el nombre de la tabla variable $table está entre comillas, y las variables
// en la lista VALUES están entre comillas simples
$query = "INSERT INTO $table
(id
, col1
, col2
, date
) VALUES (NULL, '$val1', '$val2', '$date')";
Cuando trabaje con sentencias preparadas, consulte la documentación para determinar si los marcadores de posición de la sentencia deben ser citados o no. Las APIs más populares disponibles en PHP, PDO y MySQLi, esperan marcadores de posición sin comillas, al igual que la mayoría de las APIs de sentencias preparadas en otros lenguajes:
// 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 (?, ?, ?, ?)";
Según la documentación de MySQL, no es necesario entrecomillar (backtick) los identificadores que utilizan 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 que vayan más allá de ese conjunto como identificadores de tabla o columna, incluyendo espacios en blanco, por ejemplo, pero entonces debe entrecomillarlos (ponerles la contrapartida).
Las marcas de verificación se utilizan generalmente para indicar un identificador
y así estar a salvo de utilizar accidentalmente las Palabras clave reservadas.
Por ejemplo:
Use `database`;
En este caso, los puntos suspensivos ayudarán al servidor a entender que la "base de datos" es en realidad el nombre de la base de datos, no el identificador de la misma.
Lo mismo puede hacerse con los nombres de las tablas y los campos. Este es un buen hábito si envuelve el identificador de la base de datos con puntos suspensivos.
Compruebe la respuesta de este para entender más sobre los puntos suspensivos.
Ahora sobre las comillas dobles & comillas simples (Michael ya lo ha mencionado).
Pero, para definir un valor tienes que usar comillas simples o dobles. Veamos otro ejemplo.
INSERT INTO `tablename` (`id, `title`) VALUES ( NULL, title1);
Aquí he olvidado deliberadamente envolver el título1
con comillas. Ahora el servidor tomará el título1
como un nombre de columna (es decir, un identificador). Por lo tanto, para indicar que es un valor hay que usar comillas dobles o simples.
INSERT INTO `tablename` (`id, `title`) VALUES ( NULL, 'title1');
Ahora, en combinación con PHP, las comillas dobles y las comillas simples facilitan mucho el tiempo de escritura de la consulta. Veamos una versión modificada de la consulta en su pregunta.
$query = "INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, '$val1', '$val2')";
Ahora, usando comillas dobles en el PHP, harás que las variables $val1
, y $val2
usen sus valores creando así una consulta perfectamente válida. Como
$val1 = "my value 1";
$val2 = "my value 2";
$query = "INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, '$val1', '$val2')";
hará que
INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, 'my value 1', 'my value 2')
Si las cols de la tabla y los valores son variables, hay dos maneras:
Con comillas dobles `""la consulta completa:
$query = "INSERT INTO $table_name (id, $col1, $col2)
VALUES (NULL, '$val1', '$val2')";
O
$query = "INSERT INTO ".$table_name." (id, ".$col1.", ".$col2.")
VALUES (NULL, '".$val1."', '".$val2."')";
Con comillas simples ''
:
$query = 'INSERT INTO '.$table_name.' (id, '.$col1.', '.$col2.')
VALUES (NULL, '.$val1.', '.$val2.')';
Utilice las comillas traseras ``` ``` cuando un nombre de columna/valor sea similar a una palabra clave reservada de MySQL.
Nota: Si está denotando un nombre de columna con un nombre de tabla, utilice las marcas de retorno de esta manera:
`nombre_tabla`
. `nombre_columna`
<-- Nota: excluya .
de las marcas de retorno.