2011-01-25 18 views
37

Gần đây tôi đã di cư mô-đun của tôi để Drupal7 (trên PHP Version 5.3.1) và bây giờ tôi nhận được lỗi sau đây:array_flip(): Chỉ có thể lật giá trị STRING và INTEGER! trong DrupalDefaultEntityController-> load()

* 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). 

Tôi cũng đã cố gắng nâng cấp các module khác và cốt lõi để các phiên bản mới nhất như đã đề cập ở đây http://drupal.org/node/1022736

pháp nhân 7.x-1.x-dev (2011-Jan-24), lượt xem 7.x-3.x-dev (2011-Jan-22), lõi Drupal 7.x-dev (2011-Jan-24), profile2 7.x-1.0-beta1, tài liệu tham khảo 7.x-2.x-dev (2011-Jan-14), ctools 7.x-1.0- alpha2

Tôi không thể tìm ra chính xác nguyên nhân gây ra lỗi này là gì?

Edit:

Theo http://php.net/manual/en/function.array-flip.php,

array_flip() trả về một mảng theo thứ tự lật, ví dụ: các phím từ xuyên trở thành giá trị và giá trị từ khóa xuyên trở thành.

Lưu ý rằng giá trị của trans cần phải là khóa hợp lệ, tức là chúng cần phải là số nguyên hoặc chuỗi. Cảnh báo sẽ được phát ra nếu giá trị có loại sai và cặp khóa/giá trị được đề cập sẽ không bị lật .

Tôi đã làm các var_dump($ids); trước dòng 178 trong entity.inc ($passed_ids = !empty($ids) ? array_flip($ids) : FALSE;)

Và có vẻ với tôi rằng cặp khóa/giá trị luôn luôn là ở định dạng chính xác (?).

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) 
+0

Bạn có di chuyển mô-đun hoặc trang web của mình sang drupal 7 không? nếu nó là một mô-đun tùy chỉnh ở đâu là mã? Ngoài ra, bạn nên thử tắt các mô-đun cho đến khi các cảnh báo biến mất để thu hẹp hơn nữa. Một cái gì đó là đưa ra các thông số sai. –

+0

Có, tôi đã di chuyển mô-đun của mình sang Drupal 7. Nhưng lỗi nằm trong tệp entity.inc là tệp lõi của Drupal 7. –

+1

Về đầu ra var_dump ở trên: Không, trong cặp khóa/giá trị là * not * in định dạng đúng. Hàm array_flip có thể lật một mảng như 'mảng (0 => 'a')', nhưng không phải 'mảng (0 => mảng (0 => 'a'))' vì mảng lồng nhau sẽ phải trở thành khóa mảng . – marcvangend

Trả lời

85

Nguyên nhân phổ biến nhất của lỗi này là sử dụng hàm something_load() với một mảng làm đối số. Điều này không được hỗ trợ nữa vì các hàm load_multiple() cần được sử dụng cho điều này ngay bây giờ.

Ví dụ trong 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); 
?> 

Vì vậy, cách dễ nhất để bắt này là để tìm kiếm "_load (mảng"

+0

Cảm ơn bạn rất nhiều. Đó là vấn đề. Tôi đã làm $ node = node_load (mảng ('nid' => $ node-> nid)); và $ thisUser = user_load (mảng ('uid' => $ service-> uid)) ở nhiều nơi. Cũng cảm ơn cho tip để làm tìm kiếm nhanh chóng bằng cách sử dụng "_load (mảng" .Đó là rực rỡ! –

+0

Cảm ơn .Tôi đã tìm thấy exampels sử dụng như vậy ngay cả trong lõi: form.inc, mô-đun kích hoạt.Ngoài ra các mô-đun cộng đồng "pathauto" & " page_title "vẫn sử dụng cú pháp cũ –

+2

hoặc nếu bạn cố gắng chuyển giá trị null/false vào các hàm tải ví dụ: $ nid = null; node_load ($ null); –

0

Bạn đang sử dụng mô-đun chèn? Xem http://drupal.org/node/850946.

Khi nói đến các lỗi cụ thể như thế này, tôi nghĩ bạn nên tìm kiếm hàng đợi vấn đề ở số drupal.org hơn yêu cầu trên SO.

+0

Có lẽ bạn đã đúng. Tôi cần phải xem xét tốt hơn về hàng đợi vấn đề tại Drupal.org. Tôi chỉ hy vọng rằng nếu tôi có thể nhận được một số gợi ý về array_flip() và cách không sử dụng nó. –

+0

No. Tôi đã không sử dụng Insert Module. Chỉ các mô-đun mà tôi đã đề cập ở trên. –

