2013-04-02 2 views
1

Я хочу, чтобы проверить, если какой-то столбец указать пользователь держит значение выше 0.Невозможно использовать объект типа PDOStatement как массив

Проблема

При выполнении запроса, и затем выполнение это, Im получаю эту ошибку:

Fatal error: Cannot use object of type PDOStatement as array in C:\xampp\htdocs\recover\admin\create.php on line 40 

Мой код (запрос + выполнение):

if (isset($_SESSION['user'])) { 
     $admin = $CONNECT_TO_DATABASE->prepare("SELECT * FROM admin WHERE username = :username"); 
     $admin->bindValue(':username', $_SESSION['user']); 
     $admin->execute(); 

Линия ошибки (40):

if ($settings['create_admins'] > 0 || $admin['super_admin'] > 0) { 

Вопрос:

Почему я получаю эту ошибку? Как это исправить?

Я попытался сделать это:

$admin = $CONNECT_TO_DATABASE->prepare("SELECT * FROM admin WHERE username = :username"); 
$admin = $admin->bindValue(':username', $_SESSION['user']); 
$admin = $admin->execute(); 

и получить другую ошибку:

Fatal error: Call to a member function execute() on a non-object in C:\xampp\htdocs\recover\admin\create.php on line 38 

Спасибо!

EDIT: Мне нужен объект -> fetch, но я только что сделал это и избавился от ошибок. Но это не влияет? Я имею в виду, что я повторяю эту строку, и это дает мне нуль (ничего). Зачем?

$admin = $CONNECT_TO_DATABASE->prepare("SELECT * FROM admin WHERE username = ".$_SESSION['user'].""); 
$admin = $admin->fetch(); 
+0

Там вы много примеров в PHP инструкции о том, как извлекать строки с PDO. Абсолютно не нужно гадать. –

+0

Я думаю, что ошибка здесь $ admin = $ admin-> execute(); вам не нужно присваивать результат execute() переменной $ admin, просто вызовите execute() – jerjer

+0

Сделайте 'var_dump ($ admin)' после '$ admin = $ admin-> fetch();' и посмотрите выход. – Narek

ответ

3

От:

$admin = $CONNECT_TO_DATABASE->prepare("SELECT * FROM admin WHERE username = :username"); 
[...] 
if ($settings['create_admins'] > 0 || $admin['super_admin'] > 0) { 

$admin имеет тип PDOStatament, который является классом, а не массив. Поэтому вы не можете вызвать оператора [].

Кроме того, вы должны действительно не все дней назначить $admin в результате возврата каждого метода, потому что большинство методов PDOStatament «s возвращают булевы значения:

$admin = $CONNECT_TO_DATABASE->prepare("SELECT * FROM admin WHERE username = :username"); 
$admin->bindValue(':username', $_SESSION['user']); 
$admin->execute(); 

Чтобы получить super_admin столбец из admin таблицы следует добавить (после execute() заявления):

$result = $admin->fetch(PDO::FETCH_ASSOC); 

который заполнит (надеюсь, это зависит от того, что схема таблиц) $result['super_admin'].

+0

Что делать, если я использую запрос вместо подготовки? Я просто изменил его, и у меня возникла фатальная ошибка mysql, Fatal error: Uncaught exception «PDOException» с сообщением «SQLSTATE [42S22]: столбец не найден: 1054 Неизвестный столбец« jony »в« where clause »в C: \ xampp \ htdocs \ recover \ admin \ create.php: 36 Трассировка стека: # 0 C: \ xampp \ htdocs \ recover \ admin \ create.php (36): PDO-> query ('SELECT * FROM a ...') # 1 {main} брошен в C: \ xampp \ htdocs \ recover \ admin \ create.php в строке 36 –

+0

Я просто изменил ". $ _ SESSION ['user']." to '". $ _ SESSION [' user '].", и это сработало. –

+0

@downvoter ума, чтобы объяснить вниз голос? – Shoe

2

попробовать это:

$sql = "SELECT * FROM admin WHERE username = ?"; 
$stmt = $CONNECT_TO_DATABASE->prepare($sql); 
$stmt->execute(array($_SESSION['user'])); 
$admin = $stmt->fetch(); 
if($admin) { 
    //do something if query returns row(s) 
} 
+0

Что вы подразумеваете под if ($ admin)? Все, что я хочу сделать, - это получить данные из указанной строки пользователя. –

+0

Если администратор просто отпадает, если ваш запрос не возвращает какую-либо строку, так что $ admin [somefield] не вернет ошибку – jerjer

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