Форум успешных вебмастеров - GoFuckBiz.com

  Форум успешных вебмастеров - GoFuckBiz.com > Бизнес-решения > Скрипты, программы и технические решения
Дата
USD/RUB58.9280
BTC/USD0.0000
Скрипты, программы и технические решения Обсуждаем скрипты, программы и новые технологии.

Закрытая тема
Опции темы Опции просмотра
Старый 24.10.2012, 10:25   #1
the4gamblers
__٩(̾●̮̮̃̾•̃̾)۶__
 
Регистрация: 30.05.2010
Сообщений: 257
Бабло: $95151
По умолчанию help c php

всем привет
сижу уже час туплю как исправить ошибку загуглился до немогу:

Код:
Warning: mb_strlen() expects parameter 1 to be string, array given in
кусок кода :
PHP код:
    $last_id 0;
    
$bad_ids  = array();
    while(
1) {
        
$list bonus_list(false" AND id>$last_id ORDER BY id ASC LIMIT 100" );
        if (empty(
$list))
            exit(
0);
        foreach(
$list as $bonus ) {
            
$last_id=$bonus['id'];
            echo 
$last_id.' mem:'.(intval(memory_get_usage()/1024/1024))."\n";
            
$bonus_str bonus_cache_serialize_get($bonus['id']);
            if ( 
mb_strlen($bonus_str) > 1024*1024*) {
                
$bad_ids[] = $bonus['id'];
            }
            else {
                
bonus_set_for_cache_update($bonus_id);
            }
        }
    }
    if ( 
$bad_ids ) {
        echo 
"Bad bonus ids:".var_export($bad_ids)."\n";
    }
    echo 
"Finish\n"
ошибка в коде судя по логам тут :

PHP код:
if ( mb_strlen($bonus_str) > 1024*1024*) { 
может костыль какой можно придумать или еще что нибуть
зы данные в базе в utf8
the4gamblers вне форума  
Старый 24.10.2012, 10:58   #2
pesdexx
sysadm
 
Аватар для pesdexx
 
Регистрация: 28.12.2007
Сообщений: 589
Бабло: $101521
По умолчанию

после $bonus_str = bonus_cache_serialize_get($bonus['id']);
пропиши print_r($bonus_str); - походу у тебя там массив(судя из ошибки) возввращает, а не строку.

bonus_cache_serialize_get -- что делает эта функция?
pesdexx вне форума  
Старый 24.10.2012, 16:38   #3
Gyrus
Member
 
Регистрация: 16.01.2008
Сообщений: 86
Бабло: $11570
По умолчанию

Текст ошибки - явно показывает в чем косяк. bonus_str - это массив. А нужна - строка.
И если данные в утф8, то это лучше явно указать в mb_strlen. Иначе значения могут быть не правильные.
т.е. mb_strlen($bonus_str,'UTF-8')
Ибо, по умолчанию, если не установлено mb_internal_encoding("UTF-8") - то, например mb_strlen('Хуй')=6 (в случае УТФ8), и mb_strlen('Хуй','UTF-8')=3.
Gyrus вне форума  
Старый 24.10.2012, 18:50   #4
the4gamblers
__٩(̾●̮̮̃̾•̃̾)۶__
 
Регистрация: 30.05.2010
Сообщений: 257
Бабло: $95151
ТС -->
автор темы ТС По умолчанию

Цитата:
Сообщение от pesdexx Посмотреть сообщение
bonus_cache_serialize_get -- что делает эта функция?
Сериальзует данные из нескольких таблиц в одну записть - в результате получается массив , чтобы хранить в базе всю инфу о бонусе в отдельной таблице, в примерно таком виде:
Цитата:
bonus = array(id=>5, ...., 'bonus_item_list' => array(), 'embedded_bonuses' => array of `bonus` )
'bonus_item_list' = array('id',...., 'restriction_list' => array of 'restriction' );
'restriction' = array('id', ...., 'restriction_item_list' => array of 'restriction_item')
'restriction_item' = array(id, ....)
при добовлении print_r($bonus_str); выдает результат такого вида :

Цитата:
[15] => Array
(
[id] => 27024
[bonus_id] => 7
[type] => FBFEED
[field] => 6
[value1] =>
[value2] =>
[flags] => 16
[gender] => 0
[kind] => 0
[drop_weight] => 0
[per_unit] => 0
[per_value] => 0
[restriction_list] => Array
(
)

Цитата:
mb_strlen($bonus_str,'UTF-8')
делал непомогло
the4gamblers вне форума  
Старый 24.10.2012, 19:04   #5
citrix
конверчу-хуеверчу
 
Аватар для citrix
 
Регистрация: 16.09.2009
Сообщений: 607
Бабло: $103170
По умолчанию

в mb_strlen передается массив, а она считает только строки. Если нужно узнать размер переменной можно взять разницу get_memory_usage до и после присваивания.
Да и судя по коду его благословил сам Кришна
__________________
Палят темы DP/BH/WF
Обсуждают SE/GFB/MT
citrix вне форума  
Старый 25.10.2012, 02:24   #6
Gyrus
Member
 
Регистрация: 16.01.2008
Сообщений: 86
Бабло: $11570
По умолчанию

Цитата:
Сообщение от the4gamblers Посмотреть сообщение
делал непомогло

Ясен пень не поможет. Потому что надо передавать строку, а не массив. )
тут уже в каждом коменте указано, что надо передавать строку.

mb_strlen(serialize($bonus_str),'UTF-8'); - а вот так сработает, и будет еще более по кришнаитски.

Но это будет все равно не то, что ты хочешь сделать. Потому, что в коде - действительно без кришны не обошлось.
Gyrus вне форума  
Старый 25.10.2012, 20:02   #7
the4gamblers
__٩(̾●̮̮̃̾•̃̾)۶__
 
Регистрация: 30.05.2010
Сообщений: 257
Бабло: $95151
ТС -->
автор темы ТС По умолчанию

Цитата:
Сообщение от Gyrus Посмотреть сообщение
Ясен пень не поможет. Потому что надо передавать строку, а не массив. )
тут уже в каждом коменте указано, что надо передавать строку.

mb_strlen(serialize($bonus_str),'UTF-8'); - а вот так сработает, и будет еще более по кришнаитски.

Но это будет все равно не то, что ты хочешь сделать. Потому, что в коде - действительно без кришны не обошлось.
проблемму решил, решение простое просто забил болт
the4gamblers вне форума  
Старый 25.10.2012, 20:23   #8
Strikelol
Senior Member
 
Регистрация: 31.03.2011
Сообщений: 3,056
Бабло: $632595
По умолчанию

Цитата:
Сообщение от the4gamblers Посмотреть сообщение
проблемму решил, решение простое просто забил болт
Не, ну серьезно, если ты сам это писал - то наверно должен понимать что массив - совокупность значений. Функция которая выдавала тебе еррор может обработать только одно. Значит выбери из массива то что хочешь обработать и передай в эту функцию.

я понимаю что в 3 ночи не до написания сплоитов, но можно и утром написать же
Strikelol вне форума