刚才我看到下面的代码,但不明白为什么“,也有”使用。谢谢!PHP逃避问题
$sql='SELECT uid,name FROM users WHERE user="'.mysql_real_escape_string($_POST['login_name']).'" AND ..
刚才我看到下面的代码,但不明白为什么“,也有”使用。谢谢!PHP逃避问题
$sql='SELECT uid,name FROM users WHERE user="'.mysql_real_escape_string($_POST['login_name']).'" AND ..
这是一个PHP程序编写一个SQL查询(并将其存储在一个字符串。)
目标SQL看起来是这样的:
SELECT uid,name FROM users WHERE user="something" AND …
所以在PHP方面:
$foo = 'SELECT uid,name FROM users WHERE user="something" AND …'
但是你想用动态数据替换“某物”。在这种情况下,发布的login_name - 但对MySQL安全。
$foo = 'SELECT uid,name FROM users WHERE user="' .
mysql_real_escape_string($_POST['login_name']) .
'" AND …'
更好的方法是使用prepared statements。
看起来像被用于PHP代码如何形成的单引号查询和双引号是用于查询本身
可以随时呼应了$ sql中值看单/双引号执行SQL对一个数据库之前的外观。
类似:
$sql='SELECT uid,name FROM users WHERE
user="'.mysql_real_escape_string($_POST['login_name']).'";
// Print the SQL
echo $sql."<br />";
不应该有。
“正确的” $sql
可能是这样的:
$sql="SELECT uid,name FROM users WHERE user='".mysql_real_escape_string($_POST['login_name'])."';
您在SQL中使用'说这是一个字符串/文字。
我建议你看看prepared statements,我不信任mysql_real_escape_string
也不mysql_very_real_seriously_this_is_the_real_escape_string
,即php-syndrome不信任。
的“将字面上包含在最终的MySQL的请求,以便请求发送到MySQL数据库将是:
SELECT uid,name FROM users WHERE user="loginname" AND ..
单引号围绕SQL语句(“SELECT ...”),双引号括住字段“用户”的数据(尽管我会用相反的方式使用引号)。
查询会是这个样子(使用单引号):
SELECT uid FROM users WHERE user='snake'
为此查询分配给变量$ sql中,你必须放在引号,使用双引号这个时候,所以PHP不承担,该字符串之前“蛇”结尾:
$sql = "SELECT uid FROM users WHERE user='snake'";
正如你不会总是被要求“蛇”静态,你交换“蛇”与动态的名字,退出/再次使用双引号输入$ sql-string:
$sql = "SELECT uid FROM users WHERE user='" . $dynamic . "'";
如果您只想要一种类型的引号,则必须转义括住用户字符串的引号。
单引号用于在PHP中定义您的字符串。双击在你的SQL查询中分隔你的文本字段(login_name)。
这样做是为了避免转义查询的引号(如果使用相同的话)。
你可以使用单引号或双引号在php中包装字符串。但是,有差异。
使用单引号字符串,不能内联变量(例如:$a = 'hi $name'
),也不能转义字符(例如:$a = 'hi!\n$name'
)。
这里是一个很好的总结:http://www.jonlee.ca/php-tidbit-single-quotes-vs-double-quotes/
同样在一个侧面说明..不知道如果双引号应该用于SQL字符串包围。我相信你应该在大多数数据库中使用单引号。
是的,双引号是不可移植的,即MS Sql Server使用“字段”来指示字段/表名(MySQL使用'field')。但是,因为这是PHP,它可以适用于MySQL数据库,而不是书面的vor可移植性,所以这应该不重要。 – dbemerlin 2010-02-18 13:12:37
他应该使用PDO。 – 2010-02-18 13:11:09
是的,这可能是理解准备好的状态动物之后的一个自然步骤..不是吗? – 2010-02-18 13:22:16