Почему необходимо сохранить созданный объект PDO в следующую переменную? - PullRequest
0 голосов
/ 14 декабря 2018

Почему необходимо сохранять созданный объект PDO в следующую переменную?Почему, когда у меня есть

$db = new PDO;
$stmt = $db->Prepare("...");

, я должен сохранить $db в $stmt, чтобы получить доступ к некоторым методам $db и другим методам, которые я могу вызвать напрямую из $db.Например, $db->prepare(); $db->bindParam(); не работает, но $stmt=$db->prepare(); $stmt->bindParam(); работает.Почему это так?

Ответы [ 3 ]

0 голосов
/ 14 декабря 2018

Может быть, вы имеете в виду, почему бы нам просто не написать, например, $db->prepare(...) вместо $stmt = $db->prepare, я напишу эти строки кода

$db = new PDO(....);
$stmt = $db->query('SELECT * FROM table');

Затем, затем мы можем написать это

if($stmt->rowCount() == 1) {
    while($data = $stmt->fetch(PDO::FETCH_ASSOC))) {
         // statements
    }
}

Вместо

if($db->query('SELECT * FROM table')->rowCount()) {
    while($data = $db->query('SELECT * FROM table')->fetch(PDO::FETCH_ASSOC)) {
        // statements
    }
}

Надеюсь, вы понимаете, вам не нужно хранить $db на $stmt каждый раз, это зависит от того, как вы пишете.

0 голосов
/ 14 декабря 2018

Это просто потому, что $db и $stmt - это разные типы объектов.$db является объектом соединения PDO , представляющим соединение с базой данных, а $stmt является объектом оператора PDO , представляющим конкретный подготовленный запрос (или «оператор»).

Когда вы пишете $stmt = $db->prepare("...");, вы не «сохраняете $ db в $ stmt» (как вы это описали), это не то, что здесь происходит.Происходит то, что вы выполняете метод с именем prepare () , который доступен в объекте соединения.Это подготовит ваш SQL к выполнению и поместит его в объект Statement, который затем вернет вам.Это то, что заканчивается в переменной $stmt.

Затем, чтобы связать параметры и выполнить запрос, методы для этого являются частью объекта Statement (и это логично, потому что вы выполняете оператор - вы не выполняете соединение).$db->bindParam(); не работает, потому что в объекте Connection такого метода нет, и не должно быть - вы напрямую связываете параметры с оператором.

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

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

0 голосов
/ 14 декабря 2018

То, что делает этот код, готовит оператор SQL, эффективно преобразовывая его из строкового значения в PHP в функциональный оператор в вашем PDO (подготовленный объект данных, он же соединение с базой данных).Когда вы вызываете функцию prepare для PDO , вы передаете оператор SQL, а взамен вы получаете PDOStatement . Оператор PDO - это функция баз данных , которая позволяет параметризовать оператор, что, в свою очередь, обеспечивает несколько преимуществ, таких как:

  1. Позволяет вам повторно использовать оператор без RDMSнеобходимость перекомпилировать
  2. Избегать SQL-инъекцию и, следовательно, сделать ваше приложение более безопасным

Как правило, когда у вас есть подготовленный оператор (ваша переменная $stmt),вы продолжаете в своем коде:

  1. Связать значения параметров, если у него есть параметры
  2. Выполнить оператор
  3. Получить информацию о выполненном операторе, например строкуcount или набор данных, сгенерированный оператором

Короче говоря, вы сохраняете не значение $db в $stmt, а оператор PDO, сгенерированный prepare() звонок.

...