我正试图在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]')";
答案 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)
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 This would result in the
。$name = "bob";
$sql = "SELECT * FROM `mytable` WHERE `name` = '" . $name . "'";
$sql
variable beingSELECT * 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解析器将失败,您将看到错误。