我正在学习编写查询的最佳方法。我也明白始终如一的重要性。到目前为止,我没有经过任何真正的思考就随意地使用单引号、双引号和反引号。

例子:

$query = 'INSERT INTO table (id, col1, col2) VALUES (NULL, val1, val2)';

同样,在上面的例子中,考虑table、col1、val1等可能是变量。

这个标准是什么?你会怎么做?

我已经在这里看了大约20分钟类似问题的答案,但这个问题似乎没有明确的答案。


当前回答

MySQL和PHP中的字符串文字是相同的。

字符串是包含在字节或字符中的序列 单引号(" ' ")或双引号(" " ")字符。

如果你的字符串包含单引号,那么你可以使用双引号来引用字符串,或者如果它包含双引号,那么你可以使用单引号来引用字符串。但如果字符串同时包含单引号和双引号,则需要转义用于字符串引号的字符串。

大多数情况下,我们对SQL字符串值使用单引号,因此我们需要对PHP字符串使用双引号。

$query = "INSERT INTO table (id, col1, col2) VALUES (NULL, 'val1', 'val2')";

你可以使用PHP双引号字符串中的变量:

$query = "INSERT INTO table (id, col1, col2) VALUES (NULL, '$val1', '$val2')";

但是如果$val1或$val2包含单引号,则会使SQL出错。所以你需要在sql中使用它之前转义它;这就是mysql_real_escape_string的作用。(尽管事先准备好的陈述更好。)

其他回答

MySQL和PHP中的字符串文字是相同的。

字符串是包含在字节或字符中的序列 单引号(" ' ")或双引号(" " ")字符。

如果你的字符串包含单引号,那么你可以使用双引号来引用字符串,或者如果它包含双引号,那么你可以使用单引号来引用字符串。但如果字符串同时包含单引号和双引号,则需要转义用于字符串引号的字符串。

大多数情况下,我们对SQL字符串值使用单引号,因此我们需要对PHP字符串使用双引号。

$query = "INSERT INTO table (id, col1, col2) VALUES (NULL, 'val1', 'val2')";

你可以使用PHP双引号字符串中的变量:

$query = "INSERT INTO table (id, col1, col2) VALUES (NULL, '$val1', '$val2')";

但是如果$val1或$val2包含单引号,则会使SQL出错。所以你需要在sql中使用它之前转义它;这就是mysql_real_escape_string的作用。(尽管事先准备好的陈述更好。)

除了所有这些(解释得很好的)答案之外,我还没有提到以下问题,我经常访问这个问答。

简单地说;MySQL认为您想在它自己的表/列上做数学运算,并将连字符(如“e-mail”)解释为e-mail。


免责声明:因此,对于那些完全不熟悉数据库的人以及可能不理解已经描述的技术术语的人,我认为我将添加这一点作为“供参考”类型的回答。

如果表cols和值是变量,那么有两种方法:

用双引号""完成查询:

$query = "INSERT INTO $table_name (id, $col1, $col2)
                 VALUES (NULL, '$val1', '$val2')";

Or

 $query = "INSERT INTO ".$table_name." (id, ".$col1.", ".$col2.")
               VALUES (NULL, '".$val1."', '".$val2."')";

单引号":

$query = 'INSERT INTO '.$table_name.' (id, '.$col1.', '.$col2.')
             VALUES (NULL, '.$val1.', '.$val2.')';

当列/值名称类似于MySQL保留关键字时,使用反勾' '。

注意:如果你用一个表名来表示一个列名,那么就像这样使用后勾号:

“table_name”。' column_name ' <——注:排除。从后面的节拍。

在PHP和MySQL的组合中,双引号和单引号使您的查询编写时间变得更加容易。

$query = "INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, '$val1', '$val2')";

现在,假设你在MySQL查询中使用一个直接的post变量,这样使用它:

$query = "INSERT INTO `table` (`id`, `name`, `email`) VALUES (' ".$_POST['id']." ', ' ".$_POST['name']." ', ' ".$_POST['email']." ')";

这是在MySQL中使用PHP变量的最佳实践。

这里有很多有用的答案,通常归结为两点。

BACKTICKS(')用于标识符名称周围。 单引号(')用于值周围。

正如@MichaelBerkowski所说

反勾号用于表和列标识符,但是 只有当标识符是MySQL保留关键字时才需要,或者 当标识符包含空白字符或字符时 超出限定的范围(见下文)通常建议避免使用 尽可能使用保留的关键字作为列或表标识符, 避免引用问题。

但也有一种情况,标识符既不能是保留关键字,也不能包含空格或超出限定集的字符,但必须在它们周围加上反引号。

例子

123E10是一个有效的标识符名称,也是一个有效的INTEGER字面值。

假设我想创建一个名为123456e6的临时表。

反刻度没有错误。

DB [XXX]> create temporary table `123456e6` (`id` char (8));
Query OK, 0 rows affected (0.03 sec)

不使用反勾号时出错。

DB [XXX]> create temporary table 123451e6 (`id` char (8));
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '123451e6 (`id` char (8))' at line 1

但是,123451a6是一个非常好的标识符名称(没有反勾号)。

DB [XXX]> create temporary table 123451a6 (`id` char (8));
Query OK, 0 rows affected (0.03 sec)

这完全是因为1234156e6也是一个指数数。