PHP класс ПДО с несколькими выберите эффективностью и скоростью


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

Класс включает в себя конструкт, который создает подключение к базе данных и две другие функции, которые получают данные из базы данных и возвращать некоторые значения concated с HTML.

Это сделано из кода, который я нашел в интернете в основном так, поэтому было бы хорошо, если бы предложения были понятны для начинающего.

Могут быть произведены улучшения в этом так, что это эффективный и передовой практики включены?

<?php
class MyClass {
protected $PDO;

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

public function getCount($sq,$bkid,$bkname) {
    $sth = $this->PDO->prepare("SELECT COUNT(sentence) AS b FROM sentence, chapters, books WHERE MATCH(sentence) AGAINST (:q IN BOOLEAN MODE) AND chapters.book_Id = books.book_Id AND sentence.chapter_Id = chapters.chapter_Id AND books.book_Id = :bk");
    $sth->execute(array(':q' => $sq, ':bk' => $bkid));
    $row = $sth->fetch(PDO::FETCH_ASSOC);
    $total = $row['b'];
    if($total!=0)
    {
    $ensq = urlencode($sq);
    $count = "<a href='filter.php?id=$bkid&amp;q=$ensq'>$bkname</a><sup>$total</sup> ";
    return $count;
    }
    else
    {
    return;
    }
}

public function getwriter($sqn) {
    $nsth = $this->PDO->prepare("SELECT COUNT(DISTINCT(writer)) AS n FROM sentence WHERE MATCH(writer) AGAINST (:q IN BOOLEAN MODE)");
    $nsth->execute(array(':q' => $sqn));
    $nrow = $nsth->fetch(PDO::FETCH_ASSOC);
    $ntotal = $nrow['n'];
    if($ntotal!=0)
    {
    $nensq = urlencode($sqn);
    $ncount = "<a href='nsearch.php?q=$nensq'>writers</a><sup>$ntotal</sup> ";
    return $ncount;
    }
    else
    {
    return;
    }
}

public function getChapter($cqn) {
    $csth = $this->PDO->prepare("SELECT COUNT(chapter_Title) AS c FROM chapters WHERE MATCH (chapter_Title) AGAINST (:q IN BOOLEAN MODE)");
    $csth->execute(array(':q' => $cqn));
    $crow = $csth->fetch(PDO::FETCH_ASSOC);
    $ctotal = $crow['c'];
    if($ctotal!=0)
    {
    $censq = urlencode($cqn);
    $ccount = "<a href='csearch.php?q=$censq'>Chapters</a><sup>$ctotal</sup> ";
    return $ccount;
    }
    else
    {
    return;
    }
}
}
$dbh = new PDO('mysql:host=localhost;dbname=dbname;charset=utf8', 'db', 'pass');
?>

А также это ОК, чтобы вызвать функцию несколько раз рядом друг с другом вот так:

$t = new MyClass($dbh);
echo $t->getCount($search,11,"Book 1");
echo $t->getCount($search,4,"Book 2");
echo $t->getCount($search,39,"Book 3");
echo $t->getCount($search,56,"Book 4");
echo $t->getWriter($search);
echo $t->getChapter($search);
$dbh = null;


879
1
задан 27 января 2018 в 10:01 Источник Поделиться
Комментарии
1 ответ

Самое главное, что вы должны узнать о классах: каждая способ должна отвечать за одну задачу только. Значит, метод, который получает вас граф должен вернуть вам рассчитывать, а не некоторые HTML.

Два других незначительных улучшений, было бы лучше для SQL форматирование, так что любой может на самом деле читать его и приятно вспомогательную функцию, которая существует в PDO, fetchColumn():

Так что ваши методы должны быть как

public function getCount($sq,$bkid) {
$sql = "SELECT COUNT(sentence)
FROM sentence, chapters, books
WHERE MATCH(sentence) AGAINST (:q IN BOOLEAN MODE)
AND chapters.book_Id = books.book_Id
AND sentence.chapter_Id = chapters.chapter_Id
AND books.book_Id = :bk"
$sth = $this->PDO->prepare($sql);
$sth->execute(array(':q' => $sq, ':bk' => $bkid));
return $sth->fetchColumn();
}

В то время как для форматирования HTML должен быть другой метод/функция. Позвольте мне предложить вам что-то вроде этого:

function getLink($title, $count, $parameters)
{
if ($count)
{
$qs = http_build_query($parameters);
$title = htmlspecialchars($title);
return "<a href='filter.php?$qs'>$title</a><sup>$total</sup>\n";
}
}

он может быть использован такой:

$count = $t->getCount($search, 11);
echo getLink("Book 1", $count, ['id' => 11, 'q'=> $search]);

Здесь, Как видите, удобный http_build_query() будет заботиться о Кодирование ключей и значений.

2
ответ дан 28 января 2018 в 01:01 Источник Поделиться