我的页面上有一个查询,它使用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!');
$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);
您尝试过$q = $conn->query($sql) or die($conn->error());
吗?
是的,你可以,但你应该只做调试。破解者可以通过有目的地输入错误并读取错误来获得很多洞察力。
我假设您使用的是MySQLi;命令是CCD_ 2。所以你的线路是:
$q = $conn->query($sql) or die($conn->error());
此外,您做错的是使用单引号来定义$sql
。您需要使用双引号将$userID
写入字符串。所以你想要的是:
$sql = "SELECT * FROM persons WHERE id = $userID";
或
$sql = 'SELECT * FROM persons WHERE id = ' . $userID;
您需要使用双引号来计算字符串中的变量。也就是说,
$sql = 'SELECT * FROM persons WHERE id = $userID';
应该是
$sql = "SELECT * FROM persons WHERE id = $userID";
与其删除die
,不如确保查询始终有效。换句话说:验证userID
参数。$_GET
可以包含用户想要提供的任何内容——它可以是数组,也可以是字符串,也可能是带有恶意负载的字符串,这些恶意负载可能会丢弃您的表。所以检查它是一个整数。如果没有,则向用户返回相关消息。
不是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());
错误应该附加在死亡消息的末尾。