准备好的声明后,获取结果不起作用

时间:2013-06-18 16:33:52

标签: php

我很难自己写这个,所以我会说我知道我需要做什么和我已经做了什么。

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

由于

3 个答案:

答案 0 :(得分:1)

从占位符中删除引号:

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

准备好的陈述中占位符/命名参数的全部意义在于不需要你自己做这些事情。

在内部,DB库将执行以下操作:

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

所以最终的查询最终看起来像

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

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

答案 1 :(得分:1)

这里有一些问题:

  1. 您没有引用要绑定的变量(如前所述......);
  2. 您没有转义表名,而是应该根据白名单进行检查,并在必要时用反引号引用它;
  3. 您不会将结果绑定到数组,而是绑定到单个变量。在这种情况下,您最好使用fetch_row()从结果中获取行。

答案 2 :(得分:0)

您无需将?与引号绑定。从'?'删除引号,只需?