Почему ошибка в выводе? Number of variables doesn't match number of parameters in prepared statement

Почему вылазит Warning: mysqli_stmt_bind_param(): Number of variables doesn't match number of parameters in prepared statement in...?

$idGoods = $_POST['add_id'];
$idCookie = $_POST['id_cookie'];

function getGoodsCartModal($p1) {
    global $mysqli;
    $sql = mysqli_prepare($mysqli, "SELECT * FROM cart WHERE idGoods = '$p1'");
    mysqli_stmt_bind_param($sql, 's', $p1);
    mysqli_stmt_execute($sql);
    $result = mysqli_stmt_get_result($sql);
    $a = mysqli_fetch_assoc($result);
    return $a;
    mysqli_stmt_close($sql);
}
$getGoodsCartModal = getGoodsCartModal($idGoods);

if(isset($_POST['add_id'])){
    echo $getGoodsCartModal['idCookie'];
}

Ругается на строку 18, где mysqli_stmt_bind_param($sql, 's', $p1);


Ответы (2 шт):

Автор решения: vp_arth
$sql = mysqli_prepare($mysqli, 'SELECT * FROM cart WHERE idGoods = ?');

Раз вы используете prepared statements (mysqli_stmt_bind_param), не нужно добавлять в запрос инъекцию.


return $a;
mysqli_stmt_close($sql); // Недостижимый код, строку нужно либо удалить, либо перести выше return
→ Ссылка
Автор решения: Ипатьев

Продолжим урок английского, начатый коллегой aleksandr barakin

  • number значит номер, количество
  • variable означает переменная
  • doesn't match означает не совпадает
  • number означает номер, количество
  • parameter означает параметр, знак подстановки
  • prepared statement означает подготовленный запрос

то есть текст ошибки, в переводе с английского, означает, что количество переменных, которые мы привязаваем к запросу в функции bind_param, не соответствует количеству параметров (знаков вопроса) в запросе.

Идем в код и считаем:
количество переменных в bind_param: 1 (одна) штука
количество параметров: 0 (ноль) штук

Для решения проблемы необходимо привести количество параметров (знаков вопроса) в запросе соответствие с количеством переменных функции bind_param. т.е. добавить в запрос параметр (знак вопроса) в количестве 1 (одна) штука. Удалив при этом из запроса переменную. Поскольку суть подготовленных запросов и состоит в том, чтобы заменять переменные на параметры.

В целом, проблема показывает преимущество грамотности (т.е. умения читать) и знания иностранных языков перед неграмотностью (т.е. неумением читать) и незнанием иностранных языков в объеме слов number, variable и parameter.

→ Ссылка