SQLSTATE[HY093]: Invalid parameter number: parameter was not defined помогите исправить ошибку

227
10 июля 2018, 05:40

делаю вывод товаров по категориям,но возникает ошибка

Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in C:\OpenServer\OSPanel\domains\diplom\Models\ProductModel.php on line 21 Буду рада,если поможете решить проблему новичку( если и сам вывод товаров не рабочий,то буду рада критике и советам) :) ProductController.php

class ProductModel extends Model
{

public function products($idcat){

$stmt=$this->db->prepare("SELECT id, name,price,description  FROM products WHERE category_id = ?");
$stmt->bindParam('i',$idcat);
$stmt ->execute();
$result = array();
$i=1;
while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    $result[$i]['id']=$row['id'];
    $result[$i]['name']=$row['name'];
    $result[$i]['description']=$row['descriprion'];
    $result[$i]['price']=$row['price'];
    $i++;
}
return $result;
}
}

ProductController.php

require_once (MODEL_PATH ."/CategoryModel.php");
class ProductController extends Controller
{
private $pageTpl = "/Views/templates/product.tpl.php";
public function __construct()
{
    $this->model=new ProductModel();
    $this->view= new View();
}
public function index(){
    $this->pageData['title']="О нас";
    $category=CategoryModel::Get_Category();
    $this->pageData['category'] = $category;
   $idcat=$category['id_category'] ;
    $this->pageData['products']=$this->model->products($idcat);
    $this->view->render($this->pageTpl,$this->pageData);
    }
}

и на всякий CategoryModel.php

class CategoryModel extends Model {

public  static function Get_Category (){
    $conn=DB::connToDB();
    $sql="SELECT id, name FROM categories";
    $result = array();
    $stmt= $conn->prepare($sql);
    $stmt ->execute();
    $i=1;
    while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        $result[$i]['id']=$row['id'];
        $result[$i]['name']=$row['name'];

        $i++;
    }
    return $result;
    }
}
Answer 1

Вы немного недочитали PDO, вы в запросе использовали плейсхолдер ?, а потом пытались биндить name parameter i которого у вас нет, если хотите через name parameter запрос должен быть такой:

$stmt=$this->db->prepare("SELECT id, name,price,description  FROM products WHERE category_id = :i");
$stmt->bindParam('i',$idcat);
$stmt ->execute();

Если же через плейсхолдер, то такой:

$stmt=$this->db->prepare("SELECT id, name,price,description  FROM products WHERE category_id = ?");
$stmt ->execute(array($idcat));
READ ALSO
End-2-end шифрование в web

End-2-end шифрование в web

Разбираюсь с шифрованием (end-2-end)Не могу понять где хранить ключи или ключ

186
Как удалить все медиафайлы wordpress?

Как удалить все медиафайлы wordpress?

Для плагина нужно сделать функцию очистки бдСделал удаление постов:

215
Отдача файла на загрузку с последующей переадресацией на другую страницу

Отдача файла на загрузку с последующей переадресацией на другую страницу

Подскажите пожалуйста реализовать функционал На сайте есть форма, после отправки формы, скрипт должен:

206