0

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

$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 的用户,现在他们名字中的单引号打破了它!

帮助!知道我如何解决这个问题吗?

4

5 回答 5

2

在 SQL 查询中使用变量之前,您需要对它们进行转义!如果不这样做,可能会发生坏事(SQL 注入!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/

于 2013-04-17T19:20:42.243 回答
0

你应该在你的输入上使用类似mysqli_real_escape_string的东西:

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

or$link返回的链接标识符在哪里。然后:mysqli_connect()mysqli_init()

$result = mysqli_query($link, "SELECT this FROM that WHERE tFirstName = '$fn' And tLastName = '$ln'");
于 2013-04-17T19:22:29.607 回答
0

首先,我将再次重复自己并说这一点 - 你不应该使用 PHPmysql_*函数,因为它们已被弃用。请考虑切换到 mysqli 或 PDO。

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

于 2013-04-17T19:22:31.940 回答
0

mysql_real_escape_string您可以使用或 using解决此问题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));
于 2013-04-17T19:23:14.810 回答
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']}");
于 2013-04-17T19:19:41.410 回答