无法从MySQL获得价值

时间:2015-02-18 22:04:13

标签: php mysql mysqli

我正在使用MySQLi。此查询工作正常,我得到一个整数值。但这不是一个安全的查询,所以我试图做一个安全的。

  $stm=mysqli_query($db,"SELECT post_amount FROM users WHERE login='$login'");
  $stmone=mysqli_fetch_assoc($stm);
  $stmtwo=implode($stmone);
  echo($stmtwo);

这是我从不同来源尝试的内容。在这种情况下,我会收到关于get_resultimplode以及白屏的警告。

$stm = $db->prepare('SELECT post_amount FROM users WHERE login = ?');

$stm->bind_param('s', $login);

$stm->execute();

$result = $stm->get_result();
  $stmone=mysqli_fetch_assoc($result);
  $stmtwo=implode($stmone);
  echo($stmtwo);

在这种情况下,没有白屏,只显示没有值,并在日志中显示此警告

mysqli_fetch_assoc() expects parameter 1 to be mysqli_result

代码:

    $stm = $db->prepare('SELECT post_amount FROM users WHERE login = ?');

    $stm->bind_param('s', $login);

    $stm->execute();

    $stmone=mysqli_fetch_assoc($stm);
     echo($stmone);

有什么问题?任何人都可以解释如何做出正确,简单和有效的查询吗?

2 个答案:

答案 0 :(得分:1)

您需要检查查询是否成功运行。

$stm = mysqli_query($db,"SELECT post_amount FROM users WHERE login='$login'");
if(!$stm) {
    die('Error: ' . mysqli_error($db));
} else {
    .. fetch results and all.
}

我建议你不要像你那样使用mysqli。您需要使用mysqli_real_escape_string()或类似的东西来转义变量,因为当前查询会导致sqli注入。

最好在PDO中使用预先准备好的陈述。


虽然使用下一段代码,但您需要检查prepare()是否成功。

if (!($stmt = $db->prepare('SELECT post_amount FROM users WHERE login = ?'))) {
    echo "Prepare failed: (" . $db->errno . ") " . $db->error;
} else {
    .. fetch data   
}

下一个问题是,您可以检查执行是否也成功:

if(!$db->execute()) {
    die("Execute failed: (" . $db->errno . ") " . $db->error;);
}

要获取数据,您需要使用:

while ($row = $stm->fetch_assoc()) {
    .. do stuff with the data
}

答案 1 :(得分:0)

$result为false,这就是您收到错误消息的原因。做一个if语句来测试$result = true。 您还应该转义数据。查看mysqli_real_escape_string

我建议您使用“安全变量”,在我看来更为简单。

$unsafe_variable = $login;
$safe_variable = mysqli_real_escape_string($unsafe_variable);

$stm=mysqli_query($db,"SELECT post_amount FROM users WHERE login='" . $safe_variable . "'");
$stmone=mysqli_fetch_assoc($stm);
$stmtwo=implode($stmone);
echo($stmtwo);