2013-07-23 93 views
2

这段代码不适合我。我的list.php显示了所有的成员。如果我点击编辑一行,我得到了我的update.php,它显示'update.php?id =#并且我有一小段代码来显示总是正确的数字。但我无法显示个人信息。 这里是我选择哪里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); 
?> 

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

+4

PHP的MySQL库已被弃用,所以您应该真正学习如何将MySQLi或PDO与预准备语句一起使用 –

+1

您的(生成的)脚本可能容易受到SQL注入的攻击。你应该[做一些反对它](http://stackoverflow.com/q/60174/53114)。 – Gumbo

+0

您可以从查询中删除反引号...您没有使用任何保留字 – Barranka

回答

2

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

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

这仅仅是一个开始,使用参数化查询。 Read more about PDO in the PHP manual.

+0

**否**。为什么每个人都坚持要切换到串联?它完全忽略了大量的SQL注入问题。 – tadman

+0

我加入了关于使用参数化查询和PDO的答案。 –

+1

如果您只是在'$ id'周围添加转义呼叫,则可以使原始示例正确工作。不过,很好的PDO例子。对不起,但你不能把那里作为一个“固定”版本的代码。 – tadman

-1

尝试

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

不得不这样做是在我自己的项目,没有别的工作,只要把“”在你的ID,让你的PHP字符串开始,以“

+0

如果'PersonID'是一个整数,则不需要在该值附近加引号。 –

+0

'$ id'不应该在查询中排在第一位。 – tadman

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。这两种方法都可以帮助您编写更安全的代码,方法是使用准备好的语句和绑定变量。

+0

如果没有'mysql_real_escape_string',这段代码就是破坏性的职业。 – tadman

+0

或者他可以停止使用mysql_,因为答案的后半部分指出。 – andrewsi

+1

WOW ....确定这是非常有用的信息...并按照建议工作。我明白为什么这可能是一个安全问题。如果只有一个人访问此页面,这仍然是一个大问题?关于$ _GET ['id']和使用mysqli_ *或PDO这对我来说是新的。你能否建议我可以从哪里了解到这一点? – Bobby