2010-02-18 55 views
2

刚才我看到下面的代码,但不明白为什么“,也有”使用。谢谢!PHP逃避问题

$sql='SELECT uid,name FROM users WHERE user="'.mysql_real_escape_string($_POST['login_name']).'" AND .. 

回答

2

这是一个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

0

看起来像被用于PHP代码如何形成的单引号查询和双引号是用于查询本身

More on Single/Double quotes

可以随时呼应了$ sql中值看单/双引号执行SQL对一个数据库之前的外观。

类似:

$sql='SELECT uid,name FROM users WHERE 
user="'.mysql_real_escape_string($_POST['login_name']).'"; 

// Print the SQL 
echo $sql."<br />"; 
3

不应该有。

“正确的” $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不信任。

+1

他应该使用PDO。 – 2010-02-18 13:11:09

+0

是的,这可能是理解准备好的状态动物之后的一个自然步骤..不是吗? – 2010-02-18 13:22:16

0

的“将字面上包含在最终的MySQL的请求,以便请求发送到MySQL数据库将是:

SELECT uid,name FROM users WHERE user="loginname" AND .. 
2

单引号围绕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 . "'"; 

如果您只想要一种类型的引号,则必须转义括住用户字符串的引号。

0

单引号用于在PHP中定义您的字符串。双击在你的SQL查询中分隔你的文本字段(login_name)。

这样做是为了避免转义查询的引号(如果使用相同的话)。

0

你可以使用单引号或双引号在php中包装字符串。但是,有差异。

使用单引号字符串,不能内联变量(例如:$a = 'hi $name'),也不能转义字符(例如:$a = 'hi!\n$name')。

这里是一个很好的总结:http://www.jonlee.ca/php-tidbit-single-quotes-vs-double-quotes/

同样在一个侧面说明..不知道如果双引号应该用于SQL字符串包围。我相信你应该在大多数数据库中使用单引号。

+0

是的,双引号是不可移植的,即MS Sql Server使用“字段”来指示字段/表名(MySQL使用'field')。但是,因为这是PHP,它可以适用于MySQL数据库,而不是书面的vor可移植性,所以这应该不重要。 – dbemerlin 2010-02-18 13:12:37