在准备好的语句之后,获取结果不工作


Fetching result isn't working after prepared statement

我正在努力写这篇文章,所以我会说我知道我需要做什么和我已经做了什么。

基于两个$_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);
}

谢谢

这里有几个问题:

  1. 你不引用你要绑定的变量(如前所述…);
  2. 不要转义表名,相反,您应该根据白名单检查它,并在必要时用反引号括起来;
  3. 你不绑定结果到一个数组,但单独的变量。在这种情况下,您最好使用fetch_row()从结果中获取行。

删除占位符中的引号:

$stmt = $mysqli->prepare("SELECT * FROM " . $company ." WHERE `name` = ?");
                                                                       ^--no quotes

在预处理语句中使用占位符/命名参数的全部意义是为了消除您自己做这些事情的需要。

在内部,DB库将做相当于:

$safe = "'" . escape($nasty_unsafe_data) . "'"

所以最后的查询看起来像

... WHERE `name` = ''$safe''

(不是真的,这只是为了说明这个过程)

您不需要用引号绑定?。去掉'?'的引号,改成?