web-dev-qa-db-ja.com

array_flip():STRINGおよびINTEGER値のみを反転できます! DrupalDefaultEntityController-> load()

私は最近、モジュールをDrupal7に移行しました(PHPバージョン5.3.1))、現在、次のエラーが発生しています:

_    * Warning: array_flip() [function.array-flip]: Can only flip STRING and INTEGER values! in DrupalDefaultEntityController->load() (line 178 of C:\Users\akulkarni\Desktop\xampp\htdocs\servicecasting\includes\entity.inc).
    * Warning: array_flip() [function.array-flip]: Can only flip STRING and INTEGER values! in DrupalDefaultEntityController->load() (line 178 of C:\Users\akulkarni\Desktop\xampp\htdocs\servicecasting\includes\entity.inc).
    * Warning: array_flip() [function.array-flip]: Can only flip STRING and INTEGER values! in DrupalDefaultEntityController->load() (line 178 of C:\Users\akulkarni\Desktop\xampp\htdocs\servicecasting\includes\entity.inc).
    * Warning: array_flip() [function.array-flip]: Can only flip STRING and INTEGER values! in DrupalDefaultEntityController->cacheGet() (line 354 of C:\Users\akulkarni\Desktop\xampp\htdocs\servicecasting\includes\entity.inc).
    * Warning: array_flip() [function.array-flip]: Can only flip STRING and INTEGER values! in DrupalDefaultEntityController->load() (line 178 of C:\Users\akulkarni\Desktop\xampp\htdocs\servicecasting\includes\entity.inc).
    * Warning: array_flip() [function.array-flip]: Can only flip STRING and INTEGER values! in DrupalDefaultEntityController->cacheGet() (line 354 of C:\Users\akulkarni\Desktop\xampp\htdocs\servicecasting\includes\entity.inc).
    * Warning: array_flip() [function.array-flip]: Can only flip STRING and INTEGER values! in DrupalDefaultEntityController->load() (line 178 of C:\Users\akulkarni\Desktop\xampp\htdocs\servicecasting\includes\entity.inc).
    * Warning: array_flip() [function.array-flip]: Can only flip STRING and INTEGER values! in DrupalDefaultEntityController->cacheGet() (line 354 of C:\Users\akulkarni\Desktop\xampp\htdocs\servicecasting\includes\entity.inc).
_

ここで述べたように、他のモジュールとコアを最新バージョンにアップグレードしようとしました http://drupal.org/node/1022736

エンティティ7.x-1.x-dev(2011-Jan-24)、ビュー7.x-3.x-dev(2011-Jan-22)、Drupal core 7.x -dev(2011-Jan-24)、profile2 7.x-1.0-beta1、参照7.x-2.x-dev(2011-Jan-14)、ctools 7.x-1.0-alpha2

このエラーの正確な原因を特定することはできませんか?

編集:

http://php.net/manual/en/function.array-flip.php によると、

array_flip()は、フリップ順で配列を返します。つまり、transのキーが値になり、transの値がキーになります。

Transの値は有効なキーである必要があります。つまり、整数または文字列である必要があります。値のタイプが間違っていると警告が発せられ、問題のキー/値のペアは反転されません。

