2012-12-19 2 views
0

Использование PHP 5.3.3 и Drupal 7.17 Я создал короткий пользовательский PHP-скрипт, в котором я бы назвал функцию Drupal - который, в свою очередь, ожидает, что объект, имеющий pass свойство:Передача массива() вместо объекта дает: Попытка получить свойство не-объекта

function user_check_password($password, $account) { 
    if (substr($account->pass, 0, 2) == 'U$') { 
    $stored_hash = substr($account->pass, 1); 
    $password = md5($password); 
    } 
    ..... 
} 

Так что в моем сценарии я пытаюсь создать такой объект «на лету»:

<?php 

require_once('/path/to/drupal/includes/password.inc'); 
........ 
$sth = $db->prepare(SQL); 
$sth->execute(array($username)); 
if ($row = $sth->fetch(PDO::FETCH_ASSOC)) { 
     if (user_check_password($password, array('pass' => $row['pass']))) { 
       header('Content-Type: application/json; charset=utf-8'); 
       print json_encode($row); 
     } 
} 

Однако это дает мне ошибку: Trying to get property of non-object

Что, вероятно, означает: PHP не принимает мой массив, он хочет там объект.

Как я могу создать анонимный объект «на лету», чтобы сделать его счастливым?

+1

Изменения '$ счет Оsta.ee-> pass' в' $ счета [ «проход»] '. Это способ доступа к ключу массива. –

+0

Плохое предложение, потому что я не хочу изменять файл 'include/password.inc' файла Drupal. Я просто хочу использовать эту функцию из моего маленького скрипта. –

ответ

5

Вы получаете сообщение об ошибке, потому что Array не является Object. Если вы не хотите, чтобы вручную создать объект (например, в ответе по @adityamenon), то вы можете просто отдать свой массив объект:

user_check_password($password, (object)array('pass' => $row['pass'])) 
3

Чтобы создать новые анонимные объекты, используйте stdClass.

$new_object = new stdClass;

В коде:

<?php 

require_once('/path/to/drupal/includes/password.inc'); 
........ 
$sth = $db->prepare(SQL); 
$sth->execute(array($username)); 
if ($row = $sth->fetch(PDO::FETCH_ASSOC)) { 
$new_object = new stdClass; 
$new_object->pass = $row['pass']; 
     if (user_check_password($password, $new_object)) { 
       header('Content-Type: application/json; charset=utf-8'); 
       print json_encode($row); 
     } 
} 
+0

Спасибо, есть способ передать его функции в той же строке? Что-л. например 'user_check_password ($ password, ... create obj here ...)' –

+1

Я обновил свой ответ с помощью примера кода ванильного типа, но вы можете посмотреть [анонимные функции] (http://php.net/manual/ en/functions.anonymous.php) в PHP, если вы хотите быть классным;) –

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