繁体   English   中英

SQL查询帮助-混淆引号和连接

[英]SQL Query Help—Confused About Quotes and Concatenating

我试图把头放在用SQL编写查询上,而在理解我发现的这个示例时遇到了一些困难。

$q = "INSERT INTO `dbUsers` (`username`,`password`,`email`) "
        ."VALUES ('".$_POST["username"]."', "
        ."PASSWORD('".$_POST["password"]."'), "
        ."'".$_POST["email"]."')";

我想我在使用双引号,单引号和反引号时遇到了麻烦。 我将此声明与W3网站上的示例进行了比较,由于看起来更为复杂,因此我感到非常困惑。 您能告诉我上面查询中发生了什么吗? 谢谢您的帮助!

$sql="INSERT INTO Persons (FirstName, LastName, Age)
VALUES
('$_POST[firstname]','$_POST[lastname]','$_POST[age]')";

双引号用于定义构建$q字符串的元素。 单引号标识字符串,你正在构建的SQL查询和反引号用来在MySQL逃生对象名称。

反引号`用来转义MySQL关键字(通常用于表名和列名)。 在插入的任何字符串周围都需要单引号或双引号。

请注意,您应该在连接到SQL查询中的任何字符串上调用mysql_real_escape_string 否则,如果$_POST也包含引号,则可以使用引号引起来。 这有可能被用来允许在所谓的SQL注入攻击中执行任意SQL命令。

可以使用`back ticks'引用mysql字段名称,如果您不小心使用mysqls保留字之一来命名字段,则需要使用它们-否则不需要它们。

当您在字段中输入字符串时,必须将其“引用”。

整个语句必须加引号,但不能与上面的2)冲突,因此使用“双引号”。

非标量值(例如数组)不会自动展开,因此您必须“删除”。 和。 “返回” PHP以使用串联符号点构建字符串。

如果您使用保留字作为表/字段名称,则反引号是MySQL工件,单引号表示SQL中的字符串文字。 双引号是特定于PHP的,在PHP中是单独的字符串。 因此,您的以下查询如下所示:

$sql="INSERT INTO Persons (FirstName, LastName, Age)
VALUES
('".$_POST["firstname"]."','".$_POST["lastname"]."','".$_POST["age"]."')";

上面的作者所做的一件事就是还将PHP字符串分解为单独的字符串,可能是为了提高可读性。 MySQL服务器不在乎。

  • 双引号是PHP代码的一部分,告诉它双引号内的项目是字符串。 它们不是正在构建的SQL的一部分。
  • 单引号用于在结果SQL中包围值。 即,您要告诉数据库此处使用值“ bob”。 对于某些类型的值(整数,布尔值等),您不需要单引号。 对于许多其他变量(varchar,日期等),您需要单引号。
  • 反引号与单引号的功能几乎相同,除了反引号用于表名,字段名等之外,而不是用于实际值。 当存在问题的名称不能被数据库正确地解释时使用它们,例如,如果您有一个名为count, since that's a keyword in SQL. As noted elsewhere, the backticks aren't necessary in your example, but many people put them in all the time because it doesn't hurt to have them; as a safety net, kindof.的字段count, since that's a keyword in SQL. As noted elsewhere, the backticks aren't necessary in your example, but many people put them in all the time because it doesn't hurt to have them; as a safety net, kindof. count, since that's a keyword in SQL. As noted elsewhere, the backticks aren't necessary in your example, but many people put them in all the time because it doesn't hurt to have them; as a safety net, kindof.

To give a visible, simpler example $name = "bob"; $sql = "SELECT * FROM `mytable` WHERE `name` = '" . $name . "'"; This would result in the $sql variable being SELECT * FROM `mytable` WHERE `name` = 'bob'

 To give a visible, simpler example $name = "bob"; $sql = "SELECT * FROM `mytable` WHERE `name` = '" . $name . "'"; This would result in the $sql variable being SELECT * FROM `mytable` WHERE `name` = 'bob' 

To give a visible, simpler example $name = "bob"; $sql = "SELECT * FROM `mytable` WHERE `name` = '" . $name . "'"; This would result in the $sql variable being SELECT * FROM `mytable` WHERE `name` = 'bob'

 To give a visible, simpler example $name = "bob"; $sql = "SELECT * FROM `mytable` WHERE `name` = '" . $name . "'"; This would result in the $sql variable being SELECT * FROM `mytable` WHERE `name` = 'bob' 

As you can see, the double quotes are not part of the string.. they're just used in creating it. In the resulting SQL, the backticks surround the table/field names, and the single quotes surround the actual value bob As you can see, the double quotes are not part of the string.. they're just used in creating it. In the resulting SQL, the backticks surround the table/field names, and the single quotes surround the actual value bob

完整说明一下,直接在创建的SQL中使用POST值是危险的,因为它允许进行SQL注入攻击。 值应转义或使用参数化查询。

在第一个查询中实际上有很多不必要的东西。 有一些最佳做法可以考虑,但可以这样重写:

$q = "INSERT INTO dbUsers (username, password, email)
    VALUES ('".$_POST["username"]."',
    PASSWORD('".$_POST["password"]."'),
    '".$_POST["email"]."')";

第一件事: INSERT INTO dbUsers

  • 这一切都是在告诉我们要将数据插入到哪个表中。

(username, password, email)

  • 指定我们要插入的列(特定于订单)

VALUES ('".$_POST["username"]."', PASSWORD('".$_POST["password"]."'), '".$_POST["email"]."')

  • 我们要插入的值(取决于列的顺序),然​​后是终止分号。

如果使用硬编码值而不是串联重写此代码,则它看起来像:

VALUES ('myUserName', PASSWORD('myPassword'), 'myEmail')

所有这些都应该是自我解释。 每个值都是字符串,因此包含在单引号(')中。 然后,密码值通过MySQL函数PASSWORD传递,该函数对PASSWORD进行哈希处理以确保安全。

双引号引起来的字符串将成为查询字符串的一部分。 每个双引号部分之间的点是串联运算符。 他们将各个琴弦片段连接在一起。 您会注意到,每个$ _POST []数组变量前都有一个双引号和点,之后是一个双引号和点。

例如“。$ _POST [” username“]。”

第一个双引号结束上一个字符串部分。 最后的一个开始下一个字符串部分。 两个点之间的所有内容都是POST变量。 点是必需的原因是因为“用户名”周围的引号引起来。 在您的W3版本中,它们不使用$ _POST []数组键字符串周围的引号(例如$ _POST [firstname]而不是$ _POST [“ firstname”]或$ _POST ['firstname']),因此它们不需要使用点和引号。

如果您想使事情保持简单,请不要在$ _POST []变量中使用引号,也不必使用所有这些点和引号引起来。

如果您尝试的版本1中没有点号和引号,则php解析器将失败,并且您将看到错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM