2

这段代码对我不起作用。我的 list.php 显示了所有成员。如果我单击一行的编辑,我会转到显示“update.php?id=#”的 update.php 并且我有一小段代码来显示始终正确的数字。但我无法显示人员信息。这是我所拥有的

<?
    $id = $_GET['id'];
     echo "<print>" .$id."</print>";
    mysql_query("SET NAMES utf8"); 
    mysql_query("SET CHARACTER_SET utf8");
    header('Content-type: text/html;charset=utf-8');   
    $order = 'SELECT * FROM `person` WHERE `PersonID` = $id';  
    $result = mysql_query($order);
?>

它应该在我的表中显示人员信息,因为它在我的 list.php 中剂量但没有显示?'PersonID' = 1234例如,如果我更换,我会得到一些信息。为什么代码不使用$id并将其放在后面'PersonID' = .

4

3 回答 3

7

您将 $_GET['id'] 的内容直接传递给数据库 - 如果有人传入一个变量1'怎么办?充其量会破坏查询;在最坏的情况下,有人可以对您的数据库做一些讨厌的事情。至少,您需要清理数据。

mysql_real_escape_stringwill let you escape a string so you can do this; if PersonID` 是一个 int,你也可以使用intval来获取一个字符串的整数值,并阻止无效字符以这种方式传递。

您看到的实际问题是因为 PHP 将带有单引号的字符串视为字符串文字;它不会解析它以查看是否有需要替换的变量。它被$id视为一个字符串。要做你想做的事,你需要使用双引号:

$id = intval($_GET['id']);
$order = "SELECT * FROM `person` WHERE `PersonID` = $id";

您还应该考虑远离 mysql_* 函数,因为它们已被弃用。为避免这种情况,请考虑改用 mysqli_* 或 PDO。通过使用准备好的语句并将变量绑定到它们,这两者都将帮助您编写更加安全的代码。

于 2013-07-23T17:49:13.190 回答
2

单引号字符串中的变量不会被插值。使用双引号或字符串连接:

$id = mysql_real_escape_string($id);
$order = "SELECT * FROM `person` WHERE `PersonID` = $id"; 

或者:

$order = 'SELECT * FROM `person` WHERE `PersonID` = ' . mysql_real_escape_string($id);

但是,正如许多其他人所提到的,此查询容易发生 SQL 注入。由于变量是用户输入值,几乎所有使用字符串插值或字符串连接的查询都容易发生 SQL 注入。参数化查询如下所示:

$order = 'SELECT * FROM `person` WHERE `PersonID` = ?';

或者,如果您使用的是 PDO,则可以命名参数,如下所示:

$order = 'SELECT * FROM `person` WHERE `PersonID` = :id;';

然后,您将使用适当的方法将参数绑定到查询并执行它。使用 PDO,它会是这样的(当然你必须在此之前有代码来创建数据库连接$db):

$statement = $db->prepare($order);
$statement->bindValue(':id', $id, PDO::PARAM_INT);
$statement->execute();

这只是使用参数化查询的开始。在 PHP 手册中阅读有关 PDO 的更多信息。

于 2013-07-23T17:46:39.263 回答
-1

尝试

$order = "SELECT * FROM `person` WHERE `PersonID` = '$id'";

必须在我自己的项目中这样做,没有其他工作,只需将''放在你的id周围,让你的php字符串以“开始和结束”

于 2013-07-23T17:46:58.650 回答