带有$ _SESSION或引号的mysql_query

时间:2013-04-17 19:15:36

标签: php

我对此感到悲伤,并希望得到一些帮助。我尝试过以下方法:

$result = mysql_query("SELECT this FROM that WHERE tFirstName = $_SESSION['FirstName'] And tLastName = $_SESSION['LastName']");

但我收到错误“意外的T_ENCAPSED_AND_WHITESPACE,期待T_STRING或T_VARIABLE”。

我尝试了多种方法,在会话变量周围使用双引号和单引号,但似乎总是发现错误。

最终我放弃了并将它们设置为$ fn和$ ln - 然后在查询中使用它:

$result = mysql_query("SELECT this FROM that WHERE tFirstName = '$fn' And tLastName = '$ln'");

这很好用......直到我找到一个姓O'Reilly的用户,现在他们名字中的单引号打破了它!

帮助!知道怎么解决这个问题吗?

5 个答案:

答案 0 :(得分:2)

在SQL查询中使用变量之前,您需要转义变量!如果不这样做,可能会发生不好的事情(SQL Injection! 1 )。由于您使用的是mysql_,因此可以执行此操作。

$fn = mysql_real_escape_string($_SESSION['FirstName']);
$ln = mysql_real_escape_string($_SESSION['LastName']);

$result = mysql_query("SELECT this FROM that WHERE tFirstName = '$fn' And tLastName = '$ln'");

完全 停止使用mysql_并切换到PDO(或mysqli)的原因!有了这些,你可以使用“准备好的查询”,而不必担心再次逃避(它为你做)。请参阅此页:http://us2.php.net/manual/en/mysqlinfo.api.choosing.php

切换后,您需要$mysqli->prepare$dbh->prepare

1 有关SQL注入的信息,请参阅此处:http://bobby-tables.com/

答案 1 :(得分:0)

要转义单引号,请在将变量放入查询之前使用mysql_real_escape_string()

$result = mysql_query("SELECT this FROM that WHERE tFirstName = '".mysql_real_escape_string($fn)."' And tLastName = '".mysql_real_escape_string($ln)."'");

第一个查询的正确语法(现在没有转义...):

$result = mysql_query("SELECT this FROM that WHERE tFirstName = {$_SESSION['FirstName']} And tLastName = {$_SESSION['LastName']}");

答案 2 :(得分:0)

您应该在输入中使用mysqli_real_escape_string之类的内容:

$fn = mysqli_real_escape_string($link,$_SESSION['FirstName']);
$ln = mysqli_real_escape_string($link,$_SESSION['LastName']);

其中$linkmysqli_connect()mysqli_init()返回的链接标识符。然后:

$result = mysqli_query($link, "SELECT this FROM that WHERE tFirstName = '$fn' And tLastName = '$ln'");

答案 3 :(得分:0)

首先,我会再次重复一遍并说出这一点 - 您不应该使用PHP mysql_*函数,因为它们已被弃用。请考虑切换到mysqli或PDO。

现在,您的查询问题是您没有确保用户无法将恶意代码注入您的数据库。由于撇号',查询将无法使用姓氏“O'Reilly”。它破坏了MySQL的查询 在将数据插入数据库之前,请使用htmlspecialchars()mysql_real_escape_string()等函数(如果您仍然坚持使用mysql_*

答案 4 :(得分:0)

您可以使用mysql_real_escape_string或使用PDO解决此问题。

mysql_real_escape_string:

$str = mysql_real_escape_string($str);

PDO:

 // make a connection using mysql on PDO
 $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
 // make a query using params :fn and :ln
 $stmt = $dbh->prepare("SELECT this FROM that WHERE tFirstName = :fn And tLastName = :ln");
 // bind value to these params
 // when binding params, PDO automaticaly escape it and quote it, it's the most safe way to avoid SQL Injection.
 $stmt->bindParam(':fn', $fn);
 $stmt->bindParam(':ln', $ln);
 // execute the created statement
 $stmt->execute();
 // fetch data from statement
 $data = $stmt->fetchAll(PDO::FETCH_ASSOC);
 // dump data
 sprintf("<pre>%s</pre>", printr($data,true));