Во многих местах нашего PHP-кода (работая с postgres, если это имеет значение) у нас есть такие вещи, как:
$q = "SELECT DISTINCT a.id FROM alarms.current a, entities e, installations i "; $q .= "WHERE i.\"entityId\"=e.id AND a.installationid=i.id AND "; $q .= "e.id=".$entityId; $stmt = $db->query($q); $stmt->bindColumn("id", $alarmId); if ($stmt->fetch(PDO::FETCH_ASSOC)) ....etc
Теперь, согласно моему чтению документов, если вы хотите, чтобы ваши переменные обновлялись со своих связанных столбцов, вы должны использовать PDO :: FETCH_BOUND. Но мы этого не делаем, и никто не жаловался на производительность, насколько мне известно.
Может ли кто-нибудь пролить свет на то, почему этот явно ошибочный код действительно работает?
Хотя в примере в документации PHP для bindColumn
используется PDO::FETCH_BOUND
, что позволяет предположить, что этот стиль выборки необходим для использования bindColumn
, он явно не указывает, что это требование. Он говорит только
PDOStatement :: bindColumn () упорядочивает привязку определенной переменной к данному столбцу в результирующем наборе из запроса. Каждый вызов PDOStatement :: fetch () или PDOStatement :: fetchAll () обновляет все переменные, привязанные к столбцам.
После некоторого тестирования я решил, что это произойдет независимо от используемого стиля выборки. Я думаю, что тот факт, что вызов fetch
в вашем коде фактически не загружается в переменную, просто означает, что ассоциативный массив создается и ничем не назначен, в то время как побочный эффект выборки заполняет переменную $alarmId
.
Продолжая из комментариев @ DontPanic, вот как я предпочитаю использовать связанные параметры:
/** * @param $id * * @return array|false */ public function retrieveImage($id) { $conn = $this->dbh->getInstance('LocalMSSQL'); $stmt = $conn->prepare("SELECT inputType, blob FROM images WHERE id = ?"); $stmt->bindValue(1, $id, PDO::PARAM_INT); $stmt->execute(); $resultSet = [ 'inputType' => null, 'blob' => null, ]; $stmt->bindColumn(1, $resultSet['inputType'], PDO::PARAM_STR); $stmt->bindColumn(2, $resultSet['blob'], PDO::PARAM_LOB, 0, PDO::SQLSRV_ENCODING_BINARY); if ($stmt->fetch()) { return $resultSet; } else { return false; } }