Entity.incの178行の前にvar_dump($ids);を実行しました($passed_ids = !empty($ids) ? array_flip($ids) : FALSE;

そして、キーと値のペアは常に正しい形式(?)になっているように見えます。

_array
  0 => 
    array
      'nid' => string '6' (length=1)

array
  0 => 
    array
      'uid' => string '1' (length=1)

array
  0 => string '0' (length=1)

array
  0 => 
    array
      'nid' => string '7' (length=1)

array
  0 => 
    array
      'nid' => string '4' (length=1)

array
  0 => 
    array
      'nid' => string '8' (length=1)
_
38

このエラーの最も一般的な原因は、引数として配列を使用してsomething_load()関数を使用していることです。現在、load_multiple()関数を使用する必要があるため、これはサポートされなくなりました。

D6の例:

<?php
// Using array with the id was already discouraged in D6 but still worked.
$user = user_load(array('uid' => 1));
$user = user_load(array('name' => 'admin'));
?>

Drupal 7:

<?php
// Argument to a load() function *must* be a single id
$user = user_load(1);

// Querying for another attribute is a bit more complex.
// Note that using reset(user_load_multiple() directly is not E_STRICT compatible.
$users = user_load_multiple(array(), array('name' => 'admin'));
$user = reset($users);
?>

したがって、これらをキャッチする最も簡単な方法は、「_ load(array」を検索することです。

86
Berdir

私は週末に同じarray_flipエラーに遭遇し、カスタムモジュールをDrupal 7.にアップグレードしようとしました。整数または文字列:私の場合、整数の配列だけが必要な場合、EntityFieldQueryにネストされた配列を渡していました。

DrupalDefaultEntityControllerを呼び出しているコードをより適切に追跡するには、entity.incの178行目の前に次を挿入してみてください。

drupal_set_message(var_export(debug_backtrace(), TRUE));

...または、できれば Devel モジュールをインストールして、代わりに次を挿入してみてください:

dpm( debug_backtrace() );
10
Matt V.

この問題は、オーガニックグループのフィールドアクセス(オーガニックグループ7.x-1.3)を使用しているときに発生します

通常、OGでフィールドレベルのアクセス制御を行わない限り、そのサブモジュールを無効にできます。

http://drupal.org/node/1102570#comment-5626946

6

これは、エンティティIDの配列ではない配列を2番目の引数としてentity_loadを呼び出すときにも発生する可能性があります- http://api.drupal.org/api/drupal/includes--common.inc/を参照してくださいfunction/entity_load/7 および http://drupal.org/node/1160566 理由を理解します。

3
Evan Donovan

最新のpage_titleモジュールの使用で同様の問題を見ました。今のところ、モジュールを無効にして、エラーをクリーンアップしました。

参照: http://www.newblood.com/blog/2011/04/26/drupal-7-error-in-page-title-module/

1
Jeremy

これは、不適切なコーディングの問題である可能性があります(たとえば、無効なエンティティの読み込みや、古いDrupal 6のコードのDrupal 7)の実行:

  • カスタムモジュールをお持ちの場合は、よくある間違いがないかコードを再確認してください。
  • Contribモジュールを使用している場合は、適切なバグを見つけてパッチを適用し(利用可能な場合)、新しいパッチを作成します。

トラブルシューティング:

  • print_r(debug_backtrace())を呼び出して出力することにより、バックトレースをダンプすることができます。
  • Scmツールを使用して、正常に機能していたポイントに戻り、変更を比較して、最終的に問題の場所を見つけます(例:gitkgit log --patchなど)
  • Coder Review モジュールを使用して、更新後のコードのバグを見つけてください(例:drush --contrib --no-empty --upgrade7x coder-review)。
  • XDebug をインストールして、トレースログまたは段階的なデバッグによって問題を追跡します。

または、次の一時フックを定義してコードをデバッグできます。

/**
 * Implements hook_watchdog().
 */
function foo_watchdog($log_entry) {
  if ($log_entry['type'] == 'php' && $log_entry['severity'] <= WATCHDOG_WARNING) {
    // Old school
    var_dump(debug_backtrace()); // Optionally add: exit();

    // Devel: Log the backtrace into temporary file: drupal_debug.txt
    // Locate via: $ drush eval "echo file_directory_temp() . '/drupal_debug.txt'"
    function_exists('dd') && dd(debug_backtrace());
  }
}

テストする前にキャッシュをクリアします。

すべてのPHP警告または引数のエラーにバックトレースを出力するため、Drupalコアに渡された無効なパラメーターを見つけることができます。

0
kenorb

挿入モジュールを使用していますか? http://drupal.org/node/850946 を参照してください。

このような特定のエラーに関しては、SOに問い合わせるよりも drupal.org で課題キューを検索した方が良いと思います。

0
marcvangend

良い使用例:

<?php
$user=user_load(arg(1));
$username=$user->name;
print strtolower(preg_replace('/[^a-zA-Z0-9\-]/si' , '-' , $username));
?>
0
warmth

また、node_load_multiple($ nids)を介して複数のノードを誤ってロードしようとしたときに、$ nidsがノードIDの配列ではなかったときに、このメッセージを受け取りました。

たとえば、EntityFieldQueryの結果を使用し、node_load_multiple(array_keys($ result ['node']))の代わりにnode_load_multiple($ result ['node'])を呼び出します。

0
Enno