mysqli_fetch_array()的问题期望参数1为mysqli_result

时间:2019-02-11 10:57:57

标签: php mysql mysqli

收到此错误,不知道是什么原因引起的。检查了此错误的其他答案,但无法使其正常工作。感谢您的帮助

<?php
session_start();

include ('includes/header.html');

if ( isset($_GET['id'])) $id = $_GET['id'];

  require ('../connect_db.php');
$q = "SELECT * 
    FROM books_for_sale 
    WHERE book_id = $id";
$r = mysqli_query($dbc, $q);
if (mysqli_num_rows($r) == 1 )
{$row = mysqli_fetch_array($r, MYSQLI_ASSOC);


if (isset($_SESSION['cart'][$id]))
{
    $_SESSION['cart'][$id]['quantity']++;
    echo '<p>Another' .$row["book_name"]. 'has been added</p>';
}
else
{
    $_SESSION['cart'][$id]=
    array ( 'quantity' => 1, 'price' => $row['item_price']);
    echo '<p>1 '.$row["item_name"]. 'has been added to your order</p>';
}


}

mysqli_close($dbc);
include('includes/footer.html');
?>

2 个答案:

答案 0 :(得分:0)

错误的原因是'$ id'不在单引号中。

此外,您将从表单/获取提交中获取值,并将其直接放入mysql查询中,而无需任何服务器端检查数据是否有效。这是非常不安全的,因为它会使攻击者将代码注入mysql查询。

您需要做的是使用“准备好的语句”,以便您可以预定义服务器端在mysql查询中可以使用哪种类型的值。这样,如果邪恶的表单值被提交,php将能够检测到它并返回错误。

答案 1 :(得分:0)

我认为您的选择查询已损坏。

我建议将您的超级全局($ _GET ['id'])转义为filter_input(INPUT_GET, 'id', FILTER_SANITIZE_SPECIAL_CHARS);。另外,您是否有$ id的默认值?这可能是它破裂的原因。

您的查询可能是

$q = "SELECT * FROM books_for_sale ".(isset($id) ? "WHERE book_id = ".(int)$id : "");