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

时间:2011-06-20 19:55:02

标签: php sql

我正试图在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]')";

7 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

Backticks`是为了逃避MySQL关键字(通常用于表名和列名)。插入的任何字符串都需要单引号或双引号。

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

答案 2 :(得分:1)

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

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

必须引用整个陈述,但不要与上述2)冲突,因此使用“双引号”。

非标量值(如数组)不会自动展开,因此您必须“退出”。和。 “返回”到PHP,使用串联标记点来构建字符串。

答案 3 :(得分:1)

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

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

上面的作者正在做的一件事是将PHP字符串分解为单独的字符串,这可能是为了提高可读性。 MySQL服务器并不关心它。

答案 4 :(得分:1)

  • 双引号是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.的字段
{{1} }

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'

作为一个完整的注释,直接在创建的SQL中使用POST值是危险的,因为它允许SQL注入攻击。应该转义这些值,或者应该使用参数化查询。

答案 5 :(得分:1)

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

$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传递,该函数为了安全目的而散列密码。

答案 6 :(得分:1)

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

e.g。 “。$ _POST [”用户名“]。”

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

如果你想保持简单,不要使用$ _POST []变量中的引号,你不必使用它们周围的所有点和引号。

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