我正在努力学习编写查询的最佳方法。我也理解保持一致的重要性。到目前为止,我还没有真正的思考就随机使用了单引号、双引号和反勾号
例如:
$query='INSERT-INTO-table(id,col1,col2)值(NULL,val1,val2)';
此外,在上面的例子中,考虑表, COL1, Val1 等可以是变量。
这个标准是什么?你是做什么的
我已经在这里读了大约20分钟类似问题的答案,但似乎这个问题没有明确的答案。
反勾号用于表和列标识符,但只有当标识符是MySQL保留关键字时,或者当标识符包含空格字符或超出有限集的字符时(见下文),才有必要使用反勾号。通常建议尽可能避免使用保留关键字作为列或表标识符,避免引用问题
单引号应用于字符串值,如values()列表中的字符串值。MySQL对字符串值也支持双引号,但其他RDBMS更广泛地接受单引号,因此使用单引号而不是双引号是一个好习惯
MySQL还希望DATE和DATETIME文本值以字符串形式引用,如'2001-01-01 00:00:00'。有关更多详细信息,请参阅日期和时间文本文档,特别是在日期字符串中使用连字符-作为段分隔符的替代方法
因此,使用您的示例,我将双引号引述PHP字符串,并对值'val1',val2'使用单引号NULL是一个MySQL关键字,是一个特殊(非)值,因此不带引号
这些表或列标识符都不是保留字,也没有使用需要引用的字符,但我还是用反勾号引用了它们(稍后将详细介绍…)
RDBMS固有的函数(例如,MySQL中的NOW())不应该被引用,尽管它们的参数遵循前面提到的相同字符串或标识符引用规则
倒勾(`) 表和列───────┬─────┬──┬──┬──┬────┬──┬────┬──┬────┬──┬───────┐ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ $query=“插入“表”(`id`、`col1`、`col2`、`date`、`updated`) 值(NULL,'val1','val2','2001-01-01',NOW())“; ↑↑↑↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑↑↑↑↑ 不带引号的关键字─────┴┴┴┘ │ │ │ │ │ │ │││││ 单引号(')字符串───────────┴────┴──┴────┘ │ │ │││││ 单引号(')日期───────────────────────────┴──────────┘ │││││ 无引号函数─────────────────────────────────────────┴┴┴┴┘
变量插值
变量的引号模式不会改变,尽管如果您打算直接在字符串中插入变量,它必须在PHP中双引号。只需确保已正确转义了SQL中使用的变量。(建议改用支持预处理语句的API,以防止SQL注入)
//有些变量替换也是一样的 //这里,变量表名$table被反勾引,变量 //值列表中的值是单引号 $query=“插入到`$table`(`id`、`col1`、`col2`、`date`)值(空,'$val1','$val2','$date');
准备好的发言
使用准备好的语句时,请查阅文档以确定是否必须引用语句的占位符。PHP、PDO和MySQLi中最流行的API,除了无引号的占位符之外,其他语言中最流行的语句API也是如此:
//带有命名参数的PDO示例,不带引号
$query=";在`表'(`id`、`col1`、`col2`、`date`)中插入值(:id、:col1、:col2、:date)";;
//MySQLi的例子是什么?参数,无引号
$query=";在“表”(`id`、`col1`、`col2`、`date`)中插入值(?、、?、?)”;;
标识符中需要回勾引用的字符:
根据MySQL文档,您不需要使用以下字符集引用(反勾选)标识符:
ASCII:
[0-9,a-z,a-z$”(基本拉丁字母,数字0-9,美元,下划线)
您可以使用该集合之外的字符作为表或列标识符,例如,包括空格,但是您必须将它们引用(反勾选)
此外,尽管数字是标识符的有效字符,但标识符不能仅由数字组成。如果他们这样做了,他们必须被包裹在背上