SELECT WHERE id未检索记录,没有显示任何内容


SELECT WHERE id not retrieving records, nothing shows up

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

<?
    $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);
?>

它应该显示我的表中的人员信息,就像它在我的列表中一样。php但什么都没有显示?例如,如果我替换'PersonID' = 1234,我就会得到一些信息。为什么代码不使用$id并将其放在'PersonID' = .之后?

您正在将$_GET['id']的内容直接传递到数据库-如果有人传入1'的变量会怎样?充其量,这将打破查询;最坏的情况是,有人会对你的数据库做一些恶劣的事情。至少,您需要净化您的数据。

mysql_real_eescape_string will 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。通过使用准备好的语句并将变量绑定到它们,这两种方法都将帮助您编写更安全的代码。

单引号字符串中的变量不进行插值。使用双引号或字符串串联:

$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的信息。

尝试

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

不得不在我自己的项目中这样做,其他什么都不起作用,只需在你的id周围加上",让你的php字符串以"

"开头和结尾