Когда я запускаю этот запрос с PDO в mysql db, он возвращает неправильные типы данных.
<?php $parameters = array(":1",92323); $query = " SELECT s.Site_ID,s.Site_Url,s.Site_Name, s.Site_Approved, s.Site_Status, s.Thumbnailed ,st.Description AS Site_Status_Desc FROM Sites s LEFT JOIN Sites_Status st ON st.Status_ID = s.Site_Status WHERE s.Account_ID = :1"; try { $this->DBH = new PDO("mysql:host={$host};dbname={$db}", $user, $pass, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); $this->stmt = $this->DBH->prepare($query); if(count($parameters)>0) { foreach ($parameters as $key => $var) { switch ($var) { case is_int( $var ): $this->stmt->bindValue($key,$var, PDO::PARAM_INT); break; case is_bool( $var ): $this->stmt->bindValue($key,$var, PDO::PARAM_BOOL); break; case is_null( $var ): $this->stmt->bindValue($key,$var, PDO::PARAM_NULL); break; default: $this->stmt->bindValue($key,$var, PDO::PARAM_STR); break; } } } if($this->stmt->execute()) { // Set how many rows the query resulted in $this->num_rows = $this->stmt->rowCount(); return $this->stmt->fetchObject(); } else { return false; } } catch (PDOException $e) { $this->error_handler($e); }
Все строки становятся строками как типы данных, кроме поля BIT, он становится чем-то другим …
public 'Site_Approved' => string ' ' (length=1)
Есть ли динамический способ заставить PDO возвращать правильные типы данных?
Вы используете бит (1) для представления логического значения ( TRUE
/ FALSE
).
Клиент базы данных отображает битовые поля (которые могут быть больше одного бита) на строки, в которых один символ представляет октет.
Вы можете использовать поле бит (1) как строку PHP через функцию ord()
поскольку оно обрабатывает строку как один октет:
if (ord($Site_Approved)) { ... }
Вы не можете использовать $Site_Approved
напрямую, потому что это строка, и она всегда будет оценивать TRUE
независимо от того, установлен ли первый бит или нет.
Кроме того, вы можете присвоить значение базы данных в запросе SQL уже десятичному значению, которое может быть тем, что вы ищете:
s.Site_Approved+0 AS Site_Approved
Десятичные значения в диапазоне от 0 до 1 ведут себя очень похоже на булевы PHP (они просто не разделяют тип, остальное одно и то же).