{$ _GET ['id']}和'“。$ _ GET ['id']之间的区别。”'?

时间:2009-01-14 17:19:57

标签: php string concatenation string-concatenation

写作之间有什么区别

{$_GET['id']}

' “$ _ GET [ '身份证'。”'

在sql语句中?两者都是相同的

4 个答案:

答案 0 :(得分:4)

将get请求中的数据直接放入SQL中总是一个坏主意,并且有许多简单的方法可以防止SQL注入。

对于你知道你想要一个数字ID的简单情况,你可以简单地强制该值为数字,然后没有SQL注入的机会。一种方法可能是okoman使用sprintf(),可能是这样的:

$sql = "INSERT INTO table VALUES(".sprintf("%d",$_GET['id']) .")";

虽然我认为它的丑陋和糟糕的形式。这样的事情更好:

$sql = "INSERT INTO table VALUES(".(int)$_GET['id']) .")";

只是将值转换为int - 如果它不是可以转换为int的数字 - 你将得到一个“0”,这可能是你想要的也可能不是。

其他替代方案(以及当您的数据不应该是数字时)包括使用转义函数,例如add_slashes()或上述mysql_real_escape_string()

恕我直言,从PHP中使用数据库访问并且非常容易防止SQL注入的最佳方法是使用新的PHP PDO库(http://php.net/PDO)。这允许您编写不包含任何数据的SQL字符串,并在稍后的数据库服务器本身内添加数据。在这种形式下,绝对没有办法进行SQL注入。

以下是一些示例代码:

$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
$stmt = $dbh->prepare("INSERT INTO table VALUES (?)");
$stmt->bindParam(1, $_GET['id']);
$stml->execute();

如您所见,数据未添加到SQL查询本身,因此无需转义。

答案 1 :(得分:2)

在SQL语句中直接使用其中任何一个都是一个非常糟糕的想法。它允许SQL注入。请务必使用mysql_real_escape_string等内容来清理您的输入。

两者之间的主要区别在于top只能在使用双引号的字符串中使用。但是,底部可以使用双引号或单引号。

答案 2 :(得分:2)

据我所知,没有区别,但你应该这样做吗?你允许在你的sql查询中使用未经过输入的输入,这意味着如果你的网站是面向互联网的,你就会对sql注入攻击保持开放态度。

这是一个Q& A,你应该在继续之前阅读:

How can I prevent SQL injection in PHP?

答案 3 :(得分:-1)

如果在字符串中使用变量(尤其是关联数组),则可以确定它会导致错误。这只是糟糕的风格。 我 - 个人 - 也不喜欢第二种选择。

sprintf( '... %d ...', $_GET[ 'id' ] );

这是我最喜欢将变量放入字符串的方式。