Прежде всего, я знаю, что на SO есть разные подобные вопросы, такие как это и это . Однако, когда я извлекаю значения из таблицы, целые числа всегда выбираются как строка.
Я использую PHP5.4 (5.4.16-1 ~ dotdeb.1) и MYSQL5.5 (5.5.31 + dfsg-0 + wheezy1). Здесь написано, что MySQL Native Driver включен по умолчанию в PHP5.4.0. Но я все равно получаю строковые значения.
Я инициализирую объект PDO следующим образом.
try { $dsn = 'mysql:host=' . DB_HOST . ';dbname=' . DB_NAME . ';charset=utf8'; $db = new PDO($dsn,DB_USER,DB_PASS); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); } catch (PDOException $e) { header('HTTP/1.1 500'); exit; } catch (Exception $e) { header('HTTP/1.1 500'); exit; }
Когда я вставляю, я пытался использовать формат execute(array(...))
, а также использовал bindValue(...,PDO::PARAM_INT)
, но они не bindValue(...,PDO::PARAM_INT)
ситуацию.
Например, вот как я вставляю новую строку.
public function insertList ($db,$account_id,$list_name) { $sql = $db->prepare('INSERT INTO lists VALUES (?,?,?,?,?)'); try { // $sql->execute(array($list_name,0,0,0,$account_id)); $sql->bindValue(1,$list_name,PDO::PARAM_STR); $sql->bindValue(2,0,PDO::PARAM_INT); $sql->bindValue(3,0,PDO::PARAM_INT); $sql->bindValue(4,0,PDO::PARAM_INT); $sql->bindValue(5,$account_id,PDO::PARAM_INT); $sql->execute(); } catch (PDOException $e) { header('HTTP/1.1 500'); exit; } catch (Exception $e) { header('HTTP/1.1 500'); exit; } }
Вот как я беру строки из таблицы
public function fetchLists ($db,$account_id) { $sql = $db->prepare('SELECT * FROM lists WHERE account_id=?'); try { $sql->execute(array($account_id)); $result = $sql->fetchAll(PDO::FETCH_ASSOC); } catch (PDOException $e) { header('HTTP/1.1 500'); exit; } catch (Exception $e) { header('HTTP/1.1 500'); exit; } return $result; }
Этого не произошло, когда я тестировал XAMPP для Linux 1.8.1, который использует PHP5.4.7. В настоящее время я использую nginx вместо Apache.
Что не так?
Чтобы получить целые числа и поплавки с соответствующими типами из mysql с PDO, вам необходимо отключить как PDO-mysql, так и режим эмуляции mysqlnd.