2013-04-25 2 views
0

В классе, у меня есть PDO:Это PDO оператор возвращает целое число вместо строки

$userFName = 'userFName'; 
include('dbconnect.php');  // Normally I'd store the db connect script outside of webroot 
$pdo = new PDO("mysql:host=$db_host;dbname=$db_name;", $db_user, $db_password); 
$stmt = $pdo->prepare('SELECT userFName FROM Users WHERE username = :uname AND password = :pword AND roleID = 1'); 
$stmt->bindParam(':uname', $this->user->username); 
$stmt->bindParam(':pword', $this->user->password); 
$stmt->bindColumn(4, $userFName, PDO::PARAM_STR); 
$stmt->execute(); 
$familiar = $stmt->fetch(PDO::FETCH_BOUND); 
$this->user->firstName = $familiar; 

Это возвращающегося идентификатор в первом столбце вместо содержимого VARCHAR в 4-м столбце. Любая идея почему?

+0

Как я вижу только 1 колонка в вашем результирующем Я удивлен, что вы получите _anything в all_? И разве вы не просто устанавливаете '$ this-> user-> firstName' в' true' (результат 'FETCH_BOUND') и видите, что как в 1 при нажатии на строку или int? – Wrikken

+0

Похоже, вы выбираете один столбец и привязываетесь к четвертому столбцу (несуществующий). Не должно быть '$ stmt-> bindColumn (1, $ userFName, PDO :: PARAM_STR);'? – showdev

+0

У меня был SELECT *, и он сделал то же самое. – mishmomo

ответ

1

При использовании PDO::FETCH_BOUND с fetch() метод не возвращает результат. Вместо этого значение столбца должно быть доступно в переменной, которую вы связали ранее с помощью $stmt->bindColumn().

Так изменить код:

$stmt->bindColumn(1, $userFName, PDO::PARAM_STR); 
$stmt->execute(); 
$stmt->fetch(PDO::FETCH_BOUND); 
$this->user->firstName = $userFName; // <-- use the bound variable 

Однако вам не нужно, что bindColumn() вызов. Вы можете упростить код следующим образом:

$stmt->execute(); 
$row = $stmt->fetch(); // uses PDO::FETCH_ASSOC by default 
$this->user->firstName = $row['FName']; 
+0

Выглядит круто, но должен быть столбцом 1, а не 4. В качестве альтернативы используйте имя столбца. – showdev

+0

Теперь я вижу, это была еще одна ошибка в коде вопроса. Вы заменили '4' на' 1'. Спасибо за указание на это! – hek2mgl

+0

Ahh! Ладно, спасибо, это сработало отлично! – mishmomo

0

Слишком много кода в вашем классе. И одна ошибка. Чтобы отправить отдельный запрос, чтобы получить только одно свойство из базы данных, создав отличное соединение для этого является мертвым излишеством. Связь должна быть удалена безоговорочно, и вы должны думать о получении ВСЕХ данных пользователя с помощью одного запроса.

Правильный код

function __construct($pdo) { 
    $this->pdo = $pdo; 
    // Normally you should include somewhere in a bootstrap file 
    // not in the application class 
    // and instantiate PDO in that bootstrap as well 
    // and only PASS already created instance to the class 
} 

function getUserFName() { 
    $sql = 'SELECT * FROM Users WHERE username = ? AND password = ? AND roleID = 1'; 
    $stmt = $pdo->prepare($sql); 
    $stmt->execute(array($this->user->username,$this->user->password)); 
    return $stmt->fetchColumn(); 
} 
+0

Вы прочитали вопрос? В чем преимущество вашего ответа? – hek2mgl

Смежные вопросы