我正在努力写这篇文章,所以我会说我知道我需要做什么和我已经做了什么。
基于两个$_GET[]变量,我需要查询数据库。这些值为我提供了表名和位置名。从这个位置字段名,我需要推断整个行。
所以,我用这个数据查询数据库,然而,当我试图获取和打印它什么都没有发生。我需要整行数据(在一个数组中?)
我知道我的代码是丑陋的。而且可能容易受到MySQL注入的攻击,但我宁愿让我的PHP正确地将行放入数组,而不是担心这个。
目前为止的粗略代码:
$company = strtolower($_GET['company'] . '_a_in_m2f');
$company = mysqli_real_escape_string($mysqli, $company);
$stmt = $mysqli->prepare("SELECT * FROM " . $company ." WHERE `name` = '?'");
$stmt->bind_param('s', $stop);
$stop = $_GET['stop'];
$stmt->execute();
$stmt->bind_result($therow);
while ($stmt->fetch()) {
printf("%s %s 'n", $therow);
}
谢谢
这里有几个问题:
- 你不引用你要绑定的变量(如前所述…);
- 不要转义表名,相反,您应该根据白名单检查它,并在必要时用反引号括起来;
- 你不绑定结果到一个数组,但单独的变量。在这种情况下,您最好使用
fetch_row()
从结果中获取行。
删除占位符中的引号:
$stmt = $mysqli->prepare("SELECT * FROM " . $company ." WHERE `name` = ?");
^--no quotes
在预处理语句中使用占位符/命名参数的全部意义是为了消除您自己做这些事情的需要。
在内部,DB库将做相当于:
$safe = "'" . escape($nasty_unsafe_data) . "'"
所以最后的查询看起来像
... WHERE `name` = ''$safe''
(不是真的,这只是为了说明这个过程)
您不需要用引号绑定?
。去掉'?'
的引号,改成?