3

我的页面上有一个查询,它使用 GET 变量从我的表中提取数据......

如果我回显我的 GET var 数据就在那里,所以我的查询做错了,而不是或死,我可以在浏览器中显示错误吗?

// Get USER ID of person
$userID = $_GET['userID'];

// Get persons
$sql = 'SELECT * FROM persons WHERE id = $userID';
$q   = $conn->query($sql) or die('failed!');
4

5 回答 5

6
$sql = "SELECT * FROM persons WHERE id = $userID";

您必须使用双引号在查询字符串中使用变量。

你也可以这样做:

$sql = "SELECT * FROM persons WHERE id = ".$userID;

你应该做的是(保护自己免受sql 注入):

$safeuid = $conn->prepare($userID);
$sql = "SELECT * FROM persons WHERE id = ".$safeuid;

您始终可以在 php 页面顶部使用它进行调试:

ini_set('display_errors',1); 
error_reporting(E_ALL);
于 2012-07-11T20:31:45.187 回答
2

你试过$q = $conn->query($sql) or die($conn->error());吗?

于 2012-07-11T20:29:08.853 回答
1

是的,你可以,但你应该只为调试而这样做。破解者可以通过有目的地输入错误的输入并阅读错误来获得很多洞察力。

我假设您使用的是 MySQLi;命令是$conn->error()。所以你的行将是:

$q = $conn->query($sql) or die($conn->error());

另外,你做错了什么是你使用单引号来定义$sql. 您需要使用双引号来写入$userID字符串。所以你想要的是:

$sql = "SELECT * FROM persons WHERE id = $userID";

或者

$sql = 'SELECT * FROM persons WHERE id = ' . $userID;
于 2012-07-11T20:28:42.217 回答
1

您需要使用双引号来评估字符串中的变量。那是,

$sql = 'SELECT * FROM persons WHERE id = $userID';

应该

$sql = "SELECT * FROM persons WHERE id = $userID";

而不是删除die您应该确保查询始终有效。换句话说:验证参数userID$_GET可以包含用户想要提供的任何东西——它可以是一个数组,它可以是一个字符串,它可以是一个带有恶意负载的字符串,它可以删除你的表。所以检查它是一个整数。如果不是,则向用户返回相关消息。

于 2012-07-11T20:31:10.517 回答
1

不是 php 专家,但您可以尝试:

// Get USER ID of person
$userID = $_GET['userID'];

// Get persons
$sql = 'SELECT * FROM persons WHERE id = $userID';
$q   = $conn->query($sql) or die('failed!' . mysql_error());

该错误应附加到您的 die 消息的末尾。

于 2012-07-11T20:33:33.010 回答