我对此感到悲伤,并希望得到一些帮助。我尝试过以下方法:
$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的用户,现在他们名字中的单引号打破了它!
帮助!知道怎么解决这个问题吗?
答案 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']);
其中$link
是mysqli_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));