@t32

ООП в php — не понимаю объекты, неправильно передаю ссылки?

сначала была просто функция и все работало, переделываю на ООП -Cделала класс CProducts, не понимаю в чем ошибка. пишет Parse error: syntax error, unexpected '$link' (T_VARIABLE), expecting function (T_FUNCTION) or const (T_CONST) - значит я как то неправильно передаю ссылку на $link; и $lim;
class CProducts {     
    $link;
    $lim;
   function getArray($link, $lim){
    $this->link = $link;
    $this->lim = $lim;
    $query = "SELECT * FROM products ORDER BY DATE_CREATE DESC LIMIT $lim";
    $result = mysqli_query($link, $query) or die(mysqli_error($link));
    return $result;
    }}
    
    $result=new CProducts($link, 3);
  • Вопрос задан
  • 238 просмотров
Пригласить эксперта
Ответы на вопрос 3
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
Здесь неправильно не то что всё, а даже больше.
Потому что ёще до того как вы взялись писать этот "класс", не выучив даже базовый ООП синтаксис, код вашей "функции" уже был очень плохой.

Я сейчас напишу минимально приемлемый вариант, но повторять его не надо. Потому что всё равно непонятно будет.
Надо забыть временно про классы и учить базовый синтаксис РНР. Просто потому что сначала надо выучить базовые понятия - работу с БД, обработку ошибок, разделение ответственности:
- работа с переменными в запросе ведётся через параметризованные запросы
- код класса не должно тошнить прямо на экран сообщениями об ошибках
- метод getArray не должен возвращать объект класса mysqli_result. он должен возвращать массив
- код, который будет в дальнейшем работать с результатом вызова метода getArray, не должен ничего знать про базу данных

Про сам же код ООП надо хотя бы один раз посмотреть его в учебнике, а не писать на основе чистой фантазии.
class CProducts
{
    private $link;
    public function __construct(mysqli $link) {
        $thi->link = $link;
    }
    public function getArray($lim) {
        $query = "SELECT * FROM products ORDER BY DATE_CREATE DESC LIMIT ?";
        $stmt = $this->link->prepare($query);
        $stmt->bind_param("s", $lim);
        $stmt->exeсute();
        $result = $stmt->get_result();
        return $result->fetch_all(MYSQLI_ASSOC);
    }
}
 
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli($host, $user, $pass, $dbname);
$db->set_charset('utf8mb4');
$db->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1);
  
$product = new CProducts($db);
$result = $product->getArray(3);
Ответ написан
Комментировать
toxa82
@toxa82
Ну так синтаксис классов изучите. Вы ж не правильно свойства объявляете.
Ответ написан
Комментировать
@Daskus
Вы не указали область видимости свойств private.
Так же немного обезопасил ваш код от SQL-инъекции.

Входные пользовательские данные всегда должны проверяться!

class CProducts
{
  private $link;
  private $lim;

  function getArray($link, $lim){
    $this->link = $link;
    $this->lim = intval($lim);
    $query = "SELECT * FROM products ORDER BY DATE_CREATE DESC LIMIT {$this->lim}";
    $result = mysqli_query($this->link, $query) or die(mysqli_error($this->link));
    return $result;
  }
}
   
$result = new CProducts($link, 3);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы