mysqli_stmt_bind_result():绑定变量数与预准备语句中的字段数不匹配

时间:2017-07-06 07:33:00

标签: php mysqli

/购物车表有4个字段; id,用户名,产品ID,图片。我正在尝试显示表格中的所有数据。

<?php

$query = "SELECT * FROM cart WHERE user_name='$username'";

if ($stmt = mysqli_prepare($mysqli, $query)) {

    /* execute statement */
    mysqli_stmt_execute($stmt);

    /* bind result variables */
    mysqli_stmt_bind_result($stmt,$username);

    /* fetch values */
    while ($row=mysqli_stmt_fetch($stmt)) 

{

2 个答案:

答案 0 :(得分:0)

我认为您对mysqli_stmt_bind_result()的来电不正确。我推荐两件事:

  1. 在SQL语句的文本中枚举您的列
  2. 为您指定的每个列传递一个PHP变量。
  3. 编写mysqli_stmt_bind_result()的方式,代码仅在表有一列user_name时才有效。

答案 1 :(得分:0)

据我所知,这里有两个问题

  1. 您没有绑定输入 - 这是预备语句的重点。您需要mysqli_stmt_bind_param()。直接在查询中注入变量并不安全,这也是我们准备查询的原因。
  2. 您未使用mysqli_stmt_bind_result()绑定所选列的确切数量。这需要是您选择的确切列数。
  3. 要使其工作,您需要在查询中使用占位符?而不是变量(并使用mysqli_stmt_bind_param())。您还应该选择特定列,而不是SELECT *。如果你执行SELECT *,如果仍然绑定相同数量的结果,仍然可以使其工作 - 但如果稍后添加一列,代码将会中断。

    以下代码已更改为选择特定列,并将其与mysqli_stmt_bind_result()中绑定(列)的结果相匹配。添加了查询中的占位符,并实现了mysqli_stmt_bind_param()的使用。

    $query = "SELECT id, user_name, produc_id, image FROM cart WHERE user_name=?";
    
    if ($stmt = mysqli_prepare($mysqli, $query)) {
    
        mysqli_stmt_bind_param("s", $username);
    
        /* execute statement */
        mysqli_stmt_execute($stmt);
    
        /* bind result variables */
        mysqli_stmt_bind_result($stmt, $user_id, $username, $product_id, $image);
    
        /* fetch values */
        while ($row=mysqli_stmt_fetch($stmt)) {
            // Fetch here
        }
    }