10

Tôi chạy vào cùng một lỗi array_flip vào cuối tuần, cố gắng nâng cấp một mô-đun tùy chỉnh lên Drupal 7. Vấn đề là một mảng lồng nhau được chuyển vào DrupalDefaultEntityController, nhưng nó mong đợi một mảng đơn nguyên hoặc chuỗi. Trong trường hợp của tôi, tôi đã chuyển một mảng lồng vào EntityFieldQuery, khi nó chỉ muốn một mảng các số nguyên.

Để theo dõi tốt hơn xuống mã được gọi DrupalDefaultEntityController, thử chèn sau đây trước khi dòng 178 trong entity.inc:

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

... hoặc tốt hơn, cài đặt các module Devel và thử chèn sau thay vì :

dpm(debug_backtrace()); 
-3

Đây là giải pháp đơn giản :)

Sửa settings.php tập tin và thêm dòng này

error_reporting(0); 
+3

1) Không hack lõi. 2) Không làm điều này. Tắt báo cáo lỗi trên * trang web sản xuất * chỉ sau khi phát triển xong và thực hiện đúng cách - thông qua giao diện người dùng của Drupal. –

+0

Những gì Adam nói, hoặc người nào khác viết mô-đun của riêng bạn để làm điều đó trong mã, và chỉ cho phép mô-đun đó vào sản xuất. – rhodesjason

6

Vấn đề đi lên khi bạn đang sử dụng truy cập lĩnh vực nhóm hữu cơ (Organic Groups 7.x-1,3)

Bạn thường có thể vô hiệu hóa mà phụ mô-đun, trừ khi bạn làm điều khiển truy cập cấp cơ sở với OG.

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

+0

Đây là vấn đề của tôi - Tôi quản lý để theo dõi những gì đã được gửi vào và nó đã được rất nhiều mảng bao gồm mảng (0 => NULL) –

+0

Cố định nó cho tôi quá. – Hank

+0

Giống như tôi; hành vi kỳ lạ ... – jozi

-1

Cảm ơn bài nó làm việc cho tôi !, tôi đã gặp phải vấn đề này trong Drupal 7 kể từ thời gian dài và có thể fighure ra vấn đề. Dòng dưới cùng

"Không chuyển giá trị mảng vào mảng_flip cho bất kỳ loại thực thể nào, ví dụ: Nếu bạn đang cố tải và thực thể user_load() hoặc field_collection_item_load() để tải các mục thu thập trường, Chỉ truyền giá trị trong chuỗi thay vì bản thân mảng. "

Cảm ơn !!

0

Ví dụ về sử dụng tốt:

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

Đây có thể là vấn đề của mã xấu (ví dụ như tải các đối tượng không hợp lệ hoặc chạy một số cũ Drupal 6 mã trong Drupal 7):

  • Nếu bạn' có bất kỳ mô-đun tùy chỉnh nào, hãy kiểm tra kỹ mã của bạn để biết lỗi thường gặp
    • Sử dụng không hợp lệ entity_load(),
    • Truyền qua ar ray của các đối tượng được nạp để entity_load(),
    • Kiểm tra Entity APIExample module cung cấp một cách đúng đắn của việc sử dụng các thực thể trong Drupal 7.
  • Nếu bạn đang sử dụng mô-đun contrib, tìm ra lỗi ngay chống lại nó và áp dụng bản vá (nếu có) hoặc nâng cấp bản vá mới.

Gỡ rối:

  • Bạn có thể thử để đổ các vết lùi bằng cách gọi và in print_r(debug_backtrace()),
  • Sử dụng công cụ SCM của bạn để có được trở lại điểm mà nó đã làm việc tốt, và so sánh những thay đổi , vì vậy cuối cùng bạn sẽ tìm thấy vấn đề ở đâu (ví dụ: gitk, git log --patch, v.v.)
  • hãy sử dụng Coder Review mô-đun để tìm lỗi trong mã của bạn sau khi cập nhật (ví dụ: drush --contrib --no-empty --upgrade7x coder-review).
  • Cài đặt XDebug để theo dõi sự cố của bạn bằng nhật ký theo dõi hoặc gỡ lỗi từng bước.

Hoặc bạn có thể gỡ lỗi mã của bạn bằng cách xác định móc tạm thời sau:

/** 
* 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()); 
    } 
} 

Xóa cache trước khi thử nghiệm nó.

Nó sẽ in backtrace trên mỗi cảnh báo PHP hoặc lỗi với các đối số, vì vậy bạn có thể tìm thấy các thông số không hợp lệ của bạn được chuyển vào lõi Drupal.

Các vấn đề liên quan