Запрос PDO в классе

0

Вот мой класс:

class ProfileLink {

    function profileLink(PDO $pdo, $string, $i=0)
    {
        if ($i!=0) {
            $link = $string . '-' . $i;
        } else {
            $link = $string;
        }
        $req = $pdo->prepare('SELECT link FROM users WHERE link = ?');
        $req->execute(array($link));
        $nb = $req->rowCount();
        $req->closeCursor();
        if ($nb > 0) {
            $i++;
            return profileLink($pdo, $string, $i);
        } else {
            return $link;
        }
    }

}

Когда я вызываю функцию profileLink из класса, это не работает, но если я вызываю его вне класса, все в порядке. Возможно, это проблема с PDO, как вы думаете?

require_once ('lib/profileLink.class.php');
$profileLink = new ProfileLink();
$link = $profileLink->profileLink($pdo, $string);
Теги:
class
pdo

2 ответа

1
Лучший ответ

Я бы сохранил экземпляр PDO как свойство класса, чтобы его можно было легко получить в классе. Обратите внимание, что в моем примере используется немного другой синтаксис (современный PHP).

class ProfileLink {

    protected $pdo;

    public function __construct(PDO $pdo) {
        $this->pdo = $pdo;  
    }

    public function profileLink($string, $i=0)
    {
        if ($i!=0) {
            $link = $string . '-' . $i;
        } else {
            $link = $string;
        }
        $req = $this->pdo->prepare('SELECT link FROM users WHERE link = ?');
        $req->execute(array($link));
        $nb = $req->rowCount();
        $req->closeCursor();
        if ($nb > 0) {
            $i++;
            return profileLink($string, $i);
        } else {
            return $link;
        }
    }

}
$profileLink = new ProfileLink($pdo);
  • 0
    Спасибо, Дэйв, то, как вы хранили PDO, в моем случае идеально!
  • 0
    Вы также можете создать оболочку вокруг PDO. Хорошим примером будет ExtendedPDO через Aura \ SQL. Ссылка здесь.
0

2 вещи:

Вот

 return profileLink($pdo, $string, $i);

вам не хватает $this, потому что это не регулярная функция, а метод класса:

 return $this->profileLink($pdo, $string, $i);

И, во-вторых, ваш метод имеет то же имя, что и класс (кроме первой заглавной буквы) и, следовательно, интерпретируется как конструктор. Я только что испытал это:

class Test {
    function test() {
        echo "test";
    }
}
$t = new Test();

И он выводит "test".

Поэтому вы должны переименовать свой метод в getLink или что-то подобное.

  • 0
    Спасибо за ваши замечания, Марио, я постараюсь следовать этим правилам. Но profileLink ($ pdo, $ string, $ i); или $ this-> profileLink ($ pdo, $ string, $ i); возвращает тот же результат для меня.
  • 0
    В самом деле? Я получаю фатальную ошибку. Я предполагаю, что ваш код никогда не достигает вызова функции.